理论部分
灰色系统理论提出了对各子系统进行灰色关联度分析的概念,意图透过一定的方法,去寻求系统中各子系统(或因素)之间的数值关系。
灰色关联度步骤:
1.首先找到各个指标的参考指。(这里找到的是正向指标的最大值)
2.将参考指标减去每一个样本对应的值,得出一个新的矩阵,再找到每一个样本中最小值的最小值。
3.算出每一个样本所对应的关联系数:
4.最后算出每一个样本的关联度,ri值越接近1,说明样本与参考指标相关性越好。然后进行排序。
实际上灰色关联度分析就是判断所有样本距离最优样本之间的距离来进行评价样本的好坏。
代码部分
相信大家都对理论部分不怎么感兴趣,那我就直接上一个示例吧!
def grey_relational_analysis(data):
"""
input:正向化之后的数据
output:每个样本的得分(行)
"""
n = len(data) # 数据个数
m = len(data[0]) # 数据维度
# 数据归一化
data_normalized = (data - np.min(data, axis=0)) / (np.max(data, axis=0) - np.min(data, axis=0))
data_pos = np.abs(1 - data_normalized) # 与最优解的绝对值矩阵
data_neg = np.abs(data_normalized - 0) # 与最差解的绝对值矩阵
# 与最大值和最小值的相关系数
e_pos = ((data_pos.min() + 0.5 * data_pos.max())/(data_pos + 0.5 * data_pos.max())).mean(axis = 1)
e_neg = ((data_neg.min() + 0.5 * data_neg.max())/(data_neg + 0.5 * data_neg.max())).mean(axis = 1)
# 计算关联系数
score = 1/(1+np.square(e_neg/e_pos))
score = score / sum(score)
return score
data = np.array([[220,190,180,170],
[6, 8,8,7],
[30,25,28,23],
[10,9,7,8],
[10,8,7,7],
[5,3,4,2]]).T # 示例矩阵,其中行代表一个属性维度,每一列代表一个样本(注意进行了转置哦)
result = grey_relational_analysis(data)
print(result) # 得到最终的结果是四个样本的得分,其中灰色关联度越高,得分越高。
通过灰色关联度分析,我们可以得到每一个样本的优劣得分,之所以叫做关联度分析,我的理解是通过比较最优样本的关联度来得到样本的优劣。