python实现灰色关联分析(GRA)——以红酒质量指标为例


目录




  • 程序简述

  • 数据集截图

  • 程序/数据集下载

  • 核心代码解析

    • Module/BuildModel.py(接口,可以直接运行)

  • 接口调用、运行效果

    • Main.py

程序简述


对红酒质量指标数据进行灰色关联分析,首先进行数据标准化,然后计算关联系数矩阵和平均综合关联度
程序输入:第一列为母序列的指标矩阵
程序输出:关联度矩阵


灰色关联分析方法(GRA),是根据因素之间发展趋势的相似或相异程度,亦即“灰色关联度”,作为衡量因素间关联程度的一种方法。


数据集截图


图1,红酒质量指标


程序/数据集下载



点击进入下载地址


核心代码解析


Module/BuildModel.py(接口,可以直接运行)


建立灰色关联度模型,输入数据可选择是否需要标准化,结果保存在对象的result里,该代码可直接运行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# -*- 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]
        sonCol = self.inputData[:,0:]
        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)

接口调用、运行效果


Main.py


调用BuildModel.py的接口,实例分析,得到红酒质量与红酒PH等指标之间的关联度。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# -*- 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 = os.path.dirname(os.path.abspath(__file__))#当前目录
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]

#建立灰色关联模型,标准化数据
model = GraModel(data,standard=True)
#模型计算结果
result = model.result
#平均关联程度
meanCors = result['meanCors']['value']

#可视化图表
#用来正常显示中文标签
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('指标关联度矩阵')
plt.savefig(resultDir+'/指标关联度可视化矩阵.png',dpi=100,bbox_inches='tight')

图2,关联度矩阵热力图