MATLAB 之 优劣解距离法(TOPSIS )-1

简介: TOPSIS 是一种常用的综合评价方法,可以充分利用 原始数据 的信息,其结果可以精确地反映各评价方案之间的差距。

文章目录

一、TOPSIS 简介

二、TOPSIS 步骤

1:将原始矩阵正向化,得到正向化矩阵

1.1 指标类型

1.2 正向化公式

2. 正向化矩阵标准化

3. 计算得分并归一化

3.1 方法

3.2 步骤

三、TOPSIS 模型实现

1. MATLAB 实现

1.1 把数据复制到工作区,并将这个矩阵命名为X

1.2 判断是否需要正向化

1.2.1 极小型指标正向化

1.2.2 中间型指标正向化

1.2.3 区间型指标正向化

1.2.4 指标正向化处理

1.3 对正向化后的矩阵进行标准化

1.4 计算得分并归一化(计算与最大值的距离和最小值的距离,并算出得分)

四、TOPSIS 模型优缺点

1. TOPSIS 法的优点

2. TOPSIS 法的缺点

五、TOPSIS 模型优化

1. 主观权重——层次分析法(AHP)

1.1 权重求解方法

(1) 算术平均法求权重

(2) 几何平均法求权重

(3) 特征值法求权重

2. 客观权重——熵权法

(1) 第一步

(2) 第二步

(3) 第三步

3. 优化结果


一、TOPSIS 简介


  • TOPSIS 是一种常用的综合评价方法,可以充分利用 原始数据 的信息,其结果可以精确地反映各评价方案之间的差距。
  • TOPSIS 是一种逼近于理想解的排序法,该方法只要求各效用函数具有单调递增(或递减)性就行。


  • TOPSIS 是多目标决策分析中一种常用的有效方法,又称为优劣解距离法。
  • TOPSIS 对样本容量没有严格限制,数据计算简单易行,无需数据检验。



二、TOPSIS 步骤

1:将原始矩阵正向化,得到正向化矩阵

1.1 指标类型

指标名称 指标特点 例子
极大型(效益性)指标 越大(多)越好 成绩、GDP增速、企业利润
极小型(成本型)指标 越小(少)越好 费用、坏品率、污染程度
中间型指标 越接近某个值越好 水质量评估时的PH值
区间型指标 落在某个区间最好 体温、水中植物性营养物量


1.2 正向化公式

正向化就是将原始数据指标都转化为极大型指标。

符号 含义
max 一列当中最大的元素
xbest 区间最好的值
a 区间下限
b 区间上限


  • 极小型指标转换为极大型指标:max−x,如果所有的元素均为正数,那么也可以使用:1 / x 。
  • 中间型指标转换为极大型指标:



70.png


2. 正向化矩阵标准化

标准化的目的是消除不同指标量纲的影响。

假设有 n 个要评价对象,m个评价指标(已经正向化了)构成的正向化矩阵如下:


71.png


3. 计算得分并归一化

3.1 方法

f8774e4649e04cba9cd8d0439a33fa5a.png

3.2 步骤

定义各个指标的最大值向量与最小值向量

最大值向量:

72.png

定义各个对象与最大值、最小值之间的距离

73.png


  • 归一化:每一部分为该部分与所有部分和的比值。归一化的目的是为了让我们的结果更加容易解释。例如将得分归一化后可限制在 0-1 这个区间,对区间内每一个得分,都可以容易的得到起所处的比例位置。
  • 分数最高即为最优方案或对象


三、TOPSIS 模型实现

关于具体实现,需要有一定的数据,这里实现所选用的数据如下:

河流 含氧量(ppm) PH值 细菌总数(个/mL) 植物性营养物量
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


1. MATLAB 实现

1.1 把数据复制到工作区,并将这个矩阵命名为X


  • 在工作区右键,点击新建(Ctrl+N),输入变量名称为X。
  • 在Excel中复制数据,再回到Excel中右键,点击粘贴Excel数据(Ctrl+Shift+V)。


  • 关掉这个窗口,点击X变量,右键另存为,保存为mat文件(下次就不用复制粘贴了,只需使用load命令即可加载数据)。
  • 注意,代码和数据要放在同一个目录下哦。


clear;clc
load data_water_quality.mat


1.2 判断是否需要正向化

  • 判断是否需要正向化,只有当存在非极大型指标时才需要正向化处理。
[n,m] = size(X);
disp(['共有' num2str(n) '个评价对象, ' num2str(m) '个评价指标']) 
Judge = input(['这' num2str(m) '个指标是否需要经过正向化处理,需要请输入1 ,不需要输入0:  ']);


  • 如果需要正向化处理,输入1。
if Judge == 1
    Position = input('请输入需要正向化处理的指标所在的列,例如第2、3、6三列需要处理,那么你需要输入[2,3,6]: '); %[2,3,6]
    disp('请输入需要处理的这些列的指标类型(1:极小型, 2:中间型, 3:区间型) ')
    Type = input('例如:第2列是极小型,第3列是区间型,第6列是中间型,就输入[1,3,2]:  '); %[2,1,3]
    % 注意,Position和Type是两个同维度的行向量
    for i = 1 : size(Position,2)  %这里需要对这些列分别处理,因此我们需要知道一共要处理的次数,即循环的次数
        X(:,Position(i)) = Positivization(X(:,Position(i)),Type(i),Position(i));
    % Positivization是我们自己定义的函数,其作用是进行正向化,其一共接收三个参数
    % 第一个参数是要正向化处理的那一列向量 X(:,Position(i))   回顾上一讲的知识,X(:,n)表示取第n列的全部元素
    % 第二个参数是对应的这一列的指标类型(1:极小型, 2:中间型, 3:区间型)
    % 第三个参数是告诉函数我们正在处理的是原始矩阵中的哪一列
    % 该函数有一个返回值,它返回正向化之后的指标,我们可以将其直接赋值给我们原始要处理的那一列向量
    end
    disp('正向化后的矩阵 X =  ')
    disp(X)
end


  • 可以得到正向化后的矩阵为:

74.png

75.png


1.2.1 极小型指标正向化

function [posit_x] = Min2Max(x)
    posit_x = max(x) - x;
     %posit_x = 1 ./ x;    %如果x全部都大于0,也可以这样正向化
end


1.2.2 中间型指标正向化

function [posit_x] = Mid2Max(x,best)
    M = max(abs(x-best));
    posit_x = 1 - abs(x-best) / M;
end


1.2.3 区间型指标正向化

function [posit_x] = Inter2Max(x,a,b)
    r_x = size(x,1);  % row of x 
    M = max([a-min(x),max(x)-b]);
    posit_x = zeros(r_x,1);   %zeros函数用法: zeros(3)  zeros(3,1)  ones(3)
    % 初始化posit_x全为0  初始化的目的是节省处理时间
    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


1.2.4 指标正向化处理

% function [输出变量] = 函数名称(输入变量)  
% 函数的中间部分都是函数体
% 函数的最后要用end结尾
% 输出变量和输入变量可以有多个,用逗号隔开
% function [a,b,c]=test(d,e,f)
%     a=d+e;
%     b=e+f;
%     c=f+d;
% end
% 自定义的函数要单独放在一个m文件中,不可以直接放在主函数里面(和其他大多数语言不同)
function [posit_x] = Positivization(x,type,i)
% 输入变量有三个:
% x:需要正向化处理的指标对应的原始列向量
% type: 指标的类型(1:极小型, 2:中间型, 3:区间型)
% i: 正在处理的是原始矩阵中的哪一列
% 输出变量posit_x表示:正向化后的列向量
    if type == 1  %极小型
        disp(['第' num2str(i) '列是极小型,正在正向化'] )
        posit_x = Min2Max(x);  %调用Min2Max函数来正向化
        disp(['第' num2str(i) '列极小型正向化处理完成'] )
        disp('~~~~~~~~~~~~~~~~~~~~分界线~~~~~~~~~~~~~~~~~~~~')
    elseif type == 2  %中间型
        disp(['第' num2str(i) '列是中间型'] )
        best = input('请输入最佳的那一个值: ');
        posit_x = Mid2Max(x,best);
        disp(['第' num2str(i) '列中间型正向化处理完成'] )
        disp('~~~~~~~~~~~~~~~~~~~~分界线~~~~~~~~~~~~~~~~~~~~')
    elseif type == 3  %区间型
        disp(['第' num2str(i) '列是区间型'] )
        a = input('请输入区间的下界: ');
        b = input('请输入区间的上界: '); 
        posit_x = Inter2Max(x,a,b);
        disp(['第' num2str(i) '列区间型正向化处理完成'] )
        disp('~~~~~~~~~~~~~~~~~~~~分界线~~~~~~~~~~~~~~~~~~~~')
    else
        disp('没有这种类型的指标,请检查Type向量中是否有除了1、2、3之外的其他值')
    end
end 



1.3 对正向化后的矩阵进行标准化

Z = X ./ repmat(sum(X.*X) .^ 0.5, n, 1);
disp('标准化矩阵 Z = ')
disp(Z)


标准化后的矩阵为:76.png

77.png


1.4 计算得分并归一化(计算与最大值的距离和最小值的距离,并算出得分)

D_P = sum([(Z - repmat(max(Z),n,1)) .^ 2 ],2) .^ 0.5;   % D+ 与最大值的距离向量
D_N = sum([(Z - repmat(min(Z),n,1)) .^ 2 ],2) .^ 0.5;   % D- 与最小值的距离向量
S = D_N ./ (D_P+D_N);    % 未归一化的得分
disp('最后的得分为:')
stand_S = S / sum(S)%归一化后的得分
%[sorted_S,index] = sort(stand_S ,'descend')


得分排名情况:78.png79.png













相关文章
|
人工智能
MATLAB 之 优劣解距离法(TOPSIS )-2
1. TOPSIS 法的优点 避免了数据的主观性,不需要目标函数,不用通过检验,而且能够很好的刻画多个影响指标的综合影响力度。 对于数据分布及样本量、指标多少无严格限制,既适于小样本资料,也适于多评价单元、多指标的大系统,较为灵活、方便
|
1月前
|
数据安全/隐私保护
地震波功率谱密度函数、功率谱密度曲线,反应谱转功率谱,matlab代码
地震波格式转换、时程转换、峰值调整、规范反应谱、计算反应谱、计算持时、生成人工波、时频域转换、数据滤波、基线校正、Arias截波、傅里叶变换、耐震时程曲线、脉冲波合成与提取、三联反应谱、地震动参数、延性反应谱、地震波缩尺、功率谱密度
|
1月前
|
数据安全/隐私保护
耐震时程曲线,matlab代码,自定义反应谱与地震波,优化源代码,地震波耐震时程曲线
地震波格式转换、时程转换、峰值调整、规范反应谱、计算反应谱、计算持时、生成人工波、时频域转换、数据滤波、基线校正、Arias截波、傅里叶变换、耐震时程曲线、脉冲波合成与提取、三联反应谱、地震动参数、延性反应谱、地震波缩尺、功率谱密度
基于混合整数规划的微网储能电池容量规划(matlab代码)
基于混合整数规划的微网储能电池容量规划(matlab代码)
|
1月前
|
算法 调度
面向配电网韧性提升的移动储能预布局与动态调度策略(matlab代码)
面向配电网韧性提升的移动储能预布局与动态调度策略(matlab代码)
|
1月前
|
算法 调度
含多微网租赁共享储能的配电网博弈优化调度(含matlab代码)
含多微网租赁共享储能的配电网博弈优化调度(含matlab代码)
|
1月前
|
运维 算法
基于改进遗传算法的配电网故障定位(matlab代码)
基于改进遗传算法的配电网故障定位(matlab代码)
|
1月前
|
Serverless
基于Logistic函数的负荷需求响应(matlab代码)
基于Logistic函数的负荷需求响应(matlab代码)
|
1月前
|
供应链 算法
基于分布式优化的多产消者非合作博弈能量共享(Matlab代码)
基于分布式优化的多产消者非合作博弈能量共享(Matlab代码)
|
1月前
|
算法 调度
基于多目标粒子群算法冷热电联供综合能源系统运行优化(matlab代码)
基于多目标粒子群算法冷热电联供综合能源系统运行优化(matlab代码)

热门文章

最新文章