Pythonはエントロピー重み付けメソッドを実装します

原文: 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=0K = 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

おすすめ

転載: blog.csdn.net/mengjizhiyou/article/details/127872787