熵值法求权重
文章目錄
- 一、熵值法原理分析
- (一)選取數(shù)據(jù)
- (二)數(shù)據(jù)標(biāo)準(zhǔn)化處理
- 1、正負(fù)相關(guān)性處理
- (1)正相關(guān)指標(biāo)
- (2)對于負(fù)向指標(biāo)(越小越好的指標(biāo))
- 3、計算第 jjj 項指標(biāo)下第 iii 個樣本占該指標(biāo)的比重
- 4、計算第 jjj 項指標(biāo)的熵值
- 5、計算第 jjj 項指標(biāo)的差異系數(shù)
- 6、計算評價指標(biāo)權(quán)重
- 7、計算各樣本綜合得分
- 二、測試案例
- 1、本案例數(shù)據(jù)集以2012年全國大學(xué)生數(shù)學(xué)建模A題部分?jǐn)?shù)據(jù)為例
- 2、完整代碼
- 三、測試案例運行結(jié)果
- 四、測試表格
一、熵值法原理分析
(一)選取數(shù)據(jù)
m個樣本,共n個指標(biāo),XijX_{ij}Xij?為為第iii個樣本的第jjj個指標(biāo)的數(shù)值,i=1,2,3,...m;j=1,2,3...n.i = 1 , 2 , 3 , . . . m ; j = 1 , 2 , 3... n.i=1,2,3,...m;j=1,2,3...n.
(二)數(shù)據(jù)標(biāo)準(zhǔn)化處理
1、正負(fù)相關(guān)性處理
各項指標(biāo)的計量單位以及方向不統(tǒng)一的情況下,需要對對數(shù)據(jù)進行標(biāo)準(zhǔn)化,為了避免求熵值時對數(shù)無意義,可以為每個值加上較小數(shù)量級的實數(shù),如0.001
(1)正相關(guān)指標(biāo)
X′=Xij?Min(Xij)Max(Xij)?Min(Xij)X'= \frac{X_{ij}- Min(X_{ij})}{Max(X_{ij})-Min(X_{ij})}X′=Max(Xij?)?Min(Xij?)Xij??Min(Xij?)?
(2)對于負(fù)向指標(biāo)(越小越好的指標(biāo))
X′=Max(Xij)?XijMax(Xij)?Min(Xij)X' = \frac{Max(X_{ij})-X_{ij}}{Max(X_{ij})-Min(X_{ij})}X′=Max(Xij?)?Min(Xij?)Max(Xij?)?Xij??
3、計算第 jjj 項指標(biāo)下第 iii 個樣本占該指標(biāo)的比重
計算樣本權(quán)重:
Pij=Xij∑i=1nXijP_{ij} = \frac{X_{ij}}{\sum_{i=1}^nX_{ij}}Pij?=∑i=1n?Xij?Xij??
4、計算第 jjj 項指標(biāo)的熵值
計算指標(biāo)熵值:
ej=?1ln(m)?∑i=1m(Pij?ln(Pij))e_j = -\frac{1}{ln(m)}*\sum_{i=1}^m(P_{ij}*ln(P_{ij}))ej?=?ln(m)1??i=1∑m?(Pij??ln(Pij?))
,其中m為樣本個數(shù)。
5、計算第 jjj 項指標(biāo)的差異系數(shù)
某項指標(biāo)的信息效用值取決于該指標(biāo)的信息熵與 1 之間的差值,它的值直接影響權(quán)重的大小。信息效用值越大,對評價的重要性就越大,權(quán)重也就越大。
dj=1?ejd_j=1-e_jdj?=1?ej?
6、計算評價指標(biāo)權(quán)重
利用熵值法估算各指標(biāo)的權(quán)重,其本質(zhì)是利用該指標(biāo)信息的差異系數(shù)來計算,其差異系數(shù)越高,對評價的重要性就越大(或稱權(quán)重越大,對評價結(jié)果的貢獻就越大)
第j jj項指標(biāo)的權(quán)重:
wj=dj∑j=1mdjw_j=\frac{d_j}{\sum_{j=1}^md_j}wj?=∑j=1m?dj?dj??
7、計算各樣本綜合得分
zi=∑j=1mwjxijz_i=\sum_{j=1}^mw_jx_{ij}zi?=j=1∑m?wj?xij?
二、測試案例
1、本案例數(shù)據(jù)集以2012年全國大學(xué)生數(shù)學(xué)建模A題部分?jǐn)?shù)據(jù)為例
| 葡萄樣品1 | 2027.96 | 101.22 | 393.42 | 77.61 | 266.6 | 723.88 |
| 葡萄樣品2 | 2128.82 | 64.43 | 140.62 | 71.94 | 39.26 | 1560.97 |
| 葡萄樣品3 | 8397.28 | 108.07 | 222.35 | 173.08 | 67.54 | 7472.28 |
| 葡萄樣品4 | 2144.68 | 79.39 | 133.83 | 158.74 | 156.72 | 1182.23 |
| 葡萄樣品5 | 1844 | 52.28 | 145.09 | 164.05 | 102.43 | 816.08 |
| 葡萄樣品6 | 3434.17 | 68.01 | 102.42 | 75.78 | 80.6 | 2932.76 |
| 葡萄樣品7 | 2391.16 | 65.1 | 267.76 | 239.2 | 208.97 | 1096.28 |
| 葡萄樣品8 | 1950.76 | 72.09 | 345.87 | 44.23 | 176.02 | 962.01 |
2、完整代碼
import numpy as np import pandas as pd## 讀取數(shù)據(jù) data=pd.read_csv('redputao.csv',encoding='utf-8',index_col=0) indicator=data.columns.tolist() ## 指標(biāo)個數(shù) 多少列 project=data.index.tolist() ## 樣本個數(shù) 多少行 value=data.values print(indicator) print(project) print(value)## 定義數(shù)據(jù)標(biāo)準(zhǔn)化函數(shù)。為了避免求熵值時對數(shù)無意義,對數(shù)據(jù)進行平移,對標(biāo)準(zhǔn)化后的數(shù)據(jù)統(tǒng)一加了常數(shù)0.001 def std_data(value,flag):for i in range(len(indicator)):if flag[i]=='+':value[:,i]=(value[:,i]-np.min(value[:,i],axis=0))/(np.max(value[:,i],axis=0)-np.min(value[:,i],axis=0))+0.01elif flag[i]=='-':value[:,i]=(np.max(value[:,i],axis=0)-value[:,i])/(np.max(value[:,i],axis=0)-np.min(value[:,i],axis=0))+0.01return value# 定義熵值法函數(shù)、熵值法計算變量的權(quán)重 def cal_weight(indicator, project, value):p = np.array([[0.0 for i in range(len(indicator))] for i in range(len(project))])# print(p)for i in range(len(indicator)):p[:, i] = value[:, i] / np.sum(value[:, i], axis=0)e = -1 / np.log(len(project)) * sum(p * np.log(p)) # 計算熵值g = 1 - e # 計算一致性程度w = g / sum(g) # 計算權(quán)重return w# 表示各項指標(biāo)為正向指標(biāo)還是反向指標(biāo) flag=["+","+","+","+","+", "+","+","+","+","+","+","+","+","+","+", "+","+","+","+","+","+","+","+","+","+", "+","+","+","+","+","+","+","+","+","+", "+","+","+","+","+","+","+","+","+","+", "+","+","+","+","+","+","+","+","+"]# 調(diào)用函數(shù)將數(shù)據(jù)標(biāo)準(zhǔn)化,即為每個數(shù)據(jù)添加正相關(guān)還是負(fù)相關(guān)標(biāo)志 std_value=std_data(value, flag)# 調(diào)用函數(shù)求權(quán)重 w = cal_weight(indicator, project, std_value) w = pd.DataFrame(w, index=data.columns, columns=['權(quán)重']) print(w)# 調(diào)用函數(shù)求得分 score = np.dot(std_value, w).round(4) # 對應(yīng)數(shù)據(jù)與權(quán)重相乘得到分?jǐn)?shù),結(jié)果保留四位小數(shù) score = pd.DataFrame(score, index=data.index, columns=['綜合得分']).sort_values(by=['綜合得分'], ascending=False) print(score)三、測試案例運行結(jié)果
運行結(jié)果
四、測試表格
csv下載鏈接 提取碼:1234
總結(jié)
- 上一篇: 指标权重确定方法之熵权法
- 下一篇: CAPL脚本如何实现TCP Socket