客観加重エントロピー値法を用いた多指標総合評価手法の原理とPython実践

1. エントロピー法とは何ですか?

エントロピー法とは、指標の分散度を決定するために使用される数学的手法を指します。分散度が大きいほど、この指標が総合評価に与える影響は大きくなります。エントロピー値は、指標の分散度を判断するために使用できます。エントロピー値法は、情報エントロピーの考え方に基づいた客観的な重み付け法であり、指標の情報エントロピーを計算し、指標の相対的な変化がシステム全体に及ぼす影響に基づいて指標の重みを決定します。 。

エントロピー法は一般的に用いられる多指標総合評価手法であり、複数の指標のデータを総合的に分析し、総合的な評価結果を得ることができます。エントロピー手法の用途は非常に広く、経営管理、環境評価、投資意思決定など、さまざまな分野で活用できます。

エントロピー法は客観的な評価である分析階層プロセス (AHP) と比較されますが、AHP は主観的な評価です。エントロピー値法以外にも、主成分分析や因子分析などの統計的手法を用いて重みを決定することもできる。いずれの方法で重みを決定する場合であっても、実際の状況や指標の性質を総合的に考慮し、選択した重みが合理的かつ信頼できるものであるかどうかを感度分析により判断する必要があることに注意してください。

2. エントロピー法の基本原理

情報理論では、エントロピーは不確実性の尺度です。情報量が多ければ不確実性は小さくなりエントロピーは小さくなり、情報量が少なくなると不確実性は大きくなりエントロピーは大きくなります。エントロピーの特性に応じて、エントロピー値を計算することで事象のランダム性や無秩序性を判断することができ、また、エントロピー値を指標の離散性の程度を判断するために使用することもできます。指標の離散性の度合いが大きいほど、総合評価に与える影響が大きい指標ほど影響力が大きい(重みが大きいほどエントロピー値が小さくなる)。

mmを搭載m は評価される予定です、nn元の指標データ行列を形成するn 個の評価指標X = ( X ij ) m × n X=(X_{ij})_{m \times n}バツ=( Xイジ)m × n、特定の指標X j X_jについてバツj、指標値X ij X_{ij}バツイジ差が大きいほど、その指標が総合評価において果たす役割が大きくなり、ある指標の指標値がすべて等しい場合、その指標は総合評価において役割を果たさないことになります。

2.1. データマトリックス

んんnサンプル、mm元のデータ行列を形成するm個の評価指標:
A = ( X 11 … X 1 m ⋮ ⋮ ⋮ X n 1 … X nm ) A=\begin{pmatrix} \vdots & \vdots & \vdots \\ X_{n1} & \dots & X_{nm} \end{pmatrix}= バツ11バツn1 _バツ1m _バツnm

このうち、X ij は X_{ij} 番目ですバツイジはi番目の計画と 2 番目の計画です各プランのj$ 番目のインジケーターの値。

2.2. データの標準化と非否定的な処理

エントロピー値法の計算では、同じ指標値の合計に対する各スキームの特定の指標の比率を使用するため、次元への影響はなく、一般に標準化の必要はありません。データに負の数値がある場合、データは負でない必要があります。対処してください! さらに、エントロピー値を計算する際の対数の無意味さを避けるために、データの変換、さらには標準化を実行する必要があります。

ポジティブな指標の場合:

yij = X ij − min ( X ij ) max ( X ij ) − min ( X ij ) y_{ij}=\frac{X_{ij}-min(X_{ij})}{max(X_{ij}) -min(X_{ij})}yイジ=マックス( X _イジ) ( Xイジ)バツイジ( Xイジ)

ネガティブな指標の場合:

yij = 最大 ( X ij ) − X ijmax ( X ij ) − 最小 ( X ij ) y_{ij}=\frac{max(X_{ij})-X_{ij}}{max(X_{ij})- min(X_{ij})}yイジ=マックス( X _イジ) ( Xイジ)マックス( X _イジ) Xイジ

ニュートラルインジケーターの場合:

yij = { X ij − min ( X ij ) max ( X ij ) − min ( X ij ) 、 X ij < 平均 ( X ij ) max ( X ij ) − X ijmax ( X ij ) − min ( X ij ) 、 X ij ≥ 平均 ( X ij ) y_{ij}=\left\{\begin{行列} \frac{X_{ij}-min(X_{ij})}{max(X_{ij})-min(X_ {ij})}, &X_{ij}<mean(X_{ij}) \\ \frac{max(X_{ij})-X_{ij}}{max(X_{ij})-min(X_{ij} })}、&X_{ij}\ge means(X_{ij}) \end{行列}\right。yイジ={ マックス( X _イジ) ( Xイジ)バツイジ( Xイジ)マックス( X _イジ) ( Xイジ)マックス( X _イジ) Xイジバツイジ<平均( X _ _イジ)バツイジ平均( X _ _イジ)

上の式では、yij y_{ij}yイジ無次元データを表します。無次元データはすべて[0, 1] [0,1]に分類されます。[ 0 ,1 ]間隔、yij y_{ij}yイジ数値が大きいほど評価結果が高くなります。

無次元処理するとデータの一部がゼロまたはマイナスになるため、便宜的にエントロピー値の重みを計算する際に対数をとるのは無意味であり、データを加工する必要がある。ここでは翻訳方式を採用しています。

Z ij = yij + 1 ( i = 1 , 2 , ... m ; j = 1 , 2 , ... n ) Z_{ij}=y_{ij}+1 (i=1,2,...) m;j=1,2,...n)Zイジ=yイジ+1 (=1 2 ... m ;j=1 2 ... n )

2.3. エントロピーの計算

jjthを計算するjインジケーターの下の項目iii 個のソリューションにおけるこの指標の割合

pij = Z ij ∑ i = 1 m Z ij , ( i = 1 , 2 , . . . m ; j = 1 , 2 , . . . n ) p_{ij}=\frac{Z_{ij}}{\ sum_{i=1}^{m}Z_{ij}},(i=1,2,...m;j=1,2,...n)pイジ=i = 1メートルZイジZイジ(私は=1 2 ... m ;j=1 2 ... n )

エントロピー値の計算式は次のとおりです。

E i = − 1 ln ⁡ ( n ) ∑ j = 1 npij ln ⁡ pij E_i = -\frac{1}{\ln(n)} \sum_{j=1}^n p_{ij} \ln p_{ ij}E私は=l n ( n )1j = 1pイジlnpイジ

その中には、pij p_{ij}pイジii代目を代表するi係数は jj番目にありますj 個のデータポイントの値

各要素のエントロピー値を計算した後、その重みをさらに計算できます。重量は次のように計算されます。

Wi = 1 − E i ∑ j = 1 n ( 1 − E j ) W_i = \frac{1-E_i}{\sum_{j=1}^n(1-E_j)}W私は=j = 1( 1 Ej)1 E私は

その中で、nn は因子の数を表します。

3.Pythonの練習

import pandas as pd
import numpy as np

# 正向指标
def set_Standard(data):
    y = (data - data.min(axis=0))/(data.max(axis=0)-data.min(axis=0))
    
    return y

def set_Standards(data, positive=None, negative=None, middle=None):
    row = data.shape[0]
    col = data.shape[1]
    data_max = data.max(axis=0)
    data_min = data.min(axis=0)
    data_mean = data.mean(axis=0)
    data_maxmin = data_max - data_min
    
    y = np.zeros((row, col),dtype='float32')
    if positive==None and negative==None and middle==None:
        # 默认为正向指标,越大越好
        y = (data - data_min)/data_maxmin
    # 正向
    if positive!=None:
        for j in positive:
            for i in range(row):
                y[i,j] = (data[i,j] - data_min[j])/data_maxmin[j]
    # 负向
    if negative!=None:
        for j in negative:
            for i in range(row):
                y[i,j] = (data_max[j] - data[i,j])/data_maxmin[j]                
    # 中性
    if middle!=None:
        do = True
        if do:
            for j in middle:
                for i in range(row):
                    if data[i,j] > data_mean[j]: 
                        y[i,j] = (data[i,j] - data_min[j])/data_maxmin[j]
                    else:               
                        data[i,j] = (data_max[j] - data[i,j])/data_maxmin[j]                
        else:
            for j in middle:
                for i in range(row):
                    y[i,j] = data[i,j]
    
    return y


# 计算熵值,得到权重
def get_weights(data, positive=None, negative=None, middle=None):
    """
    输入数据data,标准化后采用熵值法计算权重,综合得分以及排序位置
    """
    data = np.array(data)
    y = set_Standards(data, positive, negative, middle)
    #print(y)

    # 平移,避免0
    z = y + 1e-10
    #print(z)
    # 计算指标值占比
    w = z/sum(z)
    # 计算熵值
    k = 1/np.log(y.shape[0])
    e = -k*(w*np.log(w)).sum(axis=0)

    Wi = (1 - e)/sum(1 - e)
    print('weights', Wi)

    score = np.matmul(np.array(data), Wi)
    print('score', score)

    index = sorted(score, reverse=True)
    #print(index)

    # 输出名次结果
    sor = [index.index(score[l]) + 1 for l in range(len(index))]
    print('sort ',sor)

    results = {
    
    }
    results['weights'] = list(Wi)
    results['score'] = list(score)
    results['pos'] = sor
    print(results)
    
    return str(results)


if __name__ == '__main__':
    data = pd.DataFrame({
    
    '指标1': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
                    '指标2': [2, 4, 6, 8, 10, 2, 4, 6, 8, 10],
                    '指标3': [1, 2, 1, 3, 2, 1, 3, 2, 3, 1],
                    '指标4': [3, 1, 2, 3, 5, 8, 7, 8, 8, 9]
                   })

    df = np.array(data)
    get_weights(df, positive=[0, 1, 2], negative=[3], middle=None)

操作結果:

	weights [0.16859554 0.21985199 0.37852868 0.2330238 ]
	score [1.68589962 2.20668019 2.66947483 4.26785551 4.96367395 3.69399634
	 4.82632941 5.28912404 6.27595223 6.36021818]
	sort  [10, 9, 8, 6, 4, 7, 5, 3, 2, 1]

参考:

forxtz.エントロピー法に基づくPython総合評価. Blog Park. 2021.05

Yangyangcainiao.エントロピー重み付け法—Python . CSDN ブログ. 2022.01

おすすめ

転載: blog.csdn.net/xiaoyw/article/details/132852333