文章目录
灰色关联分析法
灰色关联度分析
灰色系统
灰色系统之部分信息已知二部分信息位置的系统,灰色系统理论所要考察和研究的是对信息不完备的系统,通过已知的信息来研究和预测位置领域从而达到了解整个系统的目的
关联度
关联度是事物之间、因素之间关联性大小的亮度。如果实物或因素的变化态势基本一致,则可以任务它们之间的关联度较大,反之关联度较小。
灰色关联分析法基本思想
根据序列曲线几何形状的相似程度来判断其联系是否紧密,曲线越接近,相应序列之间的关联度就越大,反之就越小。
例子
根据老师给学生的评分表,判断总成绩与哪个变量关联度更高。
学生A | 学生B | 学生C | |
---|---|---|---|
总成绩X0 | 100 | 95 | 60 |
考试成绩X1 | 90 | 80 | 45 |
出勤率X2 | 100% | 90% | 80% |
一、创建数组
import numpy as np
#根据表格数据,生成numpy数组
data=np.array([[100,95,60],[90,80,45],[1,0.9,0.8]])
''' 区域注释,另外一组数据 https://wenku.baidu.com/view/e3f9b598bdd126fff705cc1755270722182e5961.html
data=np.array([
[13.60,14.01,14.54,15.64,15.69],
[11.50,13.00,15.15,15.30,15.02],
[13.76,16.36,16.90,16.56,17.30],
[12.21,12.70,13.96,14.04,13.46],
[2.48,2.49,2.56,2.64,2.59],
[85,85,90,100,105],
[55,65,75,80,80],
[65,70,75,85,90],
[12.80,15.30,16.24,16.40,17.05],
[15.30,18.40,18.75,17.95,19.30],
[12.71,14.50,14.66,15.88,15.70],
[14.78,15.54,16.03,16.87,17.82],
[7.64,7.56,7.76,7.54,7.70],
[120,125,130,140,140],
[80,85,90,90,95],
[4.20,4.25,4.10,4.06,3.99],
[13.10,13.42,12.85,12.72,15.56]])
#将最后两列数据取倒数,因为时间减少代表了成绩增加
data[15]=1/data[15][:]
data[16]=1/data[16][:]
'''
print('原始数组:\n',data)
print('行数:',data.shape[0]) #行数
print('列数:',data.shape[1]) #列数
原始数组:
[[100. 95. 60. ]
[ 90. 80. 45. ]
[ 1. 0.9 0.8]]
行数: 3
列数: 3
二、数据处理
1、标准化(无量纲化)
我们很多数据,由于计算单位不同,不便于比较,或在比较时难以得到正确的结论,因此要进行数据标准化。
以参照数列为基准点,将各数据标准化成介于0~1之间的数据
本例中,以第一列为标准进行标准化,后面每列都除以第一列的数据
#新建数组,用于存放标准化数据
xk=np.zeros(data.shape)
#数据归一化
for i in range(0,data.shape[0]):
for k in range(0,data.shape[1]):
xk[i][k]=data[i][k]/data[i][0]
print('归一化后数组为:\n',xk)
归一化后数组为:
[[1. 0.95 0.6 ]
[1. 0.88888889 0.5 ]
[1. 0.9 0.8 ]]
2、根据公式需要值,计算对应差数列表,并计算矩阵中的最大值、最小值
计算第2~n行与第一行的差值,并计算得到的差值矩阵中的最大值和最小值。
#计算差值数组
dxk=np.zeros((data.shape[0]-1,data.shape[1]))
#计算差值
for i in range(0,dxk.shape[0]):
for k in range(0,dxk.shape[1]):
dxk[i][k]=abs(xk[i+1][k]-xk[0][k])
min=dxk.min()
max=dxk.max()
print('\n计算差值后数组为:\n',dxk,'\n\n min=',min,'\n max=',max)
计算差值后数组为:
[[0. 0.06111111 0.1 ]
[0. 0.05 0.2 ]]
min= 0.0
max= 0.20000000000000007
3、关联系数计算: ξ i ( k ) \xi_i(k) ξi(k)
通过下面公式,计算关联系数矩阵,其中 O i ( k ) O_i(k) Oi(k)为差值矩阵中的数据
ξ i ( k ) = △ m i n + ζ △ m a x △ O i ( k ) + ζ △ m a x \xi_i(k)=\displaystyle \frac{\bigtriangleup min+\zeta \bigtriangleup max}{\bigtriangleup O_i(k)+\zeta \bigtriangleup max} ξi(k)=△Oi(k)+ζ△max△min+ζ△max
其中 ζ \zeta ζ为分辨系数, 0 < ζ < 1 0<\zeta<1 0<ζ<1
#关联系数计算
xi=np.zeros((dxk.shape))
rho=0.5 #
#计算差值
for i in range(0,dxk.shape[0]):
for k in range(0,dxk.shape[1]):
xi[i][k]=(min+rho*max)/(dxk[i][k]+rho*max)
print('\n关联系数矩阵为:\n',xi)
关联系数矩阵为:
[[1. 0.62068966 0.5 ]
[1. 0.66666667 0.33333333]]
4、求关联度
对关联关系矩阵,求关联度
r i = 1 n ∑ k = 1 n ξ i ( k ) r_i=\frac{1}{n} \displaystyle \sum^{n}_{k=1}{\xi_i(k)} ri=n1k=1∑nξi(k)
可以通过numpy的行求平均函数来实现
xi.mean(axis=1) #行求平均
xi.mean(axis=0) #列求平均
r=xi.mean(axis=1) #行求平均
print(r)
[0.70689655 0.66666667]
5、分析结果
从结果可以看出
r1=0.707
r2=0.667
所以,老师给的总成绩主要与考试成绩关联度较高。