MATLAB优劣解距离法(topsis)综合评价+代码
优劣解距离法
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