熵值法確定權重算法及實現(xiàn)

駕駛行為打分用到
參考:http://blog.sina.com.cn/s/blog_710e9b550101aqnv.html

一或辖、基本原理

在信息論中,熵是對不確定性的一種度量怀伦。信息量越大帅容,不確定性就越小装畅,熵也就越芯е浴;信息量越小抄邀,不確定性越大耘眨,熵也越大。

根據(jù)熵的特性境肾,可以通過計算熵值來判斷一個事件的隨機性及無序程度剔难,也可以用熵值來判斷某個指標的離散程度,指標的離散程度越大奥喻,該指標對綜合評價的影響(權重)越大偶宫,其熵值越小。

二衫嵌、熵值法步驟

1. 選取n個國家读宙,m個指標,則
image.png

為第i個國家的第j個指標的數(shù)值(i=1, 2…, n; j=1,2,…, m)楔绞;

2. 指標的歸一化處理:異質指標同質化

由于各項指標的計量單位并不統(tǒng)一结闸,因此在用它們計算綜合指標前,先要對它們進行標準化處理酒朵,即把指標的絕對值轉化為相對值桦锄,并令
image.png

,從而解決各項不同質指標值的同質化問題蔫耽。而且结耀,由于正向指標和負向指標數(shù)值代表的含義不同(正向指標數(shù)值越高越好留夜,負向指標數(shù)值越低越好),因此图甜,對于高低指標我們用不同的算法進行數(shù)據(jù)標準化處理碍粥。其具體方法如下:

正向指標:

image.png

負向指標:

image.png

image.png

為第i個國家的第j個指標的數(shù)值(i=1, 2…, n; j=1, 2,…, m)。為了方便起見黑毅,歸一化后的數(shù)據(jù)仍記為[圖片上傳失敗...(image-5bd2d6-1545816016204)]

;

3. 計算第j項指標下第i個國家占該指標的比重:

image.png

4. 計算第j項指標的熵值:

image.png

其中
image.png

. 滿足
image.png

;

5. 計算信息熵冗余度:

image.png

6. 計算各項指標的權值:

image.png

7. 計算各國家的綜合得分:

image.png

注:對正逆指標歸一化的時候如果采用的方法不一樣嚼摩,正指標歸一化得到的值會大一些,逆指標的歸一化得到的值會小一些矿瘦,然后算權重枕面,逆指標對應的權重也會相應的小,從而逆指標對應的得分也小些缚去,就相當于對逆指標進行了處理潮秘。如果對正逆指標歸一化采用的方法一樣,為了體現(xiàn)逆指標的不利影響易结,最后應該總分減去逆指標的得分的枕荞。兩種方法不同,但都是為了體現(xiàn)逆指標對綜合得分的不利影響衬衬。


[code]function [s,w]=shang(x)

% 函數(shù)shang.m, 實現(xiàn)用熵值法求各指標(列)的權重及各數(shù)據(jù)行的得分

% x為原始數(shù)據(jù)矩陣, 一行代表一個國家, 每列對應一個指標

% s返回各行得分, w返回各列權重

[n,m]=size(x); % n=23個國家, m=5個指標

%% 數(shù)據(jù)的歸一化處理

% 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); % 反歸一化, 回到原數(shù)據(jù)

X=X'; % X為歸一化后的數(shù)據(jù), 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數(shù)據(jù)如下: 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'); % 讀入數(shù)據(jù)

[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
 /*極差歸化 最大值最小值 */
  /**
    *
    * @param indicatorValue  //某調行駛數(shù)據(jù)中的值
    * @param minValue  //所有行駛數(shù)據(jù)中的最小值
    * @param maxValue //所有行駛數(shù)據(jù)中的最大值
    * @param isPositive 貢獻,false 負貢獻 true
    * @param minScore
    * @param maxScore
    * @return
    */
  def computeScoreByMaxMinNormalize(indicatorValue: Double,
                                    minValue: Double,
                                    maxValue: Double,
                                    isPositive: Boolean,
                                    minScore: Double = 60,
                                    maxScore: Double = 98) = {

    val compressionFactor = (100 - maxScore) / 100
    val expandedMaxValue = maxValue * (1 + compressionFactor)
    val expandedMinValue = minValue * (1 - compressionFactor)

    val scaledValue = if (isPositive) {
      (indicatorValue - expandedMinValue) / (expandedMaxValue - expandedMinValue)
    } else {
      1 - (indicatorValue - expandedMinValue) / (expandedMaxValue - expandedMinValue)
    }

    (maxScore - minScore) * scaledValue + minScore
  }
權重系數(shù)計算
     val Ej = iter.map{ v =>
          // 先進行L1正則化
          val l1value = math.abs(v)/sumIter
          // 根據(jù)熵權法計算指標信息熵
          l1value * math.log(l1value)
        }.sum 

(max-min)f(x)+max

計算公式為:wx+b,其中w為各指標的權重系數(shù)滋尉,b為100,wx范圍為[-40, 0]
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末飞主,一起剝皮案震驚了整個濱河市狮惜,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌碌识,老刑警劉巖碾篡,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異筏餐,居然都是意外死亡开泽,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進店門魁瞪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來穆律,“玉大人,你說我怎么就攤上這事导俘÷驮牛” “怎么了?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵旅薄,是天一觀的道長辅髓。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么洛口? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任矫付,我火速辦了婚禮,結果婚禮上第焰,老公的妹妹穿的比我還像新娘技即。我一直安慰自己,他們只是感情好樟遣,可當我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布而叼。 她就那樣靜靜地躺著,像睡著了一般豹悬。 火紅的嫁衣襯著肌膚如雪葵陵。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天瞻佛,我揣著相機與錄音脱篙,去河邊找鬼。 笑死伤柄,一個胖子當著我的面吹牛绊困,可吹牛的內容都是我干的。 我是一名探鬼主播适刀,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼秤朗,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了笔喉?” 一聲冷哼從身側響起取视,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎常挚,沒想到半個月后作谭,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡奄毡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年折欠,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吼过。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡锐秦,死狀恐怖,靈堂內的尸體忽然破棺而出那先,到底是詐尸還是另有隱情农猬,我是刑警寧澤,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布售淡,位于F島的核電站斤葱,受9級特大地震影響慷垮,放射性物質發(fā)生泄漏。R本人自食惡果不足惜揍堕,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一料身、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧衩茸,春花似錦芹血、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至囊蓝,卻和暖如春饿悬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背聚霜。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工狡恬, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蝎宇。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓弟劲,卻偏偏與公主長得像,于是被迫代替她去往敵國和親姥芥。 傳聞我的和親對象是個殘疾皇子兔乞,可洞房花燭夜當晚...
    茶點故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內容