当前位置:   article > 正文

基于熵权法的topsis分析(包含matlab源码以及实例)_熵权topsis法

熵权topsis法

            

目录

一、算法简述

         1.topsis分析法

         2.熵权法

         3.两种算法的结合

二、算法步骤

         1.判断指标类型

         2.数据正向化

         3.正向化矩阵标准化

         4.计算概率矩阵P

         5.计算各个指标的信息熵

         6.计算信息效用值

         7.计算熵权

         8.计算最优距离和最劣距离

         9.计算未归一化得分以及归一化得分

三、MATLAB代码实现

        1.主函数topsis.m

        2.正向化函数 Positivization.m

        3.熵权法函数 Entropy_Method.m

        4.ln函数 mylog.m

          写在前面

                 本篇不介绍熵权法以及topsis分析法的详细原理 若想了解请移步其他博客!!!

                恰恰相反,本篇为懒人福利,适用于数学建模等需要快速解决问题的赛事。

一、算法简述

       1.topsis分析法

            topsis算法是一种常见的综合评价办法,适用于有多个指标时的方案选择问题,如下图所示

            ps:以下数据为自行创造 仅用于讲解

方案\指标可采矿量基建投资土地PH值人员
方案1521250005.745
方案2361526004.032
方案3501154125.043
方案4403832004.338
方案5446236004.840

            通过topsis分析法我们可以通过优劣分析,为五个方案分别赋予一个评分,显然评分越高,综合考量下来优势越大。

        2.熵权法

                我们已经知道topsis分析法可以给每个方案一个评分,但这个评分是在各个指标所占权重相同的前提下来算的,但我们遇到的问题大部分肯定有的指标重要,有的不那么重要,我们又不能去主观给他赋权重,这个问题应该怎么解决?没错,熵权法可以!

                熵权法是一种客观赋权方法,通过计算指标的信息熵,根据相对变化程度对整体的影响来决定指标权重。(不懂不要紧 会用就行)

        3.两种算法的结合

                了解了两种算法的基本原理,我们很容易想到,可以通过熵权法算出各指标的权重,进而通过topsis分析法进行评分,就能得到可信度较高的结果

二、算法步骤

        1.判断指标类型

                topsis模型一般是在所有指标均为极大型指标(数据越大越好)的基础上进行运算的,因此要判断各个指标都是什么类型,方便后面进行数据正向化。

                一般的常见类型有

                极大型(数据越大越好) 比如上方表格中的可采矿量

                极小型(数据越小越好)  比如上方表格中的基建投资

                中间型(数据稳定在某个固定的值最好) 比如上方表格里的ph最好保持在4.3

                区间型(数据在某个区间内最好)比如上方表格中的人员最好在[30,40]之间

         2.数据正向化

                极小型数据(PS:当数据不全为正数时 只能使用第二个公式)

                        

                  上面表格的基建投资极小型数据 我们采用第二个公式来正向化

方案\基建投资正向化前正向化后
方案15000412
方案226002812
方案354120
方案432002212
方案536001812

                中间型数据

                首先应该输入一个中间最优值{x_{best}}再进行正向化

                        

                上面表格的土地PH值中间型数据 我们的{x_{best}}是4.3 

方案\土地PH正向化前正向化后
方案15.70
方案24.00.7857
方案35.00.5
方案44.31
方案54.80.6429

                区间型数据

                首先应该输入区间下限a和区间上限b再进行正向化

                          M=max(amin(xi),max(xi)b)M=max(amin(xi),max(xi)b)

xi={1axiMxi<a1axib1xibMxi>bxi=1axiM11xibMxi<aaxibxi>b                

                 上面表格的人员指标为区间型数据 我们的下限a是30 上限b是40  M是5

方案\人员正向化前正向化后
方案1450
方案2321
方案3430.4
方案4381
方案5401

                正向化结束的矩阵称为正向化矩阵。如下表

方案\指标可采矿量基建投资土地PH人员
方案1521241200
方案2361528120.78571
方案3501100.50.4
方案44038221211
方案5446218120.64291

         3.正向化矩阵标准化

                正向矩阵标准化是为了消除不同量纲的影响。

                        

方案\指标可采矿量基建投资土地PH人员
方案10.51720.102200
方案20.3587

0.6975

0.52030.5625
方案30.497200.33110.2250
方案40.40070.54870.66220.5625
方案50.44280.44950.42570.5625

                这里得到的标准化矩阵要求所有数据必须全部大于等于0,如果有负数,需要按照以下方式重新进行标准化

                

            PS:4-7步是熵权法确定指标权重的步骤 如果想实现各指标权重相同  默认是1/m

         4.计算概率矩阵P

                         pij=zijni=1zijpij=zijni=1zij        

方案\指标可采矿量基建投资土地PH人员
方案10.23330.056800
方案20.16180.38800.26830.2941
方案30.224300.17070.1176
方案40.18080.30520.34150.2941
方案50.19970.25000.21950.2941

         5.计算各个指标的信息熵

                        ej=1ln(n)ni=1(pijln(pij))ej=1ln(n)ni=1(pijln(pij))

                PS:由于概率矩阵中可能存在数值为0,但ln(0)为负无穷 我们这里将ln(0)设为0

指标可采矿量基建投资土地PH人员
信息熵0.99450.76990.84160.8275

         6.计算信息效用值

                        dj=1ejdj=1ej

指标可采矿量基建投资土地PH人员
信息效用值0.00550.23010.15840.1726

         7.计算熵权

                        wj=djmj=1djwj=djmj=1dj

指标可采矿量基建投资土地PH人员
熵权0.00980.40610.27950.3047

        8.计算最优距离和最劣距离

                定义最大值Z+=(max(z11,z21,...,zn1),max(z12,z22,...,zn2),...,max(z1m,z2m,...,znm))Z+=(max(z11,z21,...,zn1),max(z12,z22,...,zn2),...,max(z1m,z2m,...,znm))

指标可采矿量基建投资土地PH人员
Z+0.51720.69750.66220.5625

                定义最小值

Z=(min(z11,z21,...,zn1),min(z12,z22,...,zn2),...,min(z1m,z2m,...,znm))   

指标可采矿量基建投资土地PH人员
Z0.3587000

                定义第i个(i=1,2, ... ,n)评价对象与最大值的距离

                        D+i=mj=1Wj(Z+jzij)2

                 定义第i个(i=1,2, ... ,n)评价对象与最小值的距离

                        Di=mj=1Wj(Zjzij)2

方案\距离D+D
方案10.60240.0670

方案2

0.07660.6080
方案30.51270.2151
方案40.09550.5841
方案50.20170.4787

         9.计算未归一化得分以及归一化得分

                未归一化得分

                        Si=DiD+i+Di

                归一化得分(分数相加等于1)

                        ˜S=Sjmi=1Sj

方案\距离S˜S
方案10.10010.0352

方案2

0.88800.3120
方案30.29550.1038
方案40.85940.3019
方案50.70360.2472

                        由最终的˜S可知,五个方案的的排名为5,1,4,2,3

三、MATLAB代码实现

        代码部分共有四个.m文件 一个主文件 三个函数

1.主函数topsis.m

  1. [n,m] = size(X);
  2. disp(['共有' num2str(n) '个评价对象 共有' num2str(m) '个评价指标'])
  3. judge=input(['这' num2str(m) '个指标是否需要正向化处理,需要请输入1 不需要请输入0: ']);
  4. if judge==1
  5. Position=input('请输入需要正向化处理的列 比如2,3,6列需要处理 则输入[2,3,6]: ');
  6. disp('请输入这些列分别是什么指标类型(1:极小型 2:中间型 3:区间型)')
  7. Type=input('比如 2 3 6列分别是极小型 区间型 中间型 则输入[1,3,2]: ');
  8. for i=1:size(Position,2)
  9. X(:,Position(i))=Positivization(X(:,Position(i)),Type(i),Position(i));
  10. end
  11. disp('正向化后的矩阵为 X=');
  12. disp(X);
  13. end
  14. %标准化
  15. Z = X ./ repmat(sum(X.*X) .^ 0.5, n, 1);
  16. disp('标准化矩阵 Z = ')
  17. disp(Z)
  18. disp("请输入是否需要增加权重向量,需要输入1,不需要输入0")
  19. Judge = input('请输入是否需要增加权重: ');
  20. if Judge == 1
  21. if sum(sum(Z<0))>0
  22. disp('标准化矩阵中存在负数 正在重新标准化')
  23. for j=1:m
  24. minn=min(Z(:,j));
  25. maxx=max(Z(:,j));
  26. for i=1:n
  27. Z(i,j)=(Z(i,j)-minn)/(maxx-minn)
  28. end
  29. end
  30. disp('标准化完成 矩阵Z= ');
  31. disp(Z);
  32. end
  33. W = Entropy_Method(Z);
  34. disp('熵权法确定的权重为:');
  35. disp(W);
  36. else
  37. W = ones(1,m) ./ m ; %如果不需要加权重就默认权重都相同,即都为1/m
  38. end
  39. D_P = sum([W .* (Z - repmat(max(Z),n,1)) .^ 2 ],2) .^ 0.5;%最优距离
  40. D_N = sum([W .* (Z - repmat(min(Z),n,1)) .^ 2 ],2) .^ 0.5;%最劣距离
  41. S = D_N ./ (D_P+D_N);%相对接近度(可用来当得分)
  42. disp('最后的得分为:')
  43. stand_S = S / sum(S)%得分归一化 最后各方案得分相加为1
  44. [sorted_S,index] = sort(stand_S ,'descend');
  45. disp('按得分从高到底排列方案 分别为: ');
  46. disp(index);%方案排名

2.正向化函数 Positivization.m

  1. %正向化 Positivization 三个输入变量分别为目前处理的列向量 该列的指标类型 目前处理的是第几列
  2. %输出变量为正向化后的列向量
  3. function [posit_x]=Positivization(x,type,i)
  4. if type==1 %极小型
  5. posit_x=max(x)-x;
  6. %posit_x=1./x 如果该列数据全部大于0 也可以这样正向化
  7. elseif type==2%中间型
  8. best=input('请输入最佳的值: ');
  9. M=max(abs(x-best));
  10. posit_x=1-abs(x-best)/M;
  11. elseif type==3%区间型
  12. a=input('请输入区间下限: ');
  13. b=input('请输入区间上限: ');
  14. MM=max(a-min(x),max(x)-b);
  15. posit_x = zeros(size(x,1),1);
  16. for i=1:size(x,1)
  17. if x(i)<a
  18. posit_x(i)=1-(a-x(i))/MM;
  19. elseif x(i)>b
  20. posit_x(i)=1-(x(i)-b)/MM;
  21. else
  22. posit_x(i)=1;
  23. end
  24. end
  25. else
  26. disp('请正确输入指标类型')
  27. end
  28. end

3.熵权法函数 Entropy_Method.m

  1. %计算权重
  2. function [W] = Entropy_Method(Z)
  3. [n,m]=size(Z);
  4. d=zeros(1,m);
  5. for i=1:m
  6. x = Z(:,i);
  7. p = x./sum(x);%概率矩阵
  8. e = -sum(p .* mylog(p)) / mylog(n);%信息熵
  9. d(i)=1-e;%信息效用值
  10. end
  11. W=d./sum(d);%熵权
  12. end

 4.ln函数 mylog.m

  1. function [lnp] = mylog(p)
  2. n = length(p); % 向量的长度
  3. lnp = zeros(n,1); % 初始化最后的结果
  4. for i = 1:n % 开始循环
  5. if p(i) == 0 % 如果第i个元素为0
  6. lnp(i) = 0; % 那么返回的第i个结果也为0
  7. else
  8. lnp(i) = log(p(i));
  9. end
  10. end
  11. end

注:本篇文章为自己系统了解后写下,不保证不会出现问题。大家如果对文章存在困惑或者质疑 ,欢迎在评论区留言。

参考链接

熵值法与TOPSIS法以及两者结合 作者:卖山楂啦prss

数学建模之熵权法——基于Topsis模型 作者:我本无忧

基于熵权法的Topsis模型(清风数学建模课后笔记) 作者:weixin_57449924   

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/70072
推荐阅读
相关标签
  

闽ICP备14008679号