python熵权法函数 python 熵值法
matlab—熵权法
%输入
在开州等地区,都构建了全面的区域性战略布局,加强发展的系统性、市场前瞻性、产品创新能力,以专注、极致的服务理念,为客户提供成都网站建设、做网站 网站设计制作按需定制开发,公司网站建设,企业网站建设,成都品牌网站建设,营销型网站,成都外贸网站建设,开州网站建设费用合理。
x=[
3.69 3.71 3.65 3.87
3.71 4.07 3.87 4.42
4.30 3.75 3.63 4.43
4.08 3.78 3.65 4.49
3.93 3.87 4.37 4.47
4.18 3.96 3.72 4.46
];
% 函数shang.m, 实现用熵值法求各指标(列)的权重及各数据行的得分
% x为原始数据矩阵, 一行代表一个组, 每列对应一个成分指标
% s返回各行得分, w返回各列权重
[n,m]=size(x); % n=响应面/实验组数, m=成分指标
%% 数据的归一化处理
[X,ps]=mapminmax(x',0,1);
ps.ymin=0.002; % 归一化后的最小值
ps.ymax=0.996; % 归一化后的最大值
ps.yrange=ps.ymax-ps.ymin; % 归一化后的极差,若不调整该值, 则逆运算会出错
X=mapminmax(x',ps);
% mapminmax('reverse',xx,ps); % 反归一化, 回到原数据
X=X'; % X为归一化后的数据
%% 计算第j个指标下,第i个记录占该指标的比重p(i,j)
for i=1:n
for j=1:m
p(i,j)=X(i,j)/sum(X(:,j));
end
end
%% 计算第j个指标的熵值e(j)
k=1/log(n);
for j=1:m
e(j)=-k*sum(p(:,j).*log(p(:,j)));
end
d=ones(1,m)-e; % 计算信息熵冗余度
w=d./sum(d) % 求权值w
y(:,1)=x(:,1)*w(1)+x(:,2)*w(2);%输出
y
matlab 求和函数
matlab 编写
%先来计算Ej
sumtemp=zeros[1,m];
wj=zeros[1,m]; Ej=zeros[1,m];
Ejsum=0;
k=1/(logn);
pij=zeros[m,n]; %开辟一个0矩阵 m*n的零矩阵;
pij=[p11 p21 p31 .....pn1
p12 p22 p32...........
..............................
p1m p2m............p3m]; %将pij值存入;
for j=1:1:m
for i=1:1:n
sumtemp(1,j)=pij(j,i)*log(pij(j,i))+sumtemp(1,j);
end
Ej(1,j)=-k*sumtemp(1,j);
end
for j=1:1:m
Ejsum=Ej(1,j)+Ejsum;
end
for j=1:1:m
wj(1,j)=(1-Ej(1,j))/(m-Ejsum);
end
%wj是一个1*m的矩阵 存储了j指标的商权值wj。
希望对你有帮助~
求python 熵值法实现代码
一、基本原理
在信息论中,熵是对不确定性的一种度量。信息量越大,不确定性就越小,熵也就越小;信息量越小,不确定性越大,熵也越大。
根据熵的特性,可以通过计算熵值来判断一个事件的随机性及无序程度,也可以用熵值来判断某个指标的离散程度,指标的离散程度越大,该指标对综合评价的影响(权重)越大,其熵值越小。
二、熵值法步骤
1. 选取n个国家,m个指标,则为第i个国家的第j个指标的数值(i=1, 2…, n; j=1,2,…, m);
2. 指标的归一化处理:异质指标同质化
由于各项指标的计量单位并不统一,因此在用它们计算综合指标前,先要对它们进行标准化处理,即把指标的绝对值转化为相对值,并令,从而解决各项不同质指标值的同质化问题。而且,由于正向指标和负向指标数值代表的含义不同(正向指标数值越高越好,负向指标数值越低越好),因此,对于高低指标我们用不同的算法进行数据标准化处理。其具体方法如下:
正向指标:
负向指标:
则为第i个国家的第j个指标的数值(i=1, 2…, n; j=1, 2,…, m)。为了方便起见,归一化后的数据仍记为;
3. 计算第j项指标下第i个国家占该指标的比重:
4. 计算第j项指标的熵值:
其中. 满足;
5. 计算信息熵冗余度:
6. 计算各项指标的权值:
7. 计算各国家的综合得分:
[code]function [s,w]=shang(x)
% 函数shang.m, 实现用熵值法求各指标(列)的权重及各数据行的得分
% x为原始数据矩阵, 一行代表一个国家, 每列对应一个指标
% s返回各行得分, w返回各列权重
[n,m]=size(x); % n=23个国家, m=5个指标
%% 数据的归一化处理
% Matlab2010b,2011a,b版本都有bug,需如下处理. 其它版本直接用[X,ps]=mapminmax(x',0,1);即可
[X,ps]=mapminmax(x');
ps.ymin=0.002; % 归一化后的最小值
ps.ymax=0.996; % 归一化后的最大值
ps.yrange=ps.ymax-ps.ymin; % 归一化后的极差,若不调整该值, 则逆运算会出错
X=mapminmax(x',ps);
% mapminmax('reverse',xx,ps); % 反归一化, 回到原数据
X=X'; % X为归一化后的数据, 23行(国家), 5列(指标)
%% 计算第j个指标下,第i个记录占该指标的比重p(i,j)
for i=1:n
for j=1:m
p(i,j)=X(i,j)/sum(X(:,j));
end
end
%% 计算第j个指标的熵值e(j)
k=1/log(n);
for j=1:m
e(j)=-k*sum(p(:,j).*log(p(:,j)));
end
d=ones(1,m)-e; % 计算信息熵冗余度
w=d./sum(d); % 求权值w
s=w*p'; % 求综合得分[\code]
测试程序:
data.txt 数据如下:
114.6 1.1 0.71 85.0 346
55.3 0.96 0.4 69.0 300
132.4 0.97 0.54 73.0 410
152.1 1.04 0.49 77.0 433
103.5 0.96 0.66 67.0 385
81.0 1.08 0.54 96.0 336
179.3 0.88 0.59 89.0 446
29.8 0.83 0.49 120.0 289
92.7 1.15 0.44 154.0 300
248.6 0.79 0.5 147.0 483
115.0 0.74 0.65 252.0 453
64.9 0.59 0.5 167.0 402
163.6 0.85 0.58 220.0 495
95.7 1.02 0.48 160.0 384
139.5 0.70 0.59 217.0 478
89.9 0.96 0.39 105.0 314
76.7 0.95 0.51 162.0 341
121.8 0.83 0.60 140.0 401
42.1 1.08 0.47 110.0 326
78.5 0.89 0.44 94.0 280
77.8 1.19 0.57 91.0 364
90.0 0.95 0.43 89.0 301
100.6 0.82 0.59 83.0 456
执行代码:
[code]x=load('data.txt'); % 读入数据
[s,w]=shang(x)[\code]
运行结果:
s =
Columns 1 through 9
0.0431 0.0103 0.0371 0.0404 0.0369 0.0322 0.0507 0.0229 0.0397
Columns 10 through 18
0.0693 0.0878 0.0466 0.0860 0.0503 0.0800 0.0234 0.0456 0.0536
Columns 19 through 23
0.0272 0.0181 0.0364 0.0202 0.0420
w =
0.1660 0.0981 0.1757 0.3348 0.2254
数学建模笔记——评价类模型之熵权法
嗯,这次讲一讲熵权法,一种通过样本数据确定评价指标权重的方法。
之前我们提到了TOPSIS方法,用来处理有数据的评价类模型。TOPSIS方法还蛮简单的,大概就三步。
对于上述 和 的计算,我们往往使用的是标准化数据后,待评价方案与理想最优最劣方案的欧氏距离,也就是 , 。这样的计算方式其实隐藏了一个前提,就是我们默认所有指标对最终打分的重要程度是相同的,也就是他们的权重相同。
赋予评价指标不同的权重,更符合实际建模情况,也更具有解释性。确定权重的方法我们也提到过多次了,上网查找别的研究报告,发问卷做调查,找专家赋权等等。我们了解的比较深入又显得有逼格的确定权重的方法,就是层次分析法了。但层次分析法的缺点也很明显,即主观性太强,判断矩阵基本上是由个人进行填写,往往最适用于没有数据的情况。
当我们具有数据时,能否直接从数据入手,确定权重呢?
例如上面的题目,常识很难帮助我们确定影响水质最重要的因素是哪一个,也很难告诉我们其余指标的重要程度如何衡量。倘若没有查到相关资料,那我们真的只能完全主观赋权了。这里也只有四个指标,万一来了十个二十个,单是主观赋权就比较麻烦了……
说了这么多,就可以引出一种完全由数据出发,且具有一定逼格的确定权重的方法啦,也就是熵权法。其实听了上面这句话,就应该意识到熵权法的不足之处:只从数据出发,不考虑问题的实际背景,确定权重时就可能出现与常识相悖的情况。以至于评分的时候,也会出现问题。当然啦,我们完全可以灵活一点。熵权法还是有它的优势的,而且逼格比较高……当然我也不晓得评委老师们喜不喜欢这个方法,这里只是介绍,是否采用全看个人啦~
熵——一个系统内在的混乱程度。听起来就很厉害是不是?还有一个著名的“熵增定律”,相信大家或多或少都有所耳闻。虽然是个热力学定律,但其实包含了某种哲学道理:一切事物都是从有序趋向无序。那为什么这个确定权重的方法叫熵权法呢?毕竟数据都是完全给定的了,不会再有所谓向无序的转变了。
具体的我也不晓得,简单讲下我的看法。现代科学除了用熵,还用“信息”来表达系统的有序程度。如果一个系统包含某种确定的结构,就具有着一定的信息,这种信息称之为“结构信息”。结构信息越大,系统就越有序。这么说可能比较玄学,举个简单的例子。
你看海边的沙子,如果仅是随着自然状态自由分布,基本没有什么信息可言,系统完全是混乱而无序的。
如果堆出了一个沙堡,事情就不一样了。沙子有了一定的结构,这部分沙子组成的系统相对变得有序,我们也可以从中看到一定的信息。这样的信息越多,沙堡也就越发精确,系统也就更加有序。应该可以理解的吧~
当然啦,不理解也没关系,我就随便说说。熵权法的原理是:指标的变异程度越小,所反映的现有信息量也越少,其对应的权值也越低。也就是说,熵权法是使用指标内部所包含的信息量,来确定该指标在所有指标之中的地位。由于熵衡量着系统的混乱程度,也可以拿来衡量信息的多少,方法被命名为熵权法倒也可以理解。(不过都是我猜的……)
ok,那我们如何去度量信息量的大小呢?我们可以用事件发生的概率去度量信息量。举个例子,如果小明同学的成绩一直是全校第一,小张同学的成绩一直是全校倒数第一,它们两个同时考取了清华大学。你觉得是“小明考上清华”这一事件的信息量比较大,还是“小张考上清华”这一事件的信息量比较大。很明显,“小张考上清华”这一事件中可能包含着更多的信息量。因为小明一直是全校第一,考上清华应该是一件自然而然的事情,大家都这么觉得。而小张一直是倒数第一,突然考上了清华,一件本来不可能发生的事情发生了,这里面就蕴含着许多的信息。
不过这里有个小问题,上述例子所说的信息,和熵权法原理中提到的现有信息,是不是同一类型的信息呢?
不管怎样,我们可以得出一个简单的结论,越有可能发生的事情,信息量越小,越不可能发生的事情,信息量越多。而我们使用概率衡量事件发生的可能性,因此也可以使用概率,衡量事件包含的信息量的大小。
如果把信息量用字母 表示,概率用 表示,那我们可以画出一个大致的函数关系图。
可以发现,信息量随着概率的增大而减小,且概率处于0-1之间,而信息量处在0-正无穷之间。于是,我们可以用对数函数关系来表达概率与信息量的关系。
假设 是事件 可能发生的某种情况, 表示这种情况发生的概率,我们定义 ,用来衡量 所包含的信息量。对数函数的定义域是 ,而概率的范围是 ,但是我们一般不考虑概率为0的事件。因此使用对数函数并无定义域方面的不妥。
如果事件 可能发生的情况有 ,那我们可以定义事件 的信息熵为 。我们可以看出,信息熵就是对信息量的期望值。当 时, 取最大值为 。
那信息熵越大,现有信息量到底是越大还是越小呢?上面我们说,信息熵是对信息的期望值,那应该是信息熵越大,现有信息量越大吧。其实不然,因为这里的信息的期望值,应该是对未来潜在信息的一种期望。我们说小概率事件包含的信息量多,是因为一件几乎不可能发生的事件发生了,背后很大程度上有着许许多多未被挖掘的信息,最终导致了小概率事件的发生。我们说一件大概率事件包含的信息量少,其实也是指这件大概率事件发生后,能够被挖掘出的信息量比较少。
上面未被挖掘的信息量,全部都是事件未发生前的潜在信息量,并不是现有信息量。当我们已经掌握了足够多的信息,某些事件的发生就是一件自然而然的事情,我们便可以认为这类事件属于大概率事件。当我们掌握的现有信息较少时,我们很难认为某些事自然状态下会发生,就觉得这类事件是小概率事件。觉得“年级第一考上清华”很正常,因为我们对他的考试实力已经有了足够的了解;而“倒数第一考上清华”,很可能是因为我们没有了解到一个重要信息,例如“倒数第一是故意考倒数第一的”……
嗯,以上是我的想法,也就是对应着“信息熵越大,现有信息量越小”的结论。上面的例子可能还有一些逻辑问题,仅供参考。但是要说明的意思应该是比较明了的。随机变量的信息熵越大,目前已有的信息量就越小。而我们的熵权法,其实是基于已有的信息量确定权重的。
ok,铺垫完毕,接下来就是熵权法的计算步骤了。
1.对于输入矩阵,先进行正向化和标准化(忘记了就去看评价类模型第二篇文章)。
如果正向化之后所有数据均为正数,对于矩阵
如果正向化之后的矩阵存在负数,我们可以使用 进行标准化。总而言之,需保证标准化后的数据皆为正数。
2.计算第 项指标下第 个样本所占的比重,并将其看作信息熵计算中用到的概率。
是上述经过标准化的非负矩阵,我们由 计算概率矩阵 。 中每一个元素 。嗯,不要问我为什么要用这种方法确定概率,我也不是很晓得,感兴趣自行查阅吧。查到了可以给我留言告诉我吗?
3.计算每个指标的信息熵,并计算信息效用值,归一化之后得到每个指标的熵权。
对于第 个指标而言,其信息熵计算公式为 。上文中我们提到过, 的最大值为 ,所以我们计算 时,除以一个常数 ,可以使 的范围落在 之间。
上文中也提到了,信息熵越大,已有的信息量就越小。如果 ,信息熵达到最大,此时 必须全部相同,也就是 全部相同。如果某个指标对于所有的方案都具有相同的值,那这个指标在评价时几乎不起作用。例如所有的评价对象都是男生,那评价时就不需要考虑性别因素。这也再次告诉我们,在熵权法的框架中,信息熵越大,已有信息量越小。
因此我们定义信息效用值 ,则信息效用值越大,已有信息量越多。之后我们将信息效用值进行归一化处理,就可以得到每个指标的熵权 。
以上就是用熵权法计算指标权重的全过程了,其实也不是很难。本质上就是“给包含现有信息量更多的指标以更高的权重”。之后就可以按照这个权重,计算TOPSIS中的优劣距离,甚至可以直接加权打分。
事实上,所谓的已有信息量的大小,其实也可以看成指标数据标准差的大小。所有研究对象在某一指标的数据完全一样时,标准差为0,信息熵最大。如果我们进行蒙特卡洛模拟,可以发现信息熵与标准差基本成负相关关系,也就是说标准差与已有信息量基本成正相关关系。标准差越大,数据波动越大,已有信息量也就越大,我们给它的权重也越大。某种意义上就这么回事。
清风老师提出了一个有意思的问题。在评选三好学生时,如果X是严重违纪上档案的次数,Y是被口头批评的次数,哪一个指标对三好学生评选的影响更大?很明显,实际生活中,一旦严重违纪记入档案,基本就不可能再成为三好学生。但绝大多数人这一指标的值都是0,只有很少数人是1或者2。它的波动很小,按熵权法赋权时的权重就很小。但如果真这么做了,可能某个人即使严重违纪了,依然有可能被评为三好学生。这是与实际不符合的。
这个例子告诉我们,熵权法的局限性在于,它仅凭数据的波动程度,或者说所谓的信息量来获得权重,不考虑数据的实际意义,很可能得出违背常识的结果。
清风老师之前觉得,这个方法是忽悠新手的,因为只要方差大,就认为权重大,显得很没有道理。甚至还不如我们用层次分析法给出一个主观的赋权,或者在网上查资料等等。除此之外,第一步中标准化的方法不一样,最后的结果也可能不太一样,这也是一个问题。
但其实有些问题也是可以解决的。例如上面的严重违纪的问题,完全可以把严重违纪的样本剔除掉,对剩余的样本进行排序。以及,对于现实生活中影响非常大的指标,也可以进行提前的赋权,剩下的指标再用熵权法去分余下的权重。
如果对评价指标具有现实性的了解,那完全可以看看熵权法的结果是否符合实际,再决定是否采用。如果对评价指标了解较少,层次分析法显得很随意,网上也搜不到相应的结论,那使用熵权法也是一件无可厚非的事情。
至于用指标内数据的波动程度来衡量指标的重要程度,到底有没有道理。这个也是见仁见智的事情。我个人觉得还是有一定的道理的。在标准化消除量纲的影响之后,某个指标包含的数据波动程度越大,一定意义上表明该指标对最后的结果,会有一个比较大的影响。因为它取值范围广嘛。TOPSIS中的理想最优解和理想最劣解,就是分别取各指标的最优值和最劣值。而波动程度大的指标在计算某个方案和理想方案的距离时,很显然会有较大影响,给它更高的权重,也不是完全没有道理。当然啦,这种方法还是需要排除特殊情况的,一般情况下我觉得问题不大。
(上面就是随便扯扯,别太当真。)
我觉得,只要熵权法最后的结果,没有违反普遍的常识,用一用也没有太大的问题。清风老师也说了,如果只用来比赛,熵权法就尽管用,这个方法总比自己随便定义的要好点儿吧(一般情况下)。
嗯,以上就是我想说的关于熵权法的全部东西啦。如果还想进一步了解,请自行查阅啦。
拜拜~
网页标题:python熵权法函数 python 熵值法
标题来源:http://myzitong.com/article/docojcp.html