一、构建决策矩阵D
决策矩阵指的是方案对属性
的取值,假设方案有m个,属性值有n个,
称为决策矩阵;
二、统一为效益型矩阵
效益型属性的属性值越大,对决策的重要程度就越高;费用型属性与此相反,在进行统一时,只需将效益型的属性取倒数即可。本例中对第一类属性取了对数;
D=np.array([[1/25,9,7],[1/18,7,7],[1/12,5,5]])
三、将决策矩阵进行标准化
实现标准化有三种方法:归一化、最大化和模一化;Topsis方法中主要使用的是归一化模一化,下面是归一化和模一化的具体原理;
归一化:
Numpy代码(文章中使用到的代码都是在jupyter notebook中书写的)
#标准化-归一化
n = len(D)
std_matrix = np.zeros((n, n))
for i in range(n):
std_matrix[:,i] = D[:,i] / sum(D[:,i])#第i列的所有元素,相当于对数组进行缩放
模一化:
在Numpy中求解该矩阵时,可以将D转置为D_T,然后将D_T与D相乘,再进行开根号,这样得到的矩阵的对角线元素就是分母,然后按列为单位再进行相除;
D_T=np.transpose(D)
temp=pow(np.dot(D_T,D),1/2)# 相加开根号
for i in range(n):
r[:,i]=D[:,i]/temp[i,i]
r
四、利用信息熵法确定属性权重
各方案关于属性的熵为
e=-1/np.log(len(std_matrix))*sum(std_matrix*np.log(std_matrix))#计算信息熵
e
定义区分度为
f=1-e
w=f/sum(f)#计算权重
w
五、TOPSIS方法
1、计算矩阵V
V=np.zeros((n,n))
for i in range(n):
V[:,i]=r[:,i]*w[i]
V
2、找出正理想解和负理想解
Vpos = np.max(V,axis=0)
Vpos
Vneg = np.min(V,axis=0)
Vneg
3、计算欧式距离
#欧式距离的算法
Spos=np.linalg.norm(V-Vpos,axis=1)
Spos
Sneg=np.linalg.norm(V-Vneg,axis=1)
Sneg
4、接近度的计算与归一化
#计算相对接近度
Cpos=Sneg/(Spos+Sneg)
Cpos=Cpos/sum(Cpos)
Cpos
源代码下载链接
链接:https://pan.baidu.com/s/119VCy34sTIqAFYKwn0b7gQ?pwd=zd5n
提取码:zd5n