파이썬은 엔트로피 가중치 방법을 구현합니다.

원문: https://mp.weixin.qq.com/s/vPNPdbZy11q1qsfEz9etZQ

1 엔트로피 가중치 방법 소개

엔트로피는 변화의 능력을 의미하는 그리스어 '변화'에서 유래되었으며 , 독일의 물리학자 클라우지우스는 열역학 제2법칙을 정립하기 위해 엔트로피 개념을 도입했습니다.

엔트로피의 개념은 열역학에서 유래하며 프로세스를 설명하는 데 사용되는 되돌릴 수 없는 현상입니다. 나중에 섀넌(Shannon)이 처음으로 정보 이론에 엔트로피를 도입했는데, 정보 이론에서는 엔트로피를 사물 발생의 불확실성을 표현하는 데 사용하고, 엔트로피는 불확실성의 척도로 사용 합니다 .

엔트로피 가중치법은 각 지표 조사 데이터 가 제공하는 정보량을 기초로 지표의 가중치를 결정하는 방식 으로, 기본 원리는 지표의 엔트로피 값이 작고 엔트로피 가중치가 클 경우 , 지표가 제공할 수 있는 정보의 양이 많을수록 의사결정에 있어서 그 역할이 커진다는 뜻이며, 반대로 지표의 엔트로피 값이 크고 엔트로피 가중치가 작을수록 지표가 제공 할 수 있는 정보가 많다는 의미입니다. 정보가 적고 의사결정에 더 큰 역할을 하지만 효과는 더 작을 것입니다.

엔트로피 가중치법은 데이터 자체의 불연속성에 의존하는 객관적인 할당 방법으로 , 여러 지표를 결합하여 샘플을 종합적으로 점수화하여 샘플 간 비교를 수행하는 데 사용됩니다 .

2 엔트로피 가중치 계산 단계

1) 데이터
선택 mm 선택m 지표, 총nn 개 샘플,X ij X_{ij}엑스나는 j第IIi 의 jj 번째표본j 지표의 값:

2) 데이터 표준화 처리

각종 지표의 측정 단위와 방향이 균일하지 않은 경우 데이터의 표준화가 필요하며, 엔트로피 값을 계산할 때 의미 없는 로그를 피하기 위해 각 0 값에 0.01과 같이 더 작은 크기의 실수를 추가할 수 있습니다. .

  • 긍정적인 지표의 경우(클수록 좋음)
  • 부정적인 지표의 경우(작을수록 좋음)

3) jjth를 계산한다j 표시 아래의 항목ii이 지표를 설명하는 i 개 표본의 비율

4) jjth를 계산한다j 번째 지표

엔트로피가 클수록 시스템은 더 혼란스럽고 전달하는 정보는 적으며, 엔트로피가 작을수록 시스템은 더 질서 있고 더 많은 정보를 전달합니다.

Pij = 0 P_{ij}=0나는 j=0 ,ej = 0 e_j=0이자형j=0 ;K = 1 ln ⁡ (n ) K=\frac{1}{\ln (n)}케이=ln ( n )1, 여기서 nnn 은 샘플 수입니다.

5) jjth를 계산한다j 지수

지표의 정보효용가치는 지표의 정보엔트로피에 따라 달라집니다. ej e_j이자형j1과 1의 차이, 그 값은 가중치의 크기에 직접적인 영향을 미칩니다. 정보효용가치가 높을수록 평가의 중요성이 커지고 가중치도 커진다.

6) 평가지표의 가중치 계산

엔트로피법을 이용한 각 지표의 가중치 추정의 핵심은 지표정보의 차이계수를 이용하여 계산하는데, 차이계수가 높을수록 평가의 중요도가 높다(또는 가중치가 클수록 중요도가 높다). 평가 결과에 대한 기여).더 크게)

_j 지표의 가중치:

7) 각 샘플의 종합 점수를 계산합니다.

3 파이썬 구현

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