基本原理
基本概念
- TOPSIS法(逼近理想解排序法):
常称为优劣解距离法,是一种常用的综合评价方法,其能充分利用原始数据的信息,其结果能精确地反映各评价方案之间的差距
TOPSIS法基本过程:
- 将数据矩阵统一指标类型(一般正向化处理)
- 标准化处理消除量纲
- 计算对象与最优/最劣方案的距离
- 计算得分并归一化
TOPSIS法详细过程
步骤a 统一指标类型
常见的四种指标及正向化方法:
名称 | 特点 | 转换函数 |
---|---|---|
极大型指标 | 越大(多)越好 | None |
极小型指标 | 越小(少)越好 | m a x − x ( 常 用 ) 、 1 / x ( 需 为 正 数 ) max-x(常用)、1/x(需为正数) max−x(常用)、1/x(需为正数) |
中间型指标 | 越接近某个值越好 | 1 − ∣ x i − x b e s t ∣ M 1-\frac{\vert x_i-x_{best}\vert }{M} 1−M∣xi−xbest∣,其中 M = m a x { ∣ x i − x b e s t ∣ } M=max\{\vert x_i-x_{best}\vert \} M=max{∣xi−xbest∣} |
区间型指标 | 落在某个区间最好 | x i x_i xi 见下文 |
M = m a x { a − m i n { x i } } , m a x { x i } − b , x i = { 1 − a − x i M , x i < a 1 , a ≤ x i ≤ b 1 − x i − b M , x > b M = max\{a-min\{x_i\}\}, max\{x_i\}-b, x_i=\left\{ \begin{array}{lll} 1-\frac{a-x_i}{M} &, & x_i<a\\ 1 & , & a \leq x_i\leq b \\ 1-\frac{x_i-b}{M} & , & x>b \end{array} \right. M=max{a−min{xi}},max{xi}−b,xi=⎩⎨⎧1−Ma−xi11−Mxi−b,,,xi<aa≤xi≤bx>b
步骤b 正向化矩阵标准化,消除量纲
标准化矩阵元素:
z
i
j
=
x
i
j
/
∑
i
=
1
n
x
i
j
2
z_{ij}=x_{ij}/\sqrt{\sum_{i=1}^nx_{ij}^2}
zij=xij/∑i=1nxij2
(
每
一
个
元
素
/
其
所
在
列
的
元
素
的
平
方
和
)
(每一个元素/\sqrt{其所在列的元素的平方和})
(每一个元素/其所在列的元素的平方和)
步骤c 计算对象与最优/最劣方案的距离
定义:
- 最大值 Z + = ( Z 1 + , Z 2 + , ⋯ , Z m + ) Z^+=(Z_1^+, Z_2^+, \cdots,Z^+_m) Z+=(Z1+,Z2+,⋯,Zm+) [每一列的最大值组成]
- 最小值 Z − = ( Z 1 − , Z 2 − , ⋯ , Z m − ) Z^-=(Z_1^-,Z_2^-,\cdots,Z_m^-) Z−=(Z1−,Z2−,⋯,Zm−) [每一列的最小值组成]
- 对象与最大值距离 D i + = ∑ j = 1 m ( Z j + − z i j ) 2 D_i^+=\sqrt{\sum_{j=1}^m(Z^+_j-z_{ij})^2} Di+=∑j=1m(Zj+−zij)2
- 对象与最小值距离 D i − = ∑ j = 1 m ( Z j − − z i j ) 2 D_i^-=\sqrt{\sum_{j=1}^m(Z^-_j-z_{ij})^2} Di−=∑j=1m(Zj−−zij)2
步骤d 计算得分并归一化
得分 S i = D i − D i + + D i − , 0 ≤ S i ≤ 1 , S i 越 大 , 越 接 近 最 大 值 S_i=\frac{D_i^-}{D_i^++D_i^-},0\leq S_i\leq1,S_i 越大,越接近最大值 Si=Di++Di−Di−,0≤Si≤1,Si越大,越接近最大值
归一化: S i ~ / ∑ i = 1 n S i \tilde{S_i}/\sum^n_{i=1}S_i Si~/∑i=1nSi
模型拓展:
- 该方法默认了指标权重相同,可在算最大距离时考虑权重的影响
——利用层次分析法或熵权法(客观)
代码汇总
%%%%%%%%%%%%%%%%%%%%%%%%%%% 代码0:函数清单 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%
help load
help repmat
help sort
%%%%%%%%%%%%%%%%%%%%%%%%%%% 代码1:统一指标类型 %%%%%%%%%%%%%%%%%%%%%%%%%%%
load('data_water_quality.mat'); % 载入初始数据矩阵
[row, col] = size(X);
best = 7; % 中间型对应的值
sec_min = 10; % 区间型下限
sec_max = 20; % 区间型上限
% 以上数据根据建模题目修改,下文不需要修改
disp('请输入处理向量,min2max——1,mid2max——2,sec2max——3, max==max——0')
deal_A = input('处理向量:'); % 长度 == col
for i = 1:col
x = X(:,i);
if deal_A(i) == 1
A(:,i) = max(x) - x; % 极小型转极大型
elseif deal_A(i) == 2
M1 = max(abs(x-best));
A(:,i) = 1-abs(x-best)./M1; % 中间型转极大型
elseif deal_A(i) == 3 % 区间型转极大型
M2 = max([sec_min-min(x),max(x)-sec_max]);
for j = 1:length(x)
if x(j) > sec_max
x(j) = 1-(x(j)-sec_max)/M2;
elseif x(j) < sec_min
x(j) = 1-(sec_min-x(j))/M2;
else
x(j) = 1;
end
end
A(:,i) = x;
elseif deal_A(i) == 0
A(:,i) = x;
end
end
A % A矩阵即为所求正向化矩阵
%%%%%%%%%%%%%%% 代码2:正向化矩阵标准化、计算距离与得分、归一化 %%%%%%%%%%%%%%%%
Z = A./sqrt(sum(A.^2)); % Z为标准化矩阵
z_max = max(Z);
z_min = min(Z);
% 注意矩阵维数
d_max = sqrt(sum((repmat(z_max, row, 1)-Z).^2, 2));
d_min = sqrt(sum((repmat(z_min, row, 1)-Z).^2, 2));
s = d_min./(d_max+d_min); % 计算得分
s_end = s ./sum(s); % 归一化得分
% 得分按降序排列,返回排序后得分及其索引,即为最终结果
[sorted_s,index] = sort(s_end ,'descend')