相互情報量を計算するときのビンの数


10

相互の情報を使用して、2つの変数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の他の多くの推定量が提案されている理由です。

nnp.histogram2d(x, y, D)Dxy

D=n/5
5
nDXDY5nD25D2n/5D=n/5

nn=100,000


ヒストグラムのビンの数を推定することは古い問題です。Lauritz Dieckmanによる、MIのビンの数の推定に関するこの講演に興味があるかもしれません。この講演は、マイクXコーエンの神経時系列に関する本の章に基づいています。

DXDY

DX=maxXminX2IQRn1/3
IQR

DX=maxXminX3.5sXn1/3
sXX

n

DX=1+log2n

ヒストグラムでMIを正しく推定することは困難です。次に、別の推定量を選択します。

MIを推定するための多くのパッケージがあります。

  • Python用のノンパラメトリックエントロピー推定ツールボックス。サイト
  • Javaの情報ダイナミクスツールキットですが、Pythonでも利用できます。サイト
  • MatlabのITEツールボックス。サイト

1

minepyはPythonで相互情報を取得して推定することを好みます。

ここでパッケージの実装の詳細を確認でき、ここでサンプルコードを確認できます。簡単に参照できるように、例をコピーして貼り付け、ここに出力します。

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を比較しましたか?
2015年

いいえ、していません。なぜだかわかりません!
adrin 2015年

sklearnとminepyの比較を行いました(alpha = 0.3とalpha = 0.6の両方)。結果は大きく異なります!とても簡単なので、おそらく両方のライブラリを使用して結果も確認する必要があります:)
pir

2
MICは相互情報量(MI)とは異なります。それらは2つのまったく異なるものです。
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.