Python实现 灰色关联分析 与结果可视化
之前在比賽的時候需要用Python實現灰色關聯分析,從網上搜了下只有實現兩個列之間的,于是我把它改寫成了直接像Pandas中的計算工具直接計算person系數那樣的形式,可以對整個矩陣進行運算,并給出了可視化效果,效果請見實現
作者提醒:部分讀者反應在某些情況下與MATLAB自帶灰色關聯分析結果有較大差距,目前作者尚未對此問題進行檢驗,請謹慎使用
灰色關聯分析法
對于兩個系統之間的因素,其隨時間或不同對象而變化的關聯性大小的量度,稱為關聯度。在系統發展過程中,若兩個因素變化的趨勢具有一致性,即同步變化程度較高,即可謂二者關聯程度較高;反之,則較低。因此,灰色關聯分析方法,是根據因素之間發展趨勢的相似或相異程度,亦即“灰色關聯度”,作為衡量因素間關聯程度的一種方法。
簡介
灰色系統理論提出了對各子系統進行灰色關聯度分析的概念,意圖透過一定的方法,去尋求系統中各子系統(或因素)之間的數值關系。因此,灰色關聯度分析對于一個系統發展變化態勢提供了量化的度量,非常適合動態歷程分析。
計算步驟
此處我給出的是第三步的實現方式,無量綱化請自己處理.數據使用UCI的紅酒質量數據集.
代碼實現
源代碼可以前往 github下載
下載數據
import pandas as p import numpy as np from numpy import * import matplotlib.pyplot as plt %matplotlib inline# 從硬盤讀取數據進入內存 wine = pd.read_csv("/home/fonttian/Data/dataset/wine/wine.csv") wine.head()實現灰色關聯分析
灰色關聯分析一共分為了三個部分,這樣比較容易大家隨意摘取部分內容使用,
第一個方法是無量綱化,我這里選擇的是(x-mean)/(max-min),你也可以替換成其他方法(據我個人了解,一般而言標準化不行)
第二個部分是計算一個dataframe中單獨某一列灰色關聯分析度的方法,m代表參考列,可以任意選擇。2019-3-26在windows上,個人測試wine數據集上一次運算大概0.3s性能不高不低。不過由于部分代碼是numpy寫的性能確實也比純pandas快很多,我這篇文章下邊長期有一個灰色關聯分析Matlab與python灰色關聯分析,但是其為純pandas寫的,看起來很方便,不過運算時間約為本代碼的一倍,所以假如你想要單獨計算一列,個人還是更推薦我的代碼。但是如果你想要更快的性能,肯定還是自己寫numpy更好。
第三部分,是借助前兩個方法實現的計算矩陣,不過因為計算次數比較多,會比較慢,適合出圖。
# 無量綱化 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)# 標準化std = gray.iloc[:, m] # 為標準要素gray.drop(str(m),axis=1,inplace=True)ce = gray.iloc[:, 0:] # 為比較要素shape_n, shape_m = ce.shape[0], ce.shape[1] # 計算行列# 與標準要素比較,相減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)# 求均值,得到灰色關聯值,并返回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結果可視化
該部分添加了三角形顯示的功能,注意如果你出現了圖形顯示不全(最后一行顯示一半的問題,是Matplotlib 的一個版本的問題,升級一下即可)。如果你想要顯示全部注釋熱圖方法中的mask參數即可,不過由于本矩陣為全float計算,會帶有舍入誤差,數據量大的時候差異可能會比較大。所以兩中方法各有利弊,請自行選擇。
# 灰色關聯結果矩陣可視化 # 灰色關聯結果矩陣可視化 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')# 設置展示一半,如果不需要注釋掉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)新圖效果
全圖效果
一些資料
額外說明
本博客一開始也是我緊急寫的,而第二部分是為了出圖,因此整體代碼采用了pandas為主,混了部分numpy,但是由于pandas本身有問題,很多情況下,直接用pandas的dataframe代替numpy矩陣進行矩陣性能會比循環低(測試版本ubuntu16.04,ubuntu18.04,測試數據0.5k-200k),而我當時也沒什么時間寫全numpy矢量運算,所以最后就成為了現在這種代碼情況。而且該代碼已經適合我個人目前的工作(大數據工程師)需要了,更大規模的數據我是用的spark或者pyspark,因此我短時間內沒有更新numpy版本的需要,不過如果我更新了,也會第一時間發出來,并給出鏈接,這點請放心。
除此之外,感謝博友piaoyang_的指正
總結
以上是生活随笔為你收集整理的Python实现 灰色关联分析 与结果可视化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深入浅出统计学 第一章 数据的可视化
- 下一篇: 深入浅出统计学 第二三章 量度