目录
- 程序简述
- 数据集截图
- 程序/数据集下载
- 核心代码解析
- 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,关联度矩阵热力图