综合评价方法之熵值法

熵值法计算步骤

  1. 选取数据
    选取 m m m个指标,共 n n n个样本,则 X i j X_{ij} Xij为第 i i i个样本的第 j j j个指标的数值, i = 1 , 2 , 3 , . . . n ; j = 1 , 2 , 3... m . i=1,2,3,...n;j=1,2,3...m. i=1,2,3,...n;j=1,2,3...m.
  2. 数据标准化处理
    各项指标的计量单位以及方向不统一的情况下,需要对对数据进行标准化,为了避免求熵值时对数无意义,可以为每个 0 0 0值加上较小数量级的实数,如 0.01 0.01 0.01.
    (1)对于正向指标(越大越好的指标)
    X ′ = X i j − M i n ( X i j ) M a x ( X i j ) − M i n ( X i j ) X^{'}=\frac{X_{ij}- Min(X_{ij})}{Max(X_{ij})-Min(X_{ij})} X=Max(Xij)Min(Xij)XijMin(Xij)
    (2)对于负向指标(越小越好的指标)
    X ′ = M a x ( X i j ) − X i j M a x ( X i j ) − M i n ( X i j ) X^{'}=\frac{Max(X_{ij})-X_{ij}}{Max(X_{ij})-Min(X_{ij})} X=Max(Xij)Min(Xij)Max(Xij)Xij
  3. 计算第 j j j项指标下第 i i i个样本占该指标的比重
    计算样本权重:
    P i j = X i j ∑ i = 1 n X i j P_{ij}=\frac{X_{ij}}{\sum_{i=1}^{n}X_{ij}} Pij=i=1nXijXij
  4. 计算第 j j j项指标的熵值
    计算指标熵值:
    e j = − K ∗ ∑ i = 1 n ( P i j ∗ l n ( P i j ) ) e_j=-K*\sum_{i=1}^{n}(P_{ij}*ln(P_{ij})) ej=Ki=1n(Pijln(Pij))
    K = 1 l n ( n ) K=\frac{1}{ln(n)} K=ln(n)1,其中n为样本个数。
  5. 计算第 j j j项指标的差异系数
    某项指标的信息效用值取决于该指标的信息熵 e j e_j ej 1 1 1之间的差值,它的值直接影响权重的大小。信息效用值越大,对评价的重要性就越大,权重也就越大。
    d j = 1 − e j d_j=1-e_j dj=1ej
  6. 计算评价指标权重
    利用熵值法估算各指标的权重,其本质是利用该指标信息的差异系数来计算,其差异系数越高,对评价的重要性就越大(或称权重越大,对评价结果的贡献就越大)
    j j j项指标的权重:
    w j = d j ∑ j = 1 m d j w_j=\frac{d_j}{\sum_{j=1}^md_j} wj=j=1mdjdj
  7. 计算各样本综合得分
    z i = ∑ j = 1 m w j x i j z_i=\sum_{j=1}^mw_jx_{ij} zi=j=1mwjxij

实例

import pandas as pd
import numpy as np

# 读取数据
data = pd.read_excel("./temp.xlsx", index_col=[0])
data.head()

在这里插入图片描述

# 正向指标标准化处理
data[["cured_rate", "StringencyIndex", "GovernmentResponseIndex", "ContainmentHealthIndex", 
      "EconomicSupportIndex"]] = (data[["cured_rate", "StringencyIndex", "GovernmentResponseIndex", "ContainmentHealthIndex", 
      "EconomicSupportIndex"]]-data[["cured_rate", "StringencyIndex", "GovernmentResponseIndex", "ContainmentHealthIndex", 
      "EconomicSupportIndex"]].min())/(data[["cured_rate", "StringencyIndex", "GovernmentResponseIndex", "ContainmentHealthIndex", 
      "EconomicSupportIndex"]].max()-data[["cured_rate", "StringencyIndex", "GovernmentResponseIndex", "ContainmentHealthIndex", 
      "EconomicSupportIndex"]].min())
# 反向指标标准化处理
data[["confirmed","confirmed_rate","dead_rate"]] = (data[["confirmed","confirmed_rate","dead_rate"]].max() - data[["confirmed","confirmed_rate","dead_rate"]])/(data[["confirmed","confirmed_rate","dead_rate"]].max()-data[["confirmed","confirmed_rate","dead_rate"]].min())

# 计算样本权重,data为标准化后的数据
p = data/data.sum()
# 计算指标熵值
K = 1/np.log(len(p))
e = -K*np.sum(p*np.log(p))
# 计算差异系数
d = 1-e
# 计算指标权重
w = d/d.sum()
# 计算综合得分
score = (w*data).sum(axis=1)

鄙人学识浅薄,如有错误之处,烦请各位道友指出。

  • 51
    点赞
  • 320
    收藏
    觉得还不错? 一键收藏
  • 20
    评论
以下是熵值法(C++实现)的代码示例: ```c++ #include <iostream> #include <vector> #include <algorithm> #include <cmath> using namespace std; double entropy(vector<double> values) { double sum = 0.0; for (double v : values) { sum += v; } double result = 0.0; for (double v : values) { if (v > 0) { result += (v / sum) * log2(v / sum); } } return -result; } int main() { vector<vector<double>> data = {{1, 2, 3}, {3, 2, 1}, {2, 2, 2}}; vector<double> weights = {0.5, 0.3, 0.2}; int numCols = data[0].size(); vector<double> entropies(numCols, 0.0); for (int j = 0; j < numCols; j++) { vector<double> values; for (int i = 0; i < data.size(); i++) { values.push_back(data[i][j]); } entropies[j] = entropy(values); } vector<double> scores(numCols, 0.0); for (int j = 0; j < numCols; j++) { double sum = 0.0; for (int i = 0; i < data.size(); i++) { sum += pow(data[i][j], 2); } double norm = sqrt(sum); for (int i = 0; i < data.size(); i++) { scores[j] += pow(data[i][j] / norm, 2); } scores[j] *= exp(-entropies[j]); } double totalScore = 0.0; for (int j = 0; j < numCols; j++) { totalScore += scores[j]; } vector<double> normalizedScores(numCols, 0.0); for (int j = 0; j < numCols; j++) { normalizedScores[j] = scores[j] / totalScore; } vector<pair<double, int>> rankedScores(numCols); for (int j = 0; j < numCols; j++) { rankedScores[j] = {normalizedScores[j], j}; } sort(rankedScores.rbegin(), rankedScores.rend()); for (auto p : rankedScores) { int col = p.second; double score = p.first; cout << "Column " << col << ": " << score << endl; } return 0; } ``` 代码中使用了一个`entropy`函数来计算给定一列数据的信息熵。然后,对于每一列数据,计算其信息熵,并使用其归一化的平方和乘以一个指数因子来计算分数。最后,对分数进行排序并输出排名。
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值