优劣解距离法
TOPSIS是通过逼近理想解的程度来评估各个样本的优劣等级
收集与整理
假设有n个待评价样本,p项评价指标,形成原始指标数据矩阵:
预处理数据
使指标具有同趋势性。评价指标中有正向指标和负向指标之分,一般把负向指标转化为正向指标,转化的方法可采用倒数法(即1/X),多适用于绝对数指标;差值法(即1-X),多适用于相对数指标。转化后的数据矩阵仍记为X。数据无量纲化.。将原始数据归一化,以消除量纲向量数据归一化的方式:
最终得到分析数据矩阵
寻找最优值和最劣值
找出各项指标的最优值和最劣值,建立最优值向量z+和最劣值z-向量
计算离尺度
计算理想解的接近度
排序
根据Ci的大小进行排序,Ci越大,表明评价对象越接近最优值。
原理讲解引自:https://blog.csdn.net/qq_42374697/article/details/105901229
题目
评价下表中20条河流的水质情况。(熵权法和优劣解距离法对比)注:含氧量越高越好;PH值越接近7越好;细菌总数越少越好;植物性营养物量介于10‐20之间最佳,超过20或低于10均不好。
河流 | 含氧量(ppm) | PH值 | 细菌总数(个/mL) | 植物性营养物量(ppm) |
A | 4.69 | 6.59 | 51 | 11.94 |
B | 2.03 | 7.86 | 19 | 6.46 |
C | 9.11 | 6.31 | 46 | 8.91 |
D | 8.61 | 7.05 | 46 | 26.43 |
E | 7.13 | 6.5 | 50 | 23.57 |
F | 2.39 | 6.77 | 38 | 24.62 |
G | 7.69 | 6.79 | 38 | 6.01 |
H | 9.3 | 6.81 | 27 | 31.57 |
I | 5.45 | 7.62 | 5 | 18.46 |
J | 6.19 | 7.27 | 17 | 7.51 |
K | 7.93 | 7.53 | 9 | 6.52 |
L | 4.4 | 7.28 | 17 | 25.3 |
M | 7.46 | 8.24 | 23 | 14.42 |
N | 2.01 | 5.55 | 47 | 26.31 |
O | 2.04 | 6.4 | 23 | 17.91 |
P | 7.73 | 6.14 | 52 | 15.72 |
Q | 6.35 | 7.58 | 25 | 29.46 |
R | 8.29 | 8.41 | 39 | 12.02 |
S | 3.54 | 7.27 | 54 | 3.16 |
T | 7.44 | 6.26 | 8 | 28.41 |
代码
.mat数据:在MATLAB里面随便创建一个变量,将表格中的数据粘贴进变量中,再另存为.mat数据就行。
main.m
%% 数据读取
clear,clc
load rivers_data.mat
%% 正向化处理
[n,m] = size(datas_matrix);
% 正向化处理的数据所在列
Pos = [2,3,4];
% 指标类型:1:极小型,2:中间型,3:区间型
ch = [2,1,3];
% 循环处理每一列
for i = 1 : size(Pos,2)
datas_matrix(:,Pos(i)) = Forward_processing(datas_matrix(:,Pos(i)),ch(i),Pos(i));
end
%% 权重
%如果不需要加权重就默认权重都相同,即都为1/m
weigh = ones(1,m) ./ m ;
%% 归一化
for i = 1:m
tmp = datas_matrix(:,i)
datas_S_matrix(:,i) = (tmp - min(tmp))/(max(tmp) - min(tmp));
end
%% 计算与最大值的距离和最小值的距离,并算出得分
max_dis = sum([(datas_S_matrix - repmat(max(datas_S_matrix),n,1)) .^ 2 ] .* repmat(weigh,n,1) ,2) .^ 0.5;
min_dis = sum([(datas_S_matrix - repmat(min(datas_S_matrix),n,1)) .^ 2 ] .* repmat(weigh,n,1) ,2) .^ 0.5;
S = min_dis ./ (max_dis+min_dis);
results = S / sum(S);
[sorted_results,index] = sort(results ,'descend');
format short
R = [index,sorted_results];
xlswrite('results.xls',R);
Forward_processing.m
function [posit_x] = Forward_processing(x,type,~)
if type == 1 %极小型
%正向化
posit_x = max(x) - x;
elseif type == 2 %中间型
best = 7;
M = max(abs(x-best));
posit_x = 1 - abs(x-best) / M;
elseif type == 3 %区间型
a = 10;
b = 20;
r_x = size(x,1);
M = max([a-min(x),max(x)-b]);
posit_x = zeros(r_x,1);
for i = 1: r_x
if x(i) < a
posit_x(i) = 1-(a-x(i))/M;
elseif x(i) > b
posit_x(i) = 1-(x(i)-b)/M;
else
posit_x(i) = 1;
end
end
end
end