首页 > 编程语言 >(1)评价算法—熵权法

(1)评价算法—熵权法

时间:2023-01-04 18:34:14浏览次数:62  
标签:权重 样本 指标 算法 评价 2.1 lnf 权法


文章目录

  • ​​1、什么是熵权法​​
  • ​​1.1 优点​​
  • ​​1.2 缺点​​
  • ​​1.3 适用范围​​
  • ​​2、使用熵权法过程​​
  • ​​2.1 数据预处理​​
  • ​​2.1.1清洗指标极值​​
  • ​​2.1.2 归一化指标处理​​
  • ​​2.1.2.1 临界值法​​
  • ​​2.1.2.2 Z-score法​​
  • ​​2.2 计算第项指标下第i个样本值占该指标的比重​​
  • ​​2.3 计算第j项指标的熵值​​
  • ​​2.4 计算各项指标的权重​​
  • ​​3、实例​​
  • ​​4、参考资料​​

1、什么是熵权法

一种客观赋值法,确定样本每个指标的权重。涉及到信息量信息熵的个概念可以去​​这里查看​​

1.1 优点

  • 熵权法能深刻反应指标的区分能力,确定较好的权重
  • 赋权更加客观,有理论依据,可信度也更加高
  • 算法简单,实践,不需要其他软件分析

1.2 缺点

  • 无法考虑到指标与指标之间的横向影响
  • 对样本依赖性大,随建模样本变化,权重也会发生变化
  • 可能导致权重失真,最终结果无效。

1.3 适用范围

单单使用熵值法权重失真是经常发生的,要结合一定专家打分法才能发挥熵值法的优势。上层可能需要结合专家经验来构建,而底层的指标分的比较细,权重比较难确定,这种情况下采用熵值法比较合适。

另外,确定权重前需要确定指标对目标得分的影响方向,对非线性的指标要进行预处理或者剔除。还要注意处理好极值。

2、使用熵权法过程

2.1 数据预处理

2.1.1清洗指标极值

原则:剔除占样本总数不到1-2%但指标值贡献率超过20-30%以上的极值样本。大大增加样本的变异程度,但实际上却没有起到很大的作用。

2.1.2 归一化指标处理

假设对 n个样本, m个指标,则 (1)评价算法—熵权法_算法 为第 i 个样本的第 j 个指标的数值( (1)评价算法—熵权法_信息熵_02

2.1.2.1 临界值法

(1)评价算法—熵权法_信息熵_03

2.1.2.2 Z-score法

(1)评价算法—熵权法_权重_04

2.2 计算第项指标下第i个样本值占该指标的比重

(1)评价算法—熵权法_极值_05

2.3 计算第j项指标的熵值

(1)评价算法—熵权法_极值_06

2.4 计算各项指标的权重

各项指标的信息熵为
(1)评价算法—熵权法_权重_07

通过信息熵计算各指标的权重
(1)评价算法—熵权法_权重_08

3、实例

import pandas as pd
import numpy as np
import math
from numpy import array
from sklearn.preprocessing import MinMaxScaler
from sklearn.datasets import load_iris

# 1读取数据,使用sklearn自带的鸢尾数据集
iris = load_iris()
x = iris.data
df = pd.DataFrame(x)

# 2数据预处理 ,去除空值的记录
df.dropna(inplace=True)

# 定义熵权法函数
def cal_weight(x):
Scaler = MinMaxScaler().fit(x)
'''熵值法计算变量的权重'''
# 标准化
x = Scaler.transform(x)

# 求k
rows = x.shape[0] # 行
cols = x.shape[1] # 列
k = 1.0 / math.log(rows)

# 矩阵计算--
# 信息熵
# p=array(p)
x = array(x)
lnf = [[None] * cols for i in range(rows)]
lnf = array(lnf)
for i in range(0, rows):
for j in range(0, cols):
if x[i][j] == 0:
lnfij = 0.0
else:
p = x[i][j] / x.sum(axis=0)[j]
lnfij = math.log(p) * p * (-k)
lnf[i][j] = lnfij
lnf = pd.DataFrame(lnf)
E = lnf

# 计算冗余度
d = 1 - E.sum(axis=0)

# 计算各指标的权重
w = np.zeros((x.shape[1],))

for j in range(cols):
wj = d[j] / sum(d)
w[j] = wj
# 计算各样本的综合得分,用最原始的数据

w = pd.DataFrame(w)
return w


if __name__ == '__main__':
# 计算df各字段的权重
w = cal_weight(df) # 调用cal_weight
w.index = iris.feature_names
w.columns = ['weight']
print(w)

4、参考资料

​https://hujichn.github.io/2016/08/10/熵值法确定权重的步骤及适用范围/​


标签:权重,样本,指标,算法,评价,2.1,lnf,权法
From: https://blog.51cto.com/u_14597003/5989180

相关文章