駕駛行為打分用到
參考:http://blog.sina.com.cn/s/blog_710e9b550101aqnv.html
一或辖、基本原理
在信息論中,熵是對不確定性的一種度量怀伦。信息量越大帅容,不確定性就越小装畅,熵也就越芯е浴;信息量越小抄邀,不確定性越大耘眨,熵也越大。
根據(jù)熵的特性境肾,可以通過計算熵值來判斷一個事件的隨機性及無序程度剔难,也可以用熵值來判斷某個指標的離散程度,指標的離散程度越大奥喻,該指標對綜合評價的影響(權重)越大偶宫,其熵值越小。
二衫嵌、熵值法步驟
1. 選取n個國家读宙,m個指標,則為第i個國家的第j個指標的數(shù)值(i=1, 2…, n; j=1,2,…, m)楔绞;
2. 指標的歸一化處理:異質指標同質化
由于各項指標的計量單位并不統(tǒng)一结闸,因此在用它們計算綜合指標前,先要對它們進行標準化處理酒朵,即把指標的絕對值轉化為相對值桦锄,并令,從而解決各項不同質指標值的同質化問題蔫耽。而且结耀,由于正向指標和負向指標數(shù)值代表的含義不同(正向指標數(shù)值越高越好留夜,負向指標數(shù)值越低越好),因此图甜,對于高低指標我們用不同的算法進行數(shù)據(jù)標準化處理碍粥。其具體方法如下:
正向指標:
負向指標:
為第i個國家的第j個指標的數(shù)值(i=1, 2…, n; j=1, 2,…, m)。為了方便起見黑毅,歸一化后的數(shù)據(jù)仍記為[圖片上傳失敗...(image-5bd2d6-1545816016204)]
;
3. 計算第j項指標下第i個國家占該指標的比重:
4. 計算第j項指標的熵值:
;
5. 計算信息熵冗余度:
6. 計算各項指標的權值:
7. 計算各國家的綜合得分:
注:對正逆指標歸一化的時候如果采用的方法不一樣嚼摩,正指標歸一化得到的值會大一些,逆指標的歸一化得到的值會小一些矿瘦,然后算權重枕面,逆指標對應的權重也會相應的小,從而逆指標對應的得分也小些缚去,就相當于對逆指標進行了處理潮秘。如果對正逆指標歸一化采用的方法一樣,為了體現(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]