传感数据分析——TOPSIS-Entropy Weight Method
前言
上期文章传感数据分析——Entropy Weight Method (熵权法)中,已经将熵权法用于多传感数据分析中,最终得到一个评估指标,本期将改进版的熵权法——TOPSIS(优劣解距离法)熵权法用于多传感数据分析中。
本文正文内容
一、基础概念
上期文章传感数据分析——Entropy Weight Method (熵权法)中叙述了熵权法的基本步骤,本期不再赘述。
TOPSIS法的关键就是求得最优方案和最劣方案,并计算与最优/最劣方案的距离,这样就可以得到相对准确的评估。
确定最优方案(最大值集合):
Z
+
=
(
max
{
z
11
,
z
21
,
⋯
,
z
n
1
}
,
max
{
z
12
,
z
22
,
⋯
,
z
n
2
}
,
⋯
,
max
{
z
1
m
,
z
2
m
,
⋯
,
z
n
m
}
)
=
(
Z
1
+
,
Z
2
+
,
⋯
,
Z
m
+
)
\begin{equation}\begin{aligned} &Z^+=(\max{\{z_{11},z_{21},\cdots,z_{n1}\}},\max\{z_{12},z_{22},\cdots,z_{n2}\},\cdots,\max\{z_{1m},z_{2m},\cdots,z_{nm}\}) \\ &=(Z_1^+,Z_2^+,\cdots,Z_m^+) \end{aligned}\end{equation}
Z+=(max{z11,z21,⋯,zn1},max{z12,z22,⋯,zn2},⋯,max{z1m,z2m,⋯,znm})=(Z1+,Z2+,⋯,Zm+)
确定最劣方案(最小值集合):
Z
−
=
(
min
{
z
11
,
z
21
,
⋯
,
z
n
1
}
,
min
{
z
12
,
z
22
,
⋯
,
z
n
2
}
,
⋯
,
min
{
z
1
m
,
z
2
m
,
⋯
,
z
n
m
}
)
=
(
Z
1
−
,
Z
2
−
,
⋯
,
Z
m
−
)
\begin{equation}\begin{aligned} &Z^-=(\min{\{z_{11},z_{21},\cdots,z_{n1}\}},\min\{z_{12},z_{22},\cdots,z_{n2}\},\cdots,\min\{z_{1m},z_{2m},\cdots,z_{nm}\}) \\ &=(Z_1^-,Z_2^-,\cdots,Z_m^-)\end{aligned}\end{equation}
Z−=(min{z11,z21,⋯,zn1},min{z12,z22,⋯,zn2},⋯,min{z1m,z2m,⋯,znm})=(Z1−,Z2−,⋯,Zm−)
与最优/最劣方案的接近程度:
D
i
+
=
∑
j
=
1
m
w
j
(
Z
j
+
−
z
i
j
)
2
\begin{equation}D_i^+=\sqrt{\sum_{j=1}^mw_j(Z_j^+-z_{ij})^2}\end{equation}
Di+=j=1∑mwj(Zj+−zij)2
D
i
−
=
∑
j
=
1
m
w
j
(
Z
j
−
−
z
i
j
)
2
\begin{equation}D_i^-=\sqrt{\sum_{j=1}^mw_j(Z_j^--z_{ij})^2}\end{equation}
Di−=j=1∑mwj(Zj−−zij)2
此处的
w
j
w_j
wj是熵值法得到的权重值。
计算综合评价值:
C
i
=
D
i
−
D
i
+
+
D
i
−
\begin{equation}C_i=\frac{D_i^-}{D_i^++D_i^-}\end{equation}
Ci=Di++Di−Di−
对公式的详细描述与解释可参考大佬博客TOPSIS法(优劣解距离法)介绍及 python3 实现。
==========================================
二、运行环境
系统: Windows 10 / Ubuntu 20.04
编程语言: Python 3.8
文本编译器: Vscode
所需库:pandas >= 0.23.0, matplotlib >= 2.2.2 , numpy >= 1.19.5
三、使用步骤
1.引入库
代码如下(示例):
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
2.读入数据
代码如下(示例):
# 导入数据
data=pd.read_excel("dataset/dataset_test1.xlsx", sheet_name=0,header=0,index_col=0)
# 保存路径
save_path = './result/'
# 调用TOPSIS-熵权法函数处理数据
topsis_EWM(data, save_path)
该处读取dataset文件夹下的数据,可以修改为你目录下的数据文件。
3.TOPSIS熵权法
代码如下(示例):
def topsis_EWM(data, save_path):
"""
TOPSIS-Entropy熵权法函数:
输入:
data: pd.dataFrame格式数据
save_path: TOPSIS-Entropy熵权法输出值保存目录
无返回值
"""
#获取行数m和列数n
m,n=data.shape
print("行数:", m, "列数: ", n)
#标准化矩阵
Y_ij=min_max_matrix(data, n)
#新建空矩阵
none_ij = [[0.0] * n for i in range(m)]
#熵值
E_j = entropy_j(Y_ij, none_ij,m, n)
#计算差异系数
G_j = 1 - E_j
#计算权重
W_j = G_j / sum(G_j)
# 转为pd.Series格式
Weights= pd.Series(W_j, index=data.columns, name='指标权重')
# 保存到excel
Weights.to_excel(save_path + "TOPSIS-Entropy_weight.xlsx",sheet_name='Weights')
# 原数据×权重=最终结果
Y_ij = np.array(Y_ij)
score = topsis(none_ij, Y_ij, W_j, m, n)
# 保存熵权法输出值
score_pd = pd.DataFrame(score, columns=['TOPSIS-EWM结果'])
score_pd.to_excel(save_path + "score_topsis_entropy.xlsx", sheet_name="TOPSIS-EWMscores")
# 绘图并保存
plt.figure(figsize=(16,9))
plt.plot(score)
plt.legend(['EWM Scores'])
plt.title("TOSIS-Entropy Weight Method Test", fontsize=18)
plt.savefig(save_path + "TOPSIS-EWM_scores.png")
plt.show()
def topsis(none_ij, Y_ij, W_j, m, n):
#空矩阵
Z_ij = np.array(none_ij)
for i in range(m):
for j in range(n):
#计算加权标准化矩阵Z_ij
Z_ij[i][j]=Y_ij[i][j]*W_j[j]
#最优解
Imax_j=Z_ij.max(axis=0)
#最劣解
Imin_j=Z_ij.min(axis=0)
Dmax_ij = np.array(none_ij)
Dmin_ij = np.array(none_ij)
for i in range(m):
for j in range(n):
Dmax_ij[i][j] = (Imax_j[j] - Z_ij[i][j]) ** 2
Dmin_ij[i][j] = (Imin_j[j] - Z_ij[i][j]) ** 2
#最优解欧氏距离
Dmax_i=Dmax_ij.sum(axis=1)**0.5
#最劣解欧氏距离
Dmin_i=Dmin_ij.sum(axis=1)**0.5
#综合评价值
score=Dmin_i/(Dmax_i+Dmin_i)
return score
def min_max_matrix(data1, n):
"""
矩阵标准化(min-max标准化)
"""
for i in data1.columns:
for j in range(n+1):
#负向指标
if i == str(f'X{j}负'):
data1[i]=(np.max(data1[i])-data1[i])/(np.max(data1[i])-np.min(data1[i]))
#正向指标
else:
data1[i]=(data1[i]-np.min(data1[i]))/(np.max(data1[i])-np.min(data1[i]))
return data1
def entropy_j(data3, none_ij, m, n):
"""
计算熵值
"""
data3 = np.array(data3)
en = np.array(none_ij)
for i in range(m):
for j in range(n):
if data3[i][j] == 0:
e_ij = 0.0
else:
#计算比重
P_ij = data3[i][j] / data3.sum(axis=0)[j]
e_ij = (-1 / np.log(m)) * P_ij * np.log(P_ij)
en[i][j] = e_ij
en_j=en.sum(axis=0)
return en_j
结果图
总结
以上就是本节对传感数据进行TOPSIS熵权法计算输出综合评价值的内容,本文简单介绍了传感数据分析中TOPSIS熵权法基本公式及Python的实现(改为自己的数据集即可),具体代码可见传感数据分析-TOPSIS-Entropy Weight Method。