熵值法求权重
文章目錄
- 一、熵值法原理分析
- (一)選取數據
- (二)數據標準化處理
- 1、正負相關性處理
- (1)正相關指標
- (2)對于負向指標(越小越好的指標)
- 3、計算第 jjj 項指標下第 iii 個樣本占該指標的比重
- 4、計算第 jjj 項指標的熵值
- 5、計算第 jjj 項指標的差異系數
- 6、計算評價指標權重
- 7、計算各樣本綜合得分
- 二、測試案例
- 1、本案例數據集以2012年全國大學生數學建模A題部分數據為例
- 2、完整代碼
- 三、測試案例運行結果
- 四、測試表格
一、熵值法原理分析
(一)選取數據
m個樣本,共n個指標,XijX_{ij}Xij?為為第iii個樣本的第jjj個指標的數值,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.
(二)數據標準化處理
1、正負相關性處理
各項指標的計量單位以及方向不統一的情況下,需要對對數據進行標準化,為了避免求熵值時對數無意義,可以為每個值加上較小數量級的實數,如0.001
(1)正相關指標
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)對于負向指標(越小越好的指標)
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 項指標下第 iii 個樣本占該指標的比重
計算樣本權重:
Pij=Xij∑i=1nXijP_{ij} = \frac{X_{ij}}{\sum_{i=1}^nX_{ij}}Pij?=∑i=1n?Xij?Xij??
4、計算第 jjj 項指標的熵值
計算指標熵值:
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為樣本個數。
5、計算第 jjj 項指標的差異系數
某項指標的信息效用值取決于該指標的信息熵與 1 之間的差值,它的值直接影響權重的大小。信息效用值越大,對評價的重要性就越大,權重也就越大。
dj=1?ejd_j=1-e_jdj?=1?ej?
6、計算評價指標權重
利用熵值法估算各指標的權重,其本質是利用該指標信息的差異系數來計算,其差異系數越高,對評價的重要性就越大(或稱權重越大,對評價結果的貢獻就越大)
第j jj項指標的權重:
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、本案例數據集以2012年全國大學生數學建模A題部分數據為例
| 葡萄樣品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## 讀取數據 data=pd.read_csv('redputao.csv',encoding='utf-8',index_col=0) indicator=data.columns.tolist() ## 指標個數 多少列 project=data.index.tolist() ## 樣本個數 多少行 value=data.values print(indicator) print(project) print(value)## 定義數據標準化函數。為了避免求熵值時對數無意義,對數據進行平移,對標準化后的數據統一加了常數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# 定義熵值法函數、熵值法計算變量的權重 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) # 計算權重return w# 表示各項指標為正向指標還是反向指標 flag=["+","+","+","+","+", "+","+","+","+","+","+","+","+","+","+", "+","+","+","+","+","+","+","+","+","+", "+","+","+","+","+","+","+","+","+","+", "+","+","+","+","+","+","+","+","+","+", "+","+","+","+","+","+","+","+","+"]# 調用函數將數據標準化,即為每個數據添加正相關還是負相關標志 std_value=std_data(value, flag)# 調用函數求權重 w = cal_weight(indicator, project, std_value) w = pd.DataFrame(w, index=data.columns, columns=['權重']) print(w)# 調用函數求得分 score = np.dot(std_value, w).round(4) # 對應數據與權重相乘得到分數,結果保留四位小數 score = pd.DataFrame(score, index=data.index, columns=['綜合得分']).sort_values(by=['綜合得分'], ascending=False) print(score)三、測試案例運行結果
運行結果
四、測試表格
csv下載鏈接 提取碼:1234
總結
- 上一篇: 指标权重确定方法之熵权法
- 下一篇: CAPL脚本如何实现TCP Socket