关联步骤分析
![![[关键步骤.png]]](https://i-blog.csdnimg.cn/direct/45156d9d3a3d420b880d44fdde14d1b7.png)
![![[步骤分析2.png]]](https://i-blog.csdnimg.cn/direct/6f268487a7fc475181567ed3bc00096f.png)
- 母序列
(即因变量:每个子序列的变化引起母序列变化)
评价决策问题没有具体母序列的话
用每个对象所有指标中的最大值代替 (正向化且预处理过的) - 子序列
每一列代表每个不同指标
每一行代表不同参评对象 - 数据预处理 (和归一化不同)
预处理时:用指标元素除以均值(去除量纲的影响) - 计算灰色关联系数
a 两级最小差 b 两级最大差
a 每一列子序列的与母序列的差值绝对值的最小值
b 每一列子序列的与母序列的差值绝对值的最大值
构造得每个指标与母序列的关联系数
ξi(k)=y(x0(k),xi(k))=a+ρb∣x0(k)−xi(k)∣+ρb\xi_i{(k)} = y(x_0(k), x_i(k)) = \frac{a + \rho_b}{|x_0(k) - x_i(k)| + \rho_b}ξi(k)=y(x0(k),xi(k))=∣x0(k)−xi(k)∣+ρba+ρb - 计算关联度
每一列关联度求平均值
典例
数据的正向化处理看 [[TOPSIS法]]一节
![![[1.png]]](https://i-blog.csdnimg.cn/direct/952dc060e0b5459bae34482823cf12da.png)
![![[2.png]]](https://i-blog.csdnimg.cn/direct/dc9c0766ad7f4025bd83b002dabfb75d.png)
![![[数模学习(常用模型学习)/评价决策类/灰色关联分析/3.png]]](https://i-blog.csdnimg.cn/direct/ec32efc347d544db88d9763a4eafece3.png)
![![[4.png]]](https://i-blog.csdnimg.cn/direct/235f36c0c8e945d9bb383cf21ecfe92a.png)
权重就是每个指标的关联度所占总关联度的和的比例
![![[5.png]]](https://i-blog.csdnimg.cn/direct/303435c98bb04d08ad863930dce4f78e.png)
灰色关联综合评价代码如下
import numpy as np
# 输入参评数目 和 参评指标数目 字符串转化为数值
print('请输入参评数目:')
n = eval(input())
print('请输入参评指标数目:')
m = eval(input())
# 输入类型矩阵
print('请输入类型矩阵:1:极大型 2:极小型 3:中间型 4:区间型')
kind = input().split(" ") # 输入的字符用空格分割 形成列表
# 接受输入的矩阵转换为numpy数组
print('请输入参评矩阵:')
A = np.zeros((n, m)) # n行m列的零矩阵 (全是0的numpy数组 )
for i in range(n):
A[i] = input().split(" ") # 接收每行输入的数据空格分割 形成列表
A[i] = list(map(float, A[i])) # 接受到的字符串列表转换为浮点数列表
print('输入的矩阵为:\n{}'.format(A))
# 都转化为极大型
# 极小型转化为极大型
def minTomax(maxx, x):
x = list(x) # 输入的指标转化为列表
ans = [[(maxx - e)] for e in x]
return np.array(ans) # 列表转化为numpy数组并返回
# 中间型指标转化为极大型指标
def midTomax(bestx, x):
x = list(x) # 输入的指标转化为列表
h = [abs(e - bestx) for e in x] # 计算每个指标值与最优值之间的标准差
M = max(h)
if M == 0:
M = 1 #防止最大差值为0 的情况
ans = [[1 - e / M] for e in h]
return np.array(ans)
# 区间型指标转化为极大型指标
def regTomax(lowx, highx, x):
x = list(x) # 输入的指标转化为列表
M = max(lowx - min(x), max(x) - highx)
if M == 0:
M = 1
ans = [] # 初始化为空 每个向里面添加
for i in range(len(x)):
if x[i] < lowx:
ans.append([1 - (lowx - x[i]) / M])
elif x[i] > highx:
ans.append([1 - (x[i] - highx) / M])
else:
ans.append([1])
return np.array(ans)
# 统一指标类型
X = np.zeros(shape=(n, 1))
for i in range(m):
if kind[i] == '1':
v = np.array([A[:, i]])
elif kind[i] == '2':
maxA = max(A[:, i])
v = minTomax(maxA, A[:, i])
elif kind[i] == '3':
print("类型三 请输入最优值")
bestA = eval(input())
v = midTomax(bestA, A[:, i])
elif kind[i] == '4':
print("类型四 输入区间[a,b]的值a:")
lowA = eval(input())
print("类型四 输入区间[a,b]的值b:")
highA = eval(input())
v = regTomax(lowA, highA, A[:, i])
if i == 0:
X = v.reshape(-1, 1) # 自动行 1列
else:
X = np.hstack((X, v.reshape(-1, 1)))
print("统一指标后的矩阵为:\n{}".format(X))
#对正向化后的矩阵进行处理
Mean = np.mean(X, axis=0) # 按列求均值
Z = X/Mean
print('预处理后的矩阵为:')
print(Z)
# 构造母序列和子序列
Y = np.max(Z,axis=1) # 按行求最大值代表母序列
X = Z # 子序列就是预处理之后的数据矩阵
#计算得分
absX0_Xi = np.abs(X-np.tile(Y.reshape(-1,1), (1,X.shape[1])))
b = np.max(absX0_Xi)
a = np.min(absX0_Xi)
rho = 0.5
gamma = (a+b*rho)/(absX0_Xi*rho+b)
weight = np.mean(gamma,axis=0)/np.sum(np.mean(gamma,axis=0))
score = np.sum(X*np.tile(weight, (X.shape[0],1)),axis=1) # 未归一化的得分
stand_S = score/np.sum(score) # 归一化的得分
sorted_S = np.sort(stand_S)[::-1] # 排序后的得分
index = np.argsort(stand_S)[::-1] # 排序后的得分对应的下标
print("排序后的得分为:\n{}".format(sorted_S))
print("排序后的下标为:\n{}".format(index))
输入示例
请输入参评数目:
3
请输入参评指标数目:
4
请输入类型矩阵:1: 极大型 2: 极小型 3: 中间型 4: 区间型
1 2 3 4
请输入参评矩阵:
9 10 175 120
8 7 164 80
6 3 157 90
输入的矩阵为:
[[ 9. 10. 175. 120.]
[ 8. 7. 164. 80.]
[ 6. 3. 157. 90.]]
类型三请输入最优值
165
类型四输入区间[a, b]的值 a:
90
类型四输入区间[a, b]的值 b:
100
1万+



被折叠的 条评论
为什么被折叠?



