灰色关联分析法:
对于两个系统之间的因素,其随时间或不同对象而变化的关联性大小的量度,称为关联度。在系统发展过程中,若两个因素变化的趋势具有一致性,即同步变化程度较高,即可谓二者关联程度较高;反之,则较低。因此,灰色关联分析方法,是根据因素之间发展趋势的相似或相异程度,亦即“灰色关联度”,作为衡量因素间关联程度的一种方法。
灰色关联分析,公式网上都有很多,计算也不难,这里就不写公式。
之所以称为关联,是因为他只反映哪一个指标和要对比的指标最有关系,而不反映相关性。
他和相关性系数,没有一毛钱关系,也不对等。最后得出来的系数,也只是做一个排序。
不反映相关性,不反映相关性,不反映相关性。
灰色关联分析,是根据因素之间发展趋势的相似或相异程度,即“灰色关联度”,作为衡量因素间关联程度的方法
特点:
- 不需要自变量,参考变量服从正态分布,对样本数据没有要求,适合小样本数据。
- 能够将自变量和参考变量的关联性大小排序,从而得到重要性排序的评价,本身的关联度没有实际意义,比如得出关联度为0.95,这个数字只用排序,并不能像相关性0.95一样得出他们高度正相关。
- 缺点在于只能排序,不能得出确切的相关性,不属于相关性分析范畴,只归入综合评价方法里。
- 确定参考指标和比较指标,一般参考指标放最开始的位置。
- 确定归一化(其实这里说归一化不太正确,但很多地方都说归一化,其实应该是消除量纲)方法,常见的有:
初值法 | 增益型:每一个指标除以这个指标的第一个(初值)。成本型:第一个值除以每一个指标的每个值 |
---|---|
均值法 | 增益型:每一个指标除以这个指标的均值。成本型:均值除以每一个指标的每个值 |
区间变换法 | 增益型:(指标减去最小值)除以(最大值减最小值) 。成本型:(最大值减去指标)除以(最大值减最小值) |
… | … |
- 这时候的矩阵已经没有了量纲的影响,再用每个要比较的指标减去参考指标,一般参考放第一行,就都减去第一行的数据。这个地方要取绝对值,不能有负数,得到的矩阵一般记做Δ(k)
- 求两级最大差和最小差,即上面Δ(k)矩阵中的最大值,和最小值。记Δ(max),Δ(min)
- 得到关联系数矩阵:式子中的Δ(k)就是上面得到的绝对值后的矩阵
文章图片
- 最后对每一个指标的向量求均值。就是最终的结果
# 最下面写了三个函数分别为gain,cost,level_,用于无量纲化,被GRA调用def GRA(df,normaliza="initial",level=None,r=0.5):
'''
df : 二维数据,这里用dataframe,每一行是一个评价指标,要对比的参考指标放在第一行
normaliza :["initial","mean"] 归一化方法,默认为初值,提供初值化或者均值化,其他方法自行编写
level :为None默认增益型,
可取增益型"gain"(越大越好),成本型"cost"(越小越好),
或者dataframe中的某一列,如level="level","level"是列名,这列中用数字1和0表示增益和成本型
r : [0-1] 分辨系数
越大,分辨率越大; 越小,分辨率越小,一般取0.5
'''
# 判断类型
if not isinstance(df,pd.DataFrame):
df = pd.DataFrame(df)# 判断参数输入
if (normaliza not in ["initial","mean"]) or (r<0 or r>1):
raise KeyError("参数输入类型错误")# 增益型的无量纲化方法
if level == "gain" or level == None:
df_ = gain(df,normaliza)#成本性无量纲化方法
elif level == "cost":
df_ = cost(df,normaliza)else:# 有增益有成本性的无量纲化方法
try:
df.columns.get_loc(level) # 尝试获得这一列的列索引,判断输入的列名有没有,返回这个列的索引下标
except:
raise KeyError("表中没有这一列")
df_ = level_(df,normaliza,level)
df_.drop(level,axis=1,inplace=True)# 加的level这一列对总体没用,最后把这一列删除再做关联分析df_ = np.abs(df_ - df_.iloc[0,:]) # 每一行指标和要参考的指标做减法,取绝对值。
global_max = df_.max().max()
global_min = df_.min().min()
df_r = (global_min + r*global_max)/(df_ + r*global_max) # 求关联矩阵
return df_r.mean(axis=1)# gain增益型
def gain(df,normaliza):
for i in range(df.shape[0]):
if normaliza == "initial" or normaliza==None:
df.iloc[i] = df.iloc[i]/df.iloc[i,0]
elif normaliza == "mean":
df.iloc[i] = df.iloc[i]/df.mean(axis=1)
return df# cost成本型
def cost(df,normaliza):
for i in range(df.shape[0]):
if normaliza == "initial" or normaliza==None:
df.iloc[i] = df.iloc[i,0]/df.iloc[i]
elif normaliza == "mean":
df.iloc[i] = df.mean(axis=1)/df.iloc[i]
return df# 自定义级别0-1型
def level_(df,normaliza,level):
# 把这个表中等于1和等于0的数,重新分成两个表,调用上面两个方法。在合成一张表
df_gain = df[df[level]==1]
df_cost = df[df[level]==0]
df_1 = gain(df_gain,normaliza)
df_2 = cost(df_cost,normaliza)
return df_1.append(df_2)
文章图片
现在有这样一组数据,通过对某健将级女子铅球运动员的跟踪调查,获得其 1982 年至 1986 年每年最好成绩及16 项专项素质和身体素质的时间序列资料,见表,试对此铅球运动员的专项成绩进行因素分析。
这是其他文章中的例子,那篇文章用matlab代码写的。传送门
# 数据如下
x = np.array([
[13.6,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.41,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.2,4.25,4.1,4.06,3.99],
[13.1,13.42,12.85,12.72,12.56]
])
因为最后两个指标是成本型,前面的都是增益型,所以我们另外加一列表示他的类型
df1 = pd.DataFrame(x)
df1["level"] = np.array([1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0])
文章图片
将这个数据传入方法中,即可得到最终的关联系数
0 1.000000
1 0.588106
2 0.662749
3 0.853618
4 0.776254
5 0.854873
6 0.502235
7 0.659223
8 0.582007
9 0.683125
10 0.695782
11 0.895453
12 0.704684
13 0.933405
14 0.846704
15 0.745373
16 0.726079
第一行是铅球专项成绩x0,本身和自己最关联,这个不用看,剩下关联最强的就是x13全蹲,这样可以做针对性训练。最后还可以排个序。
再讨论一下这个关联系数矩阵,步骤中第五步求出的。
针对上面的,关联矩阵如下,
文章图片
画一个图,从里面挑几行出来画,要不太多了,看不清楚。
文章图片
挑的数据为[0,1,2,3,4,13,16]这几行,其中0就是参考的指标。
可以看得出来,x13是关系最强的,所以和0的那条直线挨的最近,1,2,3中3是最强的,所以红色的线也在上面。(调节系数r的大小,画出图的紧凑程度也不一样。这里就不试了。)
【统计学|灰色关联分析,Python实现GRA(gray relation analysis)】这就是一开始说的,若两个因素变化的趋势具有一致性,即同步变化程度较高,即可谓二者关联程度较高;反之,则较低。
推荐阅读
- python|总结|图像分割5大经典方法
- 免授权采集海天注塑机采集伊之密注塑机监控住友注塑机参数采集
- 机器学习|河南郑州二手房房价预测
- 数据可视化神器,深入解读Smartbi自助仪表盘
- 三个点带你解读Smartbi商业智能大数据分析平台
- java|为什么使用开源软件_为什么要使用开源软件()
- java|为什么要使用开源软件()
- 大数据|对话阿里云(开源与自研如何共处())
- java|开源 非开源_在从事开源律师职业之前要了解的内容