熵权法确定权重

5 篇文章 0 订阅
3 篇文章 0 订阅

熵权法确定权重

默认你们都知道是干啥的
摘自百度
按照信息论基本原理的解释,信息是系统有序程度的一个度量,熵是系统无序程度的一个度量;根据信息熵的定义,对于某项指标,可以用熵值来判断某个指标的离散程度,其信息熵值越小,指标的离散程度越大, 该指标对综合评价的影响(即权重)就越大,如果某项指标的值全部相等,则该指标在综合评价中不起作用。因此,可利用信息熵这个工具,计算出各个指标的权重,为多指标综合评价提供依据。
1.实现过程如图(百度找的,千篇一律)
网上找的2.代码

from sklearn.preprocessing import MinMaxScaler
from sklearn.datasets import make_blobs
import pandas as pd 
import matplotlib as plt 
import seaborn as sns 
import numpy as np
def weights(x):
    newX = MinMaxScaler().fit_transform(x) + 1e-10#至于为啥有这个1e-10,你细品
    P = newX / newX.sum(axis=0)
    k = 1 / np.log(newX.shape[0])
    ej = -k * (P * np.log(P)).sum(axis=0)
    gj = 1 - ej
    wj = gj / gj.sum()
    return wj

代码还算简洁吧

3.测试数据

x,label=make_blobs(centers=4,n_features=6,n_samples=10,random_state=1)#数据x

测试数据如下
测试数据

#调用运行
weights(x).round(4)

***结果:***array([0.1396, 0.1581, 0.2641, 0.1691, 0.132 , 0.1372]) ,完美无误 也没有报错 。咳咳

***测试2、数据从别人写的地方找来的 ***
171.33,151.33,0.28,0,106.36,0.05
646.66,370,1.07,61,1686.79,1.64
533.33,189.66,0.59,0,242.31,0.57
28.33,0,0.17,0,137.85,2.29
620,234,0.88,41.33,428.33,0.13
192.33,177.66,0.16,0,128.68,1.07
111,94,0.18,0,234.27,0.22
291,654,1.21,65.66,2.26,0
421.33,247,0.7,0,0.4,0
193,288.66,0.16,0,0,0
82.33,118,0.11,0,758.41,0.24
649.66,648.66,0.54,0,13.35,0.11
37.66,103.33,0.12,0,1133.51,1.1
183.33,282.33,0.55,0,624.73,1.04
1014.66,1264.66,5.07,814.66,0,0
90.66,134,0.3,0,0.15,0
200.66,98.33,0.33,0,681.54,0.51
540.66,558.66,1.08,62,2.71,0.09
80,60.66,0.13,0,910.19,0.88
530.66,281.33,0.88,36,743.21,0.72
166,133,0.13,0,246.88,2.05
377.66,310.33,0.57,0,102.89,0.57
143.33,73,0.23,0,103.94,0.1
394.66,473.66,0.56,0,1.06,0.03
535.66,447.33,0.44,0,10.59,0.08
52.66,56.66,0.52,0,0,0
1381.66,760.66,2.3,781.66,248.71,0.13
44.33,42.33,0.07,0,0.66,0
71.66,62.66,0.11,0,535.26,0.52
148.33,56.66,0.24,0,173.83,0.16

x=np.loadtxt(r'./熵权法.txt',delimiter=',')
weights(x).round(4)

运行结果:array([0.0885, 0.0748, 0.1402, 0.4108, 0.1444, 0.1413])
与那位老兄一样

权重已知,那咱们打个分吧,很简单 代码如下

def grade(wj,x):#打分
    return np.dot(x,wj.T)
x=np.loadtxt(r'./熵权法.txt',delimiter=',')
wj=weights(x).round(4)
pd.DataFrame(grade(wj,x))

自己去吧分值映射到0-100吧
result:0 41.886894
1 353.918432
2 96.539096
3 22.760156
4 151.344161
5 49.065188
6 50.739610
7 102.141814
8 55.919205
9 38.694700
10 125.676343
11 108.033669
12 174.913092
13 127.778063
14 519.767120
15 18.110330
16 123.646199
17 115.661235
18 143.191374
19 190.340330
20 60.596763
21 71.653365
22 33.200417
23 70.592993
24 82.468382
25 8.971482
26 536.534759
27 7.194607
28 88.409320
29 42.522681

至于为啥有这个1e-10,其实是为了防止出现 log(0)

图和部分数据来自这位大佬
刚开始写这个有点不熟悉流程操作 ,如有冒犯 ,请见谅。

  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值