python熵權法函數 python 熵值法

matlab—熵權法

%輸入

在開州等地區(qū),都構建了全面的區(qū)域性戰(zhàn)略布局,加強發(fā)展的系統(tǒng)性、市場前瞻性、產品創(chuàng)新能力,以專注、極致的服務理念,為客戶提供成都網站建設、做網站 網站設計制作按需定制開發(fā),公司網站建設,企業(yè)網站建設,成都品牌網站建設,營銷型網站,成都外貿網站建設,開州網站建設費用合理。

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. 指標的歸一化處理:異質指標同質化

由于各項指標的計量單位并不統(tǒng)一,因此在用它們計算綜合指標前,先要對它們進行標準化處理,即把指標的絕對值轉化為相對值,并令,從而解決各項不同質指標值的同質化問題。而且,由于正向指標和負向指標數值代表的含義不同(正向指標數值越高越好,負向指標數值越低越好),因此,對于高低指標我們用不同的算法進行數據標準化處理。其具體方法如下:

正向指標:

負向指標:

則為第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

執(zhí)行代碼:

[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方法還蠻簡單的,大概就三步。

對于上述 和 的計算,我們往往使用的是標準化數據后,待評價方案與理想最優(yōu)最劣方案的歐氏距離,也就是 , 。這樣的計算方式其實隱藏了一個前提,就是我們默認所有指標對最終打分的重要程度是相同的,也就是他們的權重相同。

賦予評價指標不同的權重,更符合實際建模情況,也更具有解釋性。確定權重的方法我們也提到過多次了,上網查找別的研究報告,發(fā)問卷做調查,找專家賦權等等。我們了解的比較深入又顯得有逼格的確定權重的方法,就是層次分析法了。但層次分析法的缺點也很明顯,即主觀性太強,判斷矩陣基本上是由個人進行填寫,往往最適用于沒有數據的情況。

當我們具有數據時,能否直接從數據入手,確定權重呢?

例如上面的題目,常識很難幫助我們確定影響水質最重要的因素是哪一個,也很難告訴我們其余指標的重要程度如何衡量。倘若沒有查到相關資料,那我們真的只能完全主觀賦權了。這里也只有四個指標,萬一來了十個二十個,單是主觀賦權就比較麻煩了……

說了這么多,就可以引出一種完全由數據出發(fā),且具有一定逼格的確定權重的方法啦,也就是熵權法。其實聽了上面這句話,就應該意識到熵權法的不足之處:只從數據出發(fā),不考慮問題的實際背景,確定權重時就可能出現與常識相悖的情況。以至于評分的時候,也會出現問題。當然啦,我們完全可以靈活一點。熵權法還是有它的優(yōu)勢的,而且逼格比較高……當然我也不曉得評委老師們喜不喜歡這個方法,這里只是介紹,是否采用全看個人啦~

熵——一個系統(tǒng)內在的混亂程度。聽起來就很厲害是不是?還有一個著名的“熵增定律”,相信大家或多或少都有所耳聞。雖然是個熱力學定律,但其實包含了某種哲學道理:一切事物都是從有序趨向無序。那為什么這個確定權重的方法叫熵權法呢?畢竟數據都是完全給定的了,不會再有所謂向無序的轉變了。

具體的我也不曉得,簡單講下我的看法?,F代科學除了用熵,還用“信息”來表達系統(tǒng)的有序程度。如果一個系統(tǒng)包含某種確定的結構,就具有著一定的信息,這種信息稱之為“結構信息”。結構信息越大,系統(tǒng)就越有序。這么說可能比較玄學,舉個簡單的例子。

你看海邊的沙子,如果僅是隨著自然狀態(tài)自由分布,基本沒有什么信息可言,系統(tǒng)完全是混亂而無序的。

如果堆出了一個沙堡,事情就不一樣了。沙子有了一定的結構,這部分沙子組成的系統(tǒng)相對變得有序,我們也可以從中看到一定的信息。這樣的信息越多,沙堡也就越發(fā)精確,系統(tǒng)也就更加有序。應該可以理解的吧~

當然啦,不理解也沒關系,我就隨便說說。熵權法的原理是:指標的變異程度越小,所反映的現有信息量也越少,其對應的權值也越低。也就是說,熵權法是使用指標內部所包含的信息量,來確定該指標在所有指標之中的地位。由于熵衡量著系統(tǒng)的混亂程度,也可以拿來衡量信息的多少,方法被命名為熵權法倒也可以理解。(不過都是我猜的……)

ok,那我們如何去度量信息量的大小呢?我們可以用事件發(fā)生的概率去度量信息量。舉個例子,如果小明同學的成績一直是全校第一,小張同學的成績一直是全校倒數第一,它們兩個同時考取了清華大學。你覺得是“小明考上清華”這一事件的信息量比較大,還是“小張考上清華”這一事件的信息量比較大。很明顯,“小張考上清華”這一事件中可能包含著更多的信息量。因為小明一直是全校第一,考上清華應該是一件自然而然的事情,大家都這么覺得。而小張一直是倒數第一,突然考上了清華,一件本來不可能發(fā)生的事情發(fā)生了,這里面就蘊含著許多的信息。

不過這里有個小問題,上述例子所說的信息,和熵權法原理中提到的現有信息,是不是同一類型的信息呢?

不管怎樣,我們可以得出一個簡單的結論,越有可能發(fā)生的事情,信息量越小,越不可能發(fā)生的事情,信息量越多。而我們使用概率衡量事件發(fā)生的可能性,因此也可以使用概率,衡量事件包含的信息量的大小。

如果把信息量用字母 表示,概率用 表示,那我們可以畫出一個大致的函數關系圖。

可以發(fā)現,信息量隨著概率的增大而減小,且概率處于0-1之間,而信息量處在0-正無窮之間。于是,我們可以用對數函數關系來表達概率與信息量的關系。

假設 是事件 可能發(fā)生的某種情況, 表示這種情況發(fā)生的概率,我們定義 ,用來衡量 所包含的信息量。對數函數的定義域是 ,而概率的范圍是 ,但是我們一般不考慮概率為0的事件。因此使用對數函數并無定義域方面的不妥。

如果事件 可能發(fā)生的情況有 ,那我們可以定義事件 的信息熵為 。我們可以看出,信息熵就是對信息量的期望值。當 時, 取最大值為 。

那信息熵越大,現有信息量到底是越大還是越小呢?上面我們說,信息熵是對信息的期望值,那應該是信息熵越大,現有信息量越大吧。其實不然,因為這里的信息的期望值,應該是對未來潛在信息的一種期望。我們說小概率事件包含的信息量多,是因為一件幾乎不可能發(fā)生的事件發(fā)生了,背后很大程度上有著許許多多未被挖掘的信息,最終導致了小概率事件的發(fā)生。我們說一件大概率事件包含的信息量少,其實也是指這件大概率事件發(fā)生后,能夠被挖掘出的信息量比較少。

上面未被挖掘的信息量,全部都是事件未發(fā)生前的潛在信息量,并不是現有信息量。當我們已經掌握了足夠多的信息,某些事件的發(fā)生就是一件自然而然的事情,我們便可以認為這類事件屬于大概率事件。當我們掌握的現有信息較少時,我們很難認為某些事自然狀態(tài)下會發(fā)生,就覺得這類事件是小概率事件。覺得“年級第一考上清華”很正常,因為我們對他的考試實力已經有了足夠的了解;而“倒數第一考上清華”,很可能是因為我們沒有了解到一個重要信息,例如“倒數第一是故意考倒數第一的”……

嗯,以上是我的想法,也就是對應著“信息熵越大,現有信息量越小”的結論。上面的例子可能還有一些邏輯問題,僅供參考。但是要說明的意思應該是比較明了的。隨機變量的信息熵越大,目前已有的信息量就越小。而我們的熵權法,其實是基于已有的信息量確定權重的。

ok,鋪墊完畢,接下來就是熵權法的計算步驟了。

1.對于輸入矩陣,先進行正向化和標準化(忘記了就去看評價類模型第二篇文章)。

如果正向化之后所有數據均為正數,對于矩陣

如果正向化之后的矩陣存在負數,我們可以使用 進行標準化??偠灾?,需保證標準化后的數據皆為正數。

2.計算第 項指標下第 個樣本所占的比重,并將其看作信息熵計算中用到的概率。

是上述經過標準化的非負矩陣,我們由 計算概率矩陣 。 中每一個元素 。嗯,不要問我為什么要用這種方法確定概率,我也不是很曉得,感興趣自行查閱吧。查到了可以給我留言告訴我嗎?

3.計算每個指標的信息熵,并計算信息效用值,歸一化之后得到每個指標的熵權。

對于第 個指標而言,其信息熵計算公式為 。上文中我們提到過, 的最大值為 ,所以我們計算 時,除以一個常數 ,可以使 的范圍落在 之間。

上文中也提到了,信息熵越大,已有的信息量就越小。如果 ,信息熵達到最大,此時 必須全部相同,也就是 全部相同。如果某個指標對于所有的方案都具有相同的值,那這個指標在評價時幾乎不起作用。例如所有的評價對象都是男生,那評價時就不需要考慮性別因素。這也再次告訴我們,在熵權法的框架中,信息熵越大,已有信息量越小。

因此我們定義信息效用值 ,則信息效用值越大,已有信息量越多。之后我們將信息效用值進行歸一化處理,就可以得到每個指標的熵權 。

以上就是用熵權法計算指標權重的全過程了,其實也不是很難。本質上就是“給包含現有信息量更多的指標以更高的權重”。之后就可以按照這個權重,計算TOPSIS中的優(yōu)劣距離,甚至可以直接加權打分。

事實上,所謂的已有信息量的大小,其實也可以看成指標數據標準差的大小。所有研究對象在某一指標的數據完全一樣時,標準差為0,信息熵最大。如果我們進行蒙特卡洛模擬,可以發(fā)現信息熵與標準差基本成負相關關系,也就是說標準差與已有信息量基本成正相關關系。標準差越大,數據波動越大,已有信息量也就越大,我們給它的權重也越大。某種意義上就這么回事。

清風老師提出了一個有意思的問題。在評選三好學生時,如果X是嚴重違紀上檔案的次數,Y是被口頭批評的次數,哪一個指標對三好學生評選的影響更大?很明顯,實際生活中,一旦嚴重違紀記入檔案,基本就不可能再成為三好學生。但絕大多數人這一指標的值都是0,只有很少數人是1或者2。它的波動很小,按熵權法賦權時的權重就很小。但如果真這么做了,可能某個人即使嚴重違紀了,依然有可能被評為三好學生。這是與實際不符合的。

這個例子告訴我們,熵權法的局限性在于,它僅憑數據的波動程度,或者說所謂的信息量來獲得權重,不考慮數據的實際意義,很可能得出違背常識的結果。

清風老師之前覺得,這個方法是忽悠新手的,因為只要方差大,就認為權重大,顯得很沒有道理。甚至還不如我們用層次分析法給出一個主觀的賦權,或者在網上查資料等等。除此之外,第一步中標準化的方法不一樣,最后的結果也可能不太一樣,這也是一個問題。

但其實有些問題也是可以解決的。例如上面的嚴重違紀的問題,完全可以把嚴重違紀的樣本剔除掉,對剩余的樣本進行排序。以及,對于現實生活中影響非常大的指標,也可以進行提前的賦權,剩下的指標再用熵權法去分余下的權重。

如果對評價指標具有現實性的了解,那完全可以看看熵權法的結果是否符合實際,再決定是否采用。如果對評價指標了解較少,層次分析法顯得很隨意,網上也搜不到相應的結論,那使用熵權法也是一件無可厚非的事情。

至于用指標內數據的波動程度來衡量指標的重要程度,到底有沒有道理。這個也是見仁見智的事情。我個人覺得還是有一定的道理的。在標準化消除量綱的影響之后,某個指標包含的數據波動程度越大,一定意義上表明該指標對最后的結果,會有一個比較大的影響。因為它取值范圍廣嘛。TOPSIS中的理想最優(yōu)解和理想最劣解,就是分別取各指標的最優(yōu)值和最劣值。而波動程度大的指標在計算某個方案和理想方案的距離時,很顯然會有較大影響,給它更高的權重,也不是完全沒有道理。當然啦,這種方法還是需要排除特殊情況的,一般情況下我覺得問題不大。

(上面就是隨便扯扯,別太當真。)

我覺得,只要熵權法最后的結果,沒有違反普遍的常識,用一用也沒有太大的問題。清風老師也說了,如果只用來比賽,熵權法就盡管用,這個方法總比自己隨便定義的要好點兒吧(一般情況下)。

嗯,以上就是我想說的關于熵權法的全部東西啦。如果還想進一步了解,請自行查閱啦。

拜拜~

新聞標題:python熵權法函數 python 熵值法
轉載來于:http://muchs.cn/article28/docojcp.html

成都網站建設公司_創(chuàng)新互聯(lián),為您提供網站維護、建站公司、搜索引擎優(yōu)化、App設計、品牌網站設計移動網站建設

廣告

聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

網站建設網站維護公司