python實現灰色關聯分析(GRA)——以紅酒質量指標為例


程序簡介

對紅酒質量指標數據進行灰色關聯分析,首先進行數據標准化,然后計算關聯系數矩陣和平均綜合關聯度
程序輸入:第一列為母序列的指標矩陣
程序輸出:關聯度矩陣

灰色關聯分析方法(GRA),是根據因素之間發展趨勢的相似或相異程度,亦即“灰色關聯度”,作為衡量因素間關聯程度的一種方法。

程序/數據集下載

點擊進入下載地址

代碼分析

導入模塊、路徑

# -*- coding: utf-8 -*-
from Module.BuildModel import GraModel
import pandas as pd
import numpy as np
import os
import matplotlib.pyplot as plt
import seaborn as sns
#路徑目錄
baseDir = ''#當前目錄
staticDir = os.path.join(baseDir,'Static')#靜態文件目錄
resultDir = os.path.join(baseDir,'Result')#結果文件目錄

讀取紅酒質量數據,查看內容

#接口要求第一列為母序列,即紅酒質量
data = pd.read_csv(staticDir+'/winequality-red.csv',sep=';')
columns = ['quality','fixed acidity', 'volatile acidity',
           'citric acid', 'residual sugar','chlorides', 
           'free sulfur dioxide', 'total sulfur dioxide', 
           'density','pH', 'sulphates', 'alcohol']
data = data[columns]
data.head()
quality fixed acidity volatile acidity citric acid residual sugar chlorides free sulfur dioxide total sulfur dioxide density pH sulphates alcohol
0 5 7.4 0.70 0.00 1.9 0.076 11.0 34.0 0.9978 3.51 0.56 9.4
1 5 7.8 0.88 0.00 2.6 0.098 25.0 67.0 0.9968 3.20 0.68 9.8
2 5 7.8 0.76 0.04 2.3 0.092 15.0 54.0 0.9970 3.26 0.65 9.8
3 6 11.2 0.28 0.56 1.9 0.075 17.0 60.0 0.9980 3.16 0.58 9.8
4 5 7.4 0.70 0.00 1.9 0.076 11.0 34.0 0.9978 3.51 0.56 9.4

利用GraModel類建立灰色關聯模型,打印結果,該類在文件夾的Module/BuildModel.py中,代碼會在下文給出

#建立灰色關聯模型,標准化數據
model = GraModel(data,standard=True)
#模型計算結果
result = model.result
#平均關聯程度
meanCors = result['meanCors']['value']
print(result)
{'cors': {'value': array([[1.        , 0.96198678, 0.78959431, ..., 0.75974072, 0.96920683,
        0.97441242],
       [1.        , 0.9306525 , 0.70441517, ..., 0.98976649, 0.87748443,
        0.97000442],
       [1.        , 0.9306525 , 0.75900106, ..., 0.93497649, 0.89874803,
        0.97000442],
       ...,
       [1.        , 0.80296849, 0.92265873, ..., 0.96266425, 0.98630178,
        0.98636283],
       [1.        , 0.91597473, 0.81988779, ..., 0.72703752, 0.85720372,
        0.91902831],
       [1.        , 0.78639314, 0.79745798, ..., 0.9909029 , 0.93720807,
        0.98636283]]), 'desc': '關聯系數矩陣'}, 'meanCors': {'value': array([1.        , 0.87336194, 0.84594509, 0.87650184, 0.87830158,
       0.87197282, 0.86374431, 0.85600195, 0.8545979 , 0.86426018,
       0.89324032, 0.90374   ]), 'desc': '平均綜合關聯系數'}}

這是上文使用的GraModel類,該代碼塊可直接運行,輸入矩陣,縱軸為屬性名,第一列為母序列,輸出為關聯系數矩陣、平均綜合關聯系數

# -*- coding: utf-8 -*-
from sklearn.preprocessing import StandardScaler
import pandas as pd
import numpy as np
import os

class GraModel():
    '''灰色關聯度分析模型'''
    def __init__(self,inputData,p=0.5,standard=True):
        '''
        初始化參數
        inputData:輸入矩陣,縱軸為屬性名,第一列為母序列
        p:分辨系數,范圍0~1,一般取0.5,越小,關聯系數間差異越大,區分能力越強
        standard:是否需要標准化
        '''
        self.inputData = np.array(inputData)
        self.p = p
        self.standard = standard
        #標准化
        self.standarOpt()
        #建模
        self.buildModel()
        
    def standarOpt(self):
        '''標准化輸入數據'''
        if not self.standard:
            return None
        self.scaler = StandardScaler().fit(self.inputData) 
        self.inputData = self.scaler.transform(self.inputData)
        
    def buildModel(self):
        #第一列為母列,與其他列求絕對差
        momCol = self.inputData[:,0].copy()
        sonCol = self.inputData[:,0:].copy()
        for col in range(sonCol.shape[1]):
            sonCol[:,col] = abs(sonCol[:,col]-momCol)
        #求兩級最小差和最大差
        minMin = sonCol.min()
        maxMax = sonCol.max()
        #計算關聯系數矩陣
        cors = (minMin + self.p*maxMax)/(sonCol+self.p*maxMax)
        #求平均綜合關聯度
        meanCors = cors.mean(axis=0)
        self.result = {'cors':{'value':cors,'desc':'關聯系數矩陣'},'meanCors':{'value':meanCors,'desc':'平均綜合關聯系數'}}

if __name__ == "__main__":
    #路徑目錄
    curDir = os.path.dirname(os.path.abspath(__file__))#當前目錄
    baseDir = os.path.dirname(curDir)#根目錄
    staticDir = os.path.join(baseDir,'Static')#靜態文件目錄
    resultDir = os.path.join(baseDir,'Result')#結果文件目錄
    #讀數
    data = [
    [1,1.1,2,2.25,3,4],
    [1,1.166,1.834,2,2.314,3],
    [1,1.125,1.075,1.375,1.625,1.75],
    [1,1,0.7,0.8,0.9,1.2]        
    ]
    data = np.array(data).T
    #建模
    model = GraModel(data,standard=True)
    print(model.result)

對平均灰色關聯系數進行熱力圖可視化,系數可理解為所有指標與質量的關聯,所以第1個值為1

#用來正常顯示中文標簽
plt.rcParams['font.sans-serif']=['SimHei'] 
#用來正常顯示負號
plt.rcParams['axes.unicode_minus']=False
#可視化矩陣
plt.clf()
plt.figure(figsize=(8,12))
sns.heatmap(meanCors.reshape(1,-1), square=True, annot=True,  cbar=False,
            vmax=1.0,
            linewidths=0.1,cmap='viridis')
plt.yticks([0,],['quality'])
plt.xticks(np.arange(0.5,12.5,1),columns,rotation=90)
plt.title('指標關聯度矩陣')



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM