原文: https://mp.weixin.qq.com/s/vPNPdbZy11q1qsfEz9etZQ
1 エントロピー重み付け法の概要
エントロピーは、変化の能力を意味するギリシャ語の「変化」に由来しており、ドイツの物理学者クラウジウスは、熱力学の第 2 法則を形成するためにエントロピーの概念を導入しました。
エントロピーの概念は熱力学に由来し、プロセスを説明するために使用される不可逆現象です。その後、シャノンが初めてエントロピーを情報理論に導入し、情報理論では、エントロピーは物事の発生の不確実性を表現するために使用され、エントロピーは不確実性の尺度として使用されます。
エントロピー重み法とは、各指標の調査データが提供する情報量に基づいて指標の重みを決定する方法であり、その基本原理は、指標のエントロピー値が小さく、エントロピー重みが大きければ、インジケーターが提供できる情報量が多ければ多いほど、意思決定においてそのインジケーターが果たせる役割は大きくなり、逆にインジケーターのエントロピー値が大きく、エントロピー重みが小さい場合、そのインジケーターは提供できることを意味します。情報が減り、意思決定における役割が大きくなりますが、その影響は小さくなります。
エントロピー重み付け法は、データ自体の離散性に依存した客観的な割り当て方法であり、複数の指標を組み合わせてサンプル間の比較を行うことで、サンプルを包括的にスコアリングするために使用されます。
2 エントロピー重み法の計算手順
1) データの
選択mmを選択m 個のインジケーター、合計nn個のサンプル、次にX ij X_{ij}バツ私は 为第 i i iのjj 番目のサンプルj指標の値:
2) データの標準化処理
さまざまな指標の測定単位や方向が統一されていない場合は、データを標準化する必要がありますが、エントロピー値を計算するときに無意味な対数を避けるために、それぞれの 0 の値に 0.01 のように、より小さい大きさの実数を加算することができます。 。
- ポジティブな指標の場合 (大きいほど良い)
- マイナスの指標の場合 (小さいほど良い)
3) jjthを計算するjインジケーターの下の項目iiこの指標を占めるiサンプルの割合
4) jjthを計算するj指標
エントロピーが大きいほど、システムはより混沌となり、運ぶ情報は少なくなりますが、エントロピーが小さいほど、システムはより秩序正しくなり、より多くの情報を運ぶことになります。
P ij = 0 P_{ij}=0P私は=0 ,ej = 0 e_j=0ej=0;K = 1 ln ( n ) K=\frac{1}{\ln (n)}K=ln ( n )1、ここで、nnnはサンプルの数です。
5) jjthを計算するjインデックス
指標の情報利用価値は、指標ej e_jの情報エントロピーに依存します。ej1 と 1 の差、その値は重みの大きさに直接影響します。情報の利用価値が大きいほど評価の重要性が増し、重み付けが大きくなる。
6) 評価指標の重み付けを計算する
エントロピー法による各指標の重み推定の要点は、指標情報の差分係数を用いて計算することであり、差分係数が大きいほど評価の重要度が高くなります(重みが大きいほど評価の重要性が高くなります)。評価結果への寄与)大きい)
じじ_j指標の重み:
7) 各サンプルの総合スコアを計算します。
3 Pythonの実装
import numpy as np
#输入数据
loss = np.random.uniform(1, 4, size=5)
active_number = np.array([2, 4, 5, 3, 2])
data = np.array([loss, active_number]) # 2个变量5个样本
print(data)
# 定义熵值法函数
def cal_weight(x):
'''熵值法计算变量的权重'''
# 正向化指标
#x = (x - np.max(x, axis=1).reshape((2, 1))) / (np.max(x, axis=1).reshape((2, 1)) - np.min(x, axis=1).reshape((2, 1)))
# 反向化指标
x = (np.max(x, axis=1).reshape((2, 1)) - x) / (np.max(x, axis=1).reshape((2, 1)) - np.min(x, axis=1).reshape((2, 1)))
#计算第i个研究对象某项指标的比重
Pij = x / np.sum(x, axis=1).reshape((2, 1))
ajs = []
#某项指标的熵值e
for i in Pij:
for j in i:
if j != 0:
a = j * np.log(j)
ajs.append(a)
else:
a = 0
ajs.append(a)
ajs = np.array(ajs).reshape((2, 5))
e = -(1 / np.log(5)) * np.sum(ajs, axis=1)
#计算差异系数
g = 1 - e
#给指标赋权,定义权重
w = g / np.sum(g, axis=0)
return w
w = cal_weight(data)
print(w)
結果:
[[1.57242561 1.12780429 2.24411338 2.36236155 2.37789035]
[2. 4. 5. 3. 2. ]]
[0.70534397 0.29465603]
参考:
https://blog.csdn.net/weixin_43425784/article/details/107047869
https://blog.csdn.net/mzy20010420/article/details/127327787