日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

Python实现 灰色关联分析 与结果可视化

發(fā)布時間:2025/3/21 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python实现 灰色关联分析 与结果可视化 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

之前在比賽的時候需要用Python實現(xiàn)灰色關(guān)聯(lián)分析,從網(wǎng)上搜了下只有實現(xiàn)兩個列之間的,于是我把它改寫成了直接像Pandas中的計算工具直接計算person系數(shù)那樣的形式,可以對整個矩陣進(jìn)行運算,并給出了可視化效果,效果請見實現(xiàn)

作者提醒:部分讀者反應(yīng)在某些情況下與MATLAB自帶灰色關(guān)聯(lián)分析結(jié)果有較大差距,目前作者尚未對此問題進(jìn)行檢驗,請謹(jǐn)慎使用

灰色關(guān)聯(lián)分析法

對于兩個系統(tǒng)之間的因素,其隨時間或不同對象而變化的關(guān)聯(lián)性大小的量度,稱為關(guān)聯(lián)度。在系統(tǒng)發(fā)展過程中,若兩個因素變化的趨勢具有一致性,即同步變化程度較高,即可謂二者關(guān)聯(lián)程度較高;反之,則較低。因此,灰色關(guān)聯(lián)分析方法,是根據(jù)因素之間發(fā)展趨勢的相似或相異程度,亦即“灰色關(guān)聯(lián)度”,作為衡量因素間關(guān)聯(lián)程度的一種方法。

簡介

灰色系統(tǒng)理論提出了對各子系統(tǒng)進(jìn)行灰色關(guān)聯(lián)度分析的概念,意圖透過一定的方法,去尋求系統(tǒng)中各子系統(tǒng)(或因素)之間的數(shù)值關(guān)系。因此,灰色關(guān)聯(lián)度分析對于一個系統(tǒng)發(fā)展變化態(tài)勢提供了量化的度量,非常適合動態(tài)歷程分析。

計算步驟

  • 確實參考數(shù)列與比較數(shù)列
  • 對參考數(shù)列與比較數(shù)列進(jìn)行無量綱化處理
  • 計算關(guān)聯(lián)系數(shù),求關(guān)聯(lián)度
  • 此處我給出的是第三步的實現(xiàn)方式,無量綱化請自己處理.數(shù)據(jù)使用UCI的紅酒質(zhì)量數(shù)據(jù)集.

    代碼實現(xiàn)

    源代碼可以前往 github下載

    下載數(shù)據(jù)

    import pandas as p import numpy as np from numpy import * import matplotlib.pyplot as plt %matplotlib inline# 從硬盤讀取數(shù)據(jù)進(jìn)入內(nèi)存 wine = pd.read_csv("/home/fonttian/Data/dataset/wine/wine.csv") wine.head()

    實現(xiàn)灰色關(guān)聯(lián)分析

    灰色關(guān)聯(lián)分析一共分為了三個部分,這樣比較容易大家隨意摘取部分內(nèi)容使用,
    第一個方法是無量綱化,我這里選擇的是(x-mean)/(max-min),你也可以替換成其他方法(據(jù)我個人了解,一般而言標(biāo)準(zhǔn)化不行)

    第二個部分是計算一個dataframe中單獨某一列灰色關(guān)聯(lián)分析度的方法,m代表參考列,可以任意選擇。2019-3-26在windows上,個人測試wine數(shù)據(jù)集上一次運算大概0.3s性能不高不低。不過由于部分代碼是numpy寫的性能確實也比純pandas快很多,我這篇文章下邊長期有一個灰色關(guān)聯(lián)分析Matlab與python灰色關(guān)聯(lián)分析,但是其為純pandas寫的,看起來很方便,不過運算時間約為本代碼的一倍,所以假如你想要單獨計算一列,個人還是更推薦我的代碼。但是如果你想要更快的性能,肯定還是自己寫numpy更好

    第三部分,是借助前兩個方法實現(xiàn)的計算矩陣,不過因為計算次數(shù)比較多,會比較慢,適合出圖。

    # 無量綱化 def dimensionlessProcessing(df):newDataFrame = pd.DataFrame(index=df.index)columns = df.columns.tolist()for c in columns:d = df[c]MAX = d.max()MIN = d.min()MEAN = d.mean()newDataFrame[c] = ((d - MEAN) / (MAX - MIN)).tolist()return newDataFramedef GRA_ONE(gray, m=0):# 讀取為df格式gray = dimensionlessProcessing(gray)# 標(biāo)準(zhǔn)化std = gray.iloc[:, m] # 為標(biāo)準(zhǔn)要素gray.drop(str(m),axis=1,inplace=True)ce = gray.iloc[:, 0:] # 為比較要素shape_n, shape_m = ce.shape[0], ce.shape[1] # 計算行列# 與標(biāo)準(zhǔn)要素比較,相減a = zeros([shape_m, shape_n])for i in range(shape_m):for j in range(shape_n):a[i, j] = abs(ce.iloc[j, i] - std[j])# 取出矩陣中最大值與最小值c, d = amax(a), amin(a)# 計算值result = zeros([shape_m, shape_n])for i in range(shape_m):for j in range(shape_n):result[i, j] = (d + 0.5 * c) / (a[i, j] + 0.5 * c)# 求均值,得到灰色關(guān)聯(lián)值,并返回result_list = [mean(result[i, :]) for i in range(shape_m)]result_list.insert(m,1)return pd.DataFrame(result_list)def GRA(DataFrame):df = DataFrame.copy()list_columns = [str(s) for s in range(len(df.columns)) if s not in [None]]df_local = pd.DataFrame(columns=list_columns)df.columns=list_columnsfor i in range(len(df.columns)):df_local.iloc[:, i] = GRA_ONE(df, m=i)[0]return df_local

    結(jié)果可視化

    該部分添加了三角形顯示的功能,注意如果你出現(xiàn)了圖形顯示不全(最后一行顯示一半的問題,是Matplotlib 的一個版本的問題,升級一下即可)。如果你想要顯示全部注釋熱圖方法中的mask參數(shù)即可,不過由于本矩陣為全float計算,會帶有舍入誤差,數(shù)據(jù)量大的時候差異可能會比較大。所以兩中方法各有利弊,請自行選擇。

    # 灰色關(guān)聯(lián)結(jié)果矩陣可視化 # 灰色關(guān)聯(lián)結(jié)果矩陣可視化 import seaborn as snsdef ShowGRAHeatMap(DataFrame):colormap = plt.cm.RdBuylabels = DataFrame.columns.values.tolist()f, ax = plt.subplots(figsize=(14, 14))ax.set_title('GRA HeatMap')# 設(shè)置展示一半,如果不需要注釋掉mask即可mask = np.zeros_like(DataFrame)mask[np.triu_indices_from(mask)] = Truewith sns.axes_style("white"):sns.heatmap(DataFrame,cmap="YlGnBu",annot=True,mask=mask,)plt.show()data_wine_gra = GRA(wine) ShowGRAHeatMap(data_wine_gra)

    新圖效果


    全圖效果

    一些資料

  • 原文鏈接:Python實現(xiàn) 灰色關(guān)聯(lián)分析 與結(jié)果可視化
  • 參考文章:百度百科 灰色關(guān)聯(lián)分析法
  • 參考文章:簡書 Python實現(xiàn)灰色關(guān)聯(lián)
  • 建議學(xué)習(xí):Maximal Information Coefficient (MIC)最大互信息系數(shù)詳解與實現(xiàn)
  • 額外說明

    本博客一開始也是我緊急寫的,而第二部分是為了出圖,因此整體代碼采用了pandas為主,混了部分numpy,但是由于pandas本身有問題,很多情況下,直接用pandas的dataframe代替numpy矩陣進(jìn)行矩陣性能會比循環(huán)低(測試版本ubuntu16.04,ubuntu18.04,測試數(shù)據(jù)0.5k-200k),而我當(dāng)時也沒什么時間寫全numpy矢量運算,所以最后就成為了現(xiàn)在這種代碼情況。而且該代碼已經(jīng)適合我個人目前的工作(大數(shù)據(jù)工程師)需要了,更大規(guī)模的數(shù)據(jù)我是用的spark或者pyspark,因此我短時間內(nèi)沒有更新numpy版本的需要,不過如果我更新了,也會第一時間發(fā)出來,并給出鏈接,這點請放心。

    除此之外,感謝博友piaoyang_的指正

    總結(jié)

    以上是生活随笔為你收集整理的Python实现 灰色关联分析 与结果可视化的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。