数学建模——TOPSIS法

基本原理

基本概念

  • TOPSIS法(逼近理想解排序法):
    常称为优劣解距离法,是一种常用的综合评价方法,其能充分利用原始数据的信息,其结果能精确地反映各评价方案之间的差距

TOPSIS法基本过程:

  1. 将数据矩阵统一指标类型(一般正向化处理)
  2. 标准化处理消除量纲
  3. 计算对象与最优/最劣方案的距离
  4. 计算得分并归一化

TOPSIS法详细过程

步骤a 统一指标类型

常见的四种指标及正向化方法:

名称特点转换函数
极大型指标越大(多)越好None
极小型指标越小(少)越好 m a x − x ( 常 用 ) 、 1 / x ( 需 为 正 数 ) max-x(常用)、1/x(需为正数) maxx()1/x()
中间型指标越接近某个值越好 1 − ∣ x i − x b e s t ∣ M 1-\frac{\vert x_i-x_{best}\vert }{M} 1Mxixbest,其中 M = m a x { ∣ x i − x b e s t ∣ } M=max\{\vert x_i-x_{best}\vert \} M=max{xixbest}
区间型指标落在某个区间最好 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{amin{xi}},max{xi}bxi=1Maxi11Mxib,,,xi<aaxibx>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(Zjzij)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++DiDi0Si1Si

归一化: 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')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清上尘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值