【数据处理】灰色关联分析法

灰色关联分析法

灰色关联度分析

灰色系统

灰色系统之部分信息已知二部分信息位置的系统,灰色系统理论所要考察和研究的是对信息不完备的系统,通过已知的信息来研究和预测位置领域从而达到了解整个系统的目的

关联度

关联度是事物之间、因素之间关联性大小的亮度。如果实物或因素的变化态势基本一致,则可以任务它们之间的关联度较大,反之关联度较小。

灰色关联分析法基本思想

根据序列曲线几何形状的相似程度来判断其联系是否紧密,曲线越接近,相应序列之间的关联度就越大,反之就越小。

例子

根据老师给学生的评分表,判断总成绩与哪个变量关联度更高。

学生A学生B学生C
总成绩X01009560
考试成绩X1908045
出勤率X2100%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)+ζmaxmin+ζ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=1nξ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
所以,老师给的总成绩主要与考试成绩关联度较高。

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值