先来一段概念:
灰色关联分析是指对一个系统发展变化态势的定量描述和比较的方法,其基本思想是通过确定参考数据列和若干个比较数据列的几何形状相似程度来判断其联系是否紧密,它反映了曲线间的关联程度。
对,我最开始读的时候也感觉很。。。
画个图:
灰色分析法就是从几何空间的角度来衡量曲线的相似度。
举个例子:
Python code
# coding=gbk
import pandas as pd
import numpy as np
def normalization(data1):
[m, n] = data1.shape # 得到行数和列数
data2 = data1.astype('float')
data3 = data2
ymin = 0
ymax = 1
for j in range(0, n):
d_max = max(data2[:, j])
d_min = min(data2[:, j])
data3[:, j] = (ymax - ymin) * (data2[:, j] - d_min) / (d_max - d_min) + ymin
# print(data3)
return data3
def Score(data):
# 得到其他列和参考列相等的绝对值
data3 = data
[n, m] = data3.shape
# print(n)
for i in range(1, m):
data3[:, i] = np.abs(data3[:, i] - data3[:, 0])
# 得到绝对值矩阵的全局最大值和最小值
data4 = data3[:, 1:m]
d_max = np.max(data4)
d_min = np.min(data4)
a = 0.5 # 定义分辨系数
# 计算灰色关联矩阵
data4 = (d_min + a * d_max) / (data4 + a * d_max)
print("灰色关联矩阵:")
print(data4)
score = np.mean(data4, axis=0)
return score
if __name__ == '__main__':
# 导入数据
data = pd.read_excel('D:\\桌面\\建模\\6\\代码\\marry.xlsx')
# print(data)
# 提取变量名
label_need = data.keys()[1:]
# print(label_need)
# 提取上面变量名下的数据
data1 = data[label_need].values
# print(data1)
data3 = normalization(data1) # 标准化
scores = Score(data3) # 算灰色关联度
[m, n] = data1.shape # 得到行数和列数
# print(data)
print()
for i in range(1, n):
print(label_need[0], "与", label_need[i], "的灰色关联度", scores[i - 1])
数学原理:
X1代表一个序列,x1(k)是序列的第k个数
上面数据的一列是一个序列
参考数据列, 上面选取第一列。计算相似度
对每一列数据进行变换i是列下标(第一列除外)
计算子相似度,构成相似度矩阵
计算每一列的相似度
也可以加权平均