상호 정보를 계산할 때 빈 수


10

상호 정보를 사용하여 두 변수 A와 B 사이의 관계를 수량화하고 싶습니다. 이를 계산하는 방법은 관측 값을 비닝하는 것입니다 (아래 예제 Python 코드 참조). 그러나 어떤 수의 빈이 합리적인지를 결정하는 요인은 무엇입니까? 계산 속도가 빠르므로 많은 쓰레기통을 안전하게 사용할 수 없습니다.

from sklearn.metrics import mutual_info_score

def calc_MI(x, y, bins):
    c_xy = np.histogram2d(x, y, bins)[0]
    mi = mutual_info_score(None, None, contingency=c_xy)
    return mi

답변:


15

히스토그램을 사용하여 상호 정보 (MI)를 추정 할 수있는 구간이 가장 적습니다. 가장 좋은 방법은 가능한 경우 교차 검증을 통해 선택하거나 경험에 의존하는 것입니다. 이것이 히스토그램을 기반으로하지 않는 MI의 다른 많은 추정기가 제안 된 이유입니다.

구간 수는 총 데이터 포인트 수 따라 달라집니다 . 두 변수 사이의 결합 분포에 대한 추정 오차를 피하기 위해 너무 많은 구간을 피해야합니다. 또한 두 변수 사이의 관계를 캡처 할 수있는 빈을 너무 적게 피해야합니다. 점을 감안 하여 2 차원 히스토그램을 생성 모두에 대해 동일한 폭 쓰레기통 와 나는 개인적으로 선택할 것 : 당신은 적어도이 두 가지 균일하게 분포 확률 변수에 대한 평균이 경우에는 포인트를 히스토그램의 각 셀 : nnp.histogram2d(x, y, D)Dxy

D=n/5
5
nDXDY5nD25D2n/5D=n/5
이것은 (Cellucci, 2005) 에서 제안 된 적응 적 파티셔닝 접근법을 시뮬레이트하는 하나의 가능한 선택입니다 . 후자의 접근법은 MI가 유전자 네트워크를 추론하기 위해 MI를 추정하는 데 종종 사용됩니다 (예 : MIDER) .

데이터 포인트 이 많고 결 측값이없는 경우 최상의 수의 구간을 찾는 것에 대해 너무 걱정하지 않아도됩니다. 예를 들어, 만약 . 그렇지 않은 경우 유한 샘플의 MI를 수정하는 것이 좋습니다. (Steuer et al., 2002) 는 유전자 네트워크 추론 작업에 대한 MI에 대한 일부 수정 사항을 논의합니다.nn=100,000


히스토그램의 구간 수를 추정하는 것은 오래된 문제입니다. Lauritz Dieckman의 MI에 대한 구간 수 추정에 대한 이 대화 에 관심이있을 수 있습니다 . 이 이야기는 마이크 X 코헨의 장을 기반으로 신경 시계열에 대해.

와 독립적으로 선택 하고 1D 히스토그램에서 수를 추정하는 데 사용되는 경험 법칙을 사용할 수 있습니다.DXDY

Freedman-Diaconis의 규칙 (분포에 대한 가정 없음) : 여기서 은 75 분위수와 25 분위수의 차이입니다. 이 관련 질문을 SE에서보십시오 .

DX=maxXminX2IQRn1/3
IQR

스캇의 규칙 (정상 가정) : 여기서 는 표준 편차입니다. 대한 .

DX=maxXminX3.5sXn1/3
sXX

스터 지 규칙 (빈의 수를 과소 평가할 수 있지만 큰 ) : n

DX=1+log2n

히스토그램으로 MI를 정확하게 추정하는 것은 어렵습니다. 그런 다음 다른 추정기를 선택할 수 있습니다.

  • Kraskov의 NN 추정기는 매개 변수 선택에 약간 덜 민감합니다. 또는 가장 가까운 이웃이 종종 기본값으로 사용됩니다. 논문 : (Kraskov, 2003)kk=4k=6
  • 커널을 이용한 MI 추정 (Moon, 1995) .

MI를 추정하기위한 많은 패키지가 있습니다 :

  • Python 용 비 파라 메트릭 엔트로피 추정 도구 상자. 사이트 .
  • Java의 정보 역학 툴킷이지만 Python에서도 사용 가능합니다. 사이트 .
  • Matlab의 ITE 툴박스. 사이트 .

1

나는 minepy파이썬에서 상호 정보를 얻고 추정 하는 것을 선호 합니다.

패키지의 구현 세부 사항은 여기에서 , 예제 코드는 여기에서 볼 수 있습니다 . 더 쉽게 참조 할 수 있도록 예제를 복사하여 여기에 출력합니다.

import numpy as np
from minepy import MINE

def print_stats(mine):
    print "MIC", mine.mic()
    print "MAS", mine.mas()
    print "MEV", mine.mev()
    print "MCN (eps=0)", mine.mcn(0)
    print "MCN (eps=1-MIC)", mine.mcn_general()

x = np.linspace(0, 1, 1000)
y = np.sin(10 * np.pi * x) + x
mine = MINE(alpha=0.6, c=15)
mine.compute_score(x, y)

print "Without noise:"
print_stats(mine)
print

np.random.seed(0)
y +=np.random.uniform(-1, 1, x.shape[0]) # add some noise
mine.compute_score(x, y)

print "With noise:"
print_stats(mine)

출력으로 제공합니다.

Without noise:
MIC 1.0
MAS 0.726071574374
MEV 1.0
MCN (eps=0) 4.58496250072
MCN (eps=1-MIC) 4.58496250072

With noise:
MIC 0.505716693417
MAS 0.365399904262
MEV 0.505716693417
MCN (eps=0) 5.95419631039
MCN (eps=1-MIC) 3.80735492206

내 경험은 결과가에 민감 alpha하고 기본값 .6은 합리적인 것입니다. 그러나 내 실제 데이터 alpha=.3는 훨씬 빠르며 추정 된 상호 정보는 실제 사례와의 상관 관계가 높습니다 alpha=.6. 따라서 MI를 사용하여 MI가 높은 것을 선택하는 경우 더 작은 alpha값을 사용하고 높은 값을 좋은 정확도의 대체물로 사용할 수 있습니다.


감사! MI 추정을 위해 minepy와 sklearn을 비교 했습니까?
pir November

아뇨 그래도 왜 그런지 잘 모르겠습니다!
adrin

방금 sklearn과 minepy (alpha = 0.3 및 alpha = 0.6)를 비교했습니다. 결과는 매우 다릅니다! 너무 쉬우므로 두 라이브러리를 모두 사용하여 결과를 확인해야 할 수도 있습니다. :)
pir

2
MIC는 상호 정보 (MI)와 같지 않습니다. 그것들은 완전히 다른 두 가지입니다.
Simone

1
물론이지. 일본어 MIC 논문 MI 및 MIC 사이의 비교가 많이있다 : uvm.edu/~cdanfort/csc-reading-group/...는 그 기능적 관계 노이즈 량의 프록시로서 사용될 수 있음을 보여 MIC - 원래 논문에서 '평등성'이라고하는 재산. 그럼에도 불구하고 MI는 여전히 기능 선택 또는 유전자 네트워크 추론과 같은 많은 작업에 대한 의존도를 매우 잘 측정합니다. MIC보다 추정하는 것이 더 빠릅니다.
Simone
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.