【综合评价分析】topsis评价 原理+完整MATLAB代码+详细注释+操作实列
文章目录
设多属性决策方案(单元)为D={d1,d2,…,dm},衡量方案优劣的属性变量为x1,x2,…,xn,这些方案D中的每个方案di(i=1,2,…)的n个属性构成向量[ai1,ai2,…,ain],将其作为n维空间的一个点,能唯一地代表方案di。
正理想解C*是一个方案D中不存在的虚拟最佳方案,它的每个属性都是决策矩阵中该属性的最优值;而负理想解C0则是虚拟的最差方案,它的每个属性都是决策矩阵中该属性的最差值。
评价与决策原理:将D中每个备选方案di与正理想解C*和负理想解C0的距离进行比较,既靠近C*,又远离C0的方案是D中最优方案,并且可以据此排定D中各个备选方案的优先序。
原理中距离的选取不同,也会影响排序和评价,TOPSIS法常用的是欧几里得距离。
为了客观评价我国研究生教育的实际状况和各研究生院的教学质量,国务院学位办组织过一此研究生院的评估。为了取得经验,先选了5所研究生院,收集有关数据进行了式评估,表1给出了部分数据。
i院\指标j
人均专著x1(本/人)
生师比x2
科研经费x3(万元/年)
逾期毕业率x4(%)
1
0.1
5
5000
4.7
2
0.2
6
6000
5.6
3
0.4
7
7000
2.3
4
0.9
10
10000
2.3
5
1.2
2
400
1.8
符 号
说 明
i
研究院标号;i=1,2,3,4,5;
j
评价指标标号,j=1,2,3,4;
aij
第i研究院的第j指标的数据;
bij
aij的规范化后的数据;
cij
加权规范数据;
wj
第j指标的权重,j=1,2,3,4;
cj*
正理想解的第j指标;
cj0
负理想解的第j指标;
si*
第i研究院与正理想解的距离;
si0
第i研究院与负理想解的距离;
fi*
第i研究院的排序指标
属性值具有多种类型,包括效益型,即越大越好;成本型,即越小越好;区间型,即属性值落在某个区间最佳。
数据规范化的必要性: (1)属性的上述不同类型值放在同一个表中(矩阵)中不便处理,即不变直接从数值大小区分优劣;(2)非量纲化,多属性评估与决策的难点就是属性值的不可公度性,即每一列都有不同计量单位,需要排除量纲的选用对决策和评估的影响;(3)归一化,属性值表中不同指标的属性值数值大小差别比较大(可能是科学计数法造成),为了直观,更为了便于采用各种多属性决策与评估进行评价,需要把属性表中不同属性数值归一化,即把表中数据都处理到[0,1]区间上。
效益型数据处理(即越大越好)规范化公式(也归一化)
成本型数据处理(即数据越小越好)规范化公式
区间型数据处理公式
%数据预处理方法:线性归一化
%a为处理数据矩阵 u为选择处理方法 1为效益型 2为成本型 3为区间型 qujian为效益形中的最优属性区间 rennai为忍耐上下限区间
function b=topsis(a,u,qujian,rennai)
am1=min(a);am2=max(a);
% 效益型数据处理(即数据越大越好)
if u==1
b=(a-am1)./(am2-am1);
% 成本型数据处理(即数据越小越好)
elseif u==2
b=(am2-a)./(am2-am1);
% 区间型数据处理
elseif u==3
n=length(a);
for k=1:n
if a(k)>=rennai(1)&a(k)<qujian(1)
b(k)=1-(qujian(1)-a(k))/(qujian(1)-rennai(1));
elseif a(k)>=qujian(1)&a(k)<=qujian(2)
b(k)=1;
elseif a(k)>qujian(2)&a(k)<=rennai(2)
b(k)=1-(a(k)-qujian(2))/(rennai(2)-qujian(2));
else
b(k)=0;
end
end
end
本案中,人均专著就是效益型指标;科研经费是成本型指标;逾期毕业率是效益型指标;而生师比是区间型指标,因为生师比太大,一个老师所带研究生太多,就越糟;生师比越小也越浪费教师资源,情况也越糟。设最优区间为[5,6]。逾期毕业率为成本型指标。
A=[0.1 0.2 0.4 0.9 1.2;
5 6 7 10 2;
5000 6000 7000 10000 400;
4.7 5.6 6.7 2.3 1.8];
A=A';
a1=A(:,1);a2=A(:,2);a3=A(:,3);a4=A(:,4);
b1=topsis(a1,1);
b2=topsis(a2,3,[5,6],[2,12]);
b3=topsis(a3,2);
b4=topsis(a4,2);
[b1,b2',b3,b4]
运行结果:
i院\指标j
人均专著x1(本/人)
生师比x2
科研经费x3(万元/年)
逾期毕业率x4(%)
1
0
1
0.5208
0.4082
2
0.0909
1
0.4167
0.2245
3
0.2727
0.8333
0.3125
0
4
0.7273
0.3333
0
0.8980
5
1
0
1
1
A=[0.1 0.2 0.4 0.9 1.2;
5 6 7 10 2;
5000 6000 7000 10000 400;
4.7 5.6 6.7 2.3 1.8];
A=A';
a1=A(:,1);a2=A(:,2);a3=A(:,3);a4=A(:,4);
b1=topsis1(a1,1);
b2=topsis1(a2,3,[5,6],[2,12]);
b3=topsis1(a3,2);
b4=topsis1(a4,2);
I=[1 1/3 2 3;3 1 4 2;1/2 1/4 1 2;1/3 1/2 1/2 1];
[x,y]=eig(I);
w1=x(:,1);
w=w1/sum(w1);
c1=b1*w(1);c2=b2'*w(2);c3=b3*w(3);c4=b4*w(4);
C=[c1,c2,c3,c4];
cx=[0.2494 0.4814 0.1482 0];
cL=[0 0 0 0.1210];
for k=1:5
s1(k)=dist(C(k,:),cx');
s2(k)=dist(C(k,:),cL');
end
f=s2./(s1+s2);
[s1',s2',f']
研究院
正理想解距离S*
负理想解距离s0
综合指标f
1
0.2640
0.4929
0.6512
2
0.2442
0.4949
0.6696
3
0.2230
0.4270
0.6570
4
0.3760
0.2425
0.3920
5
0.4964
0.2901
0.3688
根据表5,5个研究院综合评价的优劣顺序为 2 3 1 4 5.
如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby
在rails源中:https://github.com/rails/rails/blob/master/activesupport/lib/active_support/lazy_load_hooks.rb可以看到以下内容@load_hooks=Hash.new{|h,k|h[k]=[]}在IRB中,它只是初始化一个空哈希。和做有什么区别@load_hooks=Hash.new 最佳答案 查看rubydocumentationforHashnew→new_hashclicktotogglesourcenew(obj)→new_has
我的主要目标是能够完全理解我正在使用的库/gem。我尝试在Github上从头到尾阅读源代码,但这真的很难。我认为更有趣、更温和的踏脚石就是在使用时阅读每个库/gem方法的源代码。例如,我想知道RubyonRails中的redirect_to方法是如何工作的:如何查找redirect_to方法的源代码?我知道在pry中我可以执行类似show-methodmethod的操作,但我如何才能对Rails框架中的方法执行此操作?您对我如何更好地理解Gem及其API有什么建议吗?仅仅阅读源代码似乎真的很难,尤其是对于框架。谢谢! 最佳答案 Ru
我的假设是moduleAmoduleBendend和moduleA::Bend是一样的。我能够从thisblog找到解决方案,thisSOthread和andthisSOthread.为什么以及什么时候应该更喜欢紧凑语法A::B而不是另一个,因为它显然有一个缺点?我有一种直觉,它可能与性能有关,因为在更多命名空间中查找常量需要更多计算。但是我无法通过对普通类进行基准测试来验证这一点。 最佳答案 这两种写作方法经常被混淆。首先要说的是,据我所知,没有可衡量的性能差异。(在下面的书面示例中不断查找)最明显的区别,可能也是最著名的,是你的
几个月前,我读了一篇关于rubygem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:
我目前正在使用以下方法获取页面的源代码:Net::HTTP.get(URI.parse(page.url))我还想获取HTTP状态,而无需发出第二个请求。有没有办法用另一种方法做到这一点?我一直在查看文档,但似乎找不到我要找的东西。 最佳答案 在我看来,除非您需要一些真正的低级访问或控制,否则最好使用Ruby的内置Open::URI模块:require'open-uri'io=open('http://www.example.org/')#=>#body=io.read[0,50]#=>"["200","OK"]io.base_ur
前言作为一名程序员,自己的本质工作就是做程序开发,那么程序开发的时候最直接的体现就是代码,检验一个程序员技术水平的一个核心环节就是开发时候的代码能力。众所周知,程序开发的水平提升是一个循序渐进的过程,每一位程序员都是从“菜鸟”变成“大神”的,所以程序员在程序开发过程中的代码能力也是根据平时开发中的业务实践来积累和提升的。提高代码能力核心要素程序员要想提高自身代码能力,尤其是新晋程序员的代码能力有很大的提升空间的时候,需要针对性的去提高自己的代码能力。提高代码能力其实有几个比较关键的点,只要把握住这些方面,就能很好的、快速的提高自己的一部分代码能力。1、多去阅读开源项目,如有机会可以亲自参与开源
matlab打开matlab,用最简单的imread方法读取一个图像clcclearimg_h=imread('hua.jpg');返回一个数组(矩阵),往往是a*b*cunit8类型解释一下这个三维数组的意思,行数、数和层数,unit8:指数据类型,无符号八位整形,可理解为0~2^8的数三个层数分别代表RGB三个通道图像rgb最常用的是24-位实现方法,即RGB每个通道有256色阶(2^8)。基于这样的24-位RGB模型的色彩空间可以表现256×256×256≈1670万色当imshow传入了一个二维数组,它将以灰度方式绘制;可以把图像拆分为rgb三层,可以以灰度的方式观察它figure(1
嗨~大家好,这里是可莉!今天给大家带来的是7个C语言的经典基础代码~那一起往下看下去把【程序一】打印100到200之间的素数#includeintmain(){ inti; for(i=100;i 【程序二】输出乘法口诀表#includeintmain(){inti;for(i=1;i 【程序三】判断1000年---2000年之间的闰年#includeintmain(){intyear;for(year=1000;year 【程序四】给定两个整形变量的值,将两个值的内容进行交换。这里提供两种方法来进行交换,第一种为创建临时变量来进行交换,第二种是不创建临时变量而直接进行交换。1.创建临时变量来
MIMO技术的优缺点优点通过下面三个增益来总体概括:阵列增益。阵列增益是指由于接收机通过对接收信号的相干合并而活得的平均SNR的提高。在发射机不知道信道信息的情况下,MIMO系统可以获得的阵列增益与接收天线数成正比复用增益。在采用空间复用方案的MIMO系统中,可以获得复用增益,即信道容量成倍增加。信道容量的增加与min(Nt,Nr)成正比分集增益。在采用空间分集方案的MIMO系统中,可以获得分集增益,即可靠性性能的改善。分集增益用独立衰落支路数来描述,即分集指数。在使用了空时编码的MIMO系统中,由于接收天线或发射天线之间的间距较远,可认为它们各自的大尺度衰落是相互独立的,因此分布式MIMO