Karşılıklı bilgi hesaplanırken çöp kutusu sayısı


10

Karşılıklı bilgiler kullanarak A ve B değişkenleri arasındaki ilişkiyi ölçmek istiyorum. Bunu hesaplamanın yolu gözlemleri bölmektir (aşağıdaki örnek Python koduna bakınız). Ancak, hangi sayıda kutunun makul olduğunu hangi faktörler belirler? Hızlı olmak için hesaplamaya ihtiyacım var, bu yüzden güvenli tarafta olmak için çok fazla kutu kullanamıyorum.

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

Yanıtlar:


15

Histogramlarla karşılıklı bilgileri (MI) tahmin etmek için en iyi sayıda kutu yoktur. En iyi yol, mümkünse çapraz doğrulama ile seçmek veya bir başparmak kuralına güvenmektir. Bu nedenle, histogramlara dayanmayan diğer MI tahmincileri önerilmiştir.

Kutuların sayısı toplam veri noktası sayısına ( bağlı olacaktır . İki değişken arasındaki ortak dağılım için tahmin hatalarını önlemek için çok fazla bölmeden kaçınmaya çalışmalısınız. İki değişken arasındaki ilişkiyi yakalayabilmek için çok az sayıda bölmeden de kaçınmalısınız. Her ikisi için eşit genişlikli bölmelere sahip bir 2D histogram oluşturduğu ve kişisel olarak seçeceğim göz önüne alındığında : Bu durumda, eşit olarak dağıtılmış iki rasgele değişken için ortalama olarak en az puanınız olacaktır. histogramdaki her hücre: nnp.histogram2d(x, y, D)Dxy

D=n/5
5
nDXDY5nD25D2n/5D=n/5
Bu, önerilen bölümleme yaklaşımını simüle eden olası bir seçenektir (Cellucci, 2005) . İkinci yaklaşım genellikle genetik ağları çıkarmak için MI'yı tahmin etmek için kullanılır: örneğin MIDER'de .

Çok sayıda veri noktanız ve eksik değerleriniz yoksa, en iyi sayıda kutuyu bulma konusunda fazla endişelenmemelisiniz; örneğin . Aksi takdirde, sonlu numuneler için MI değerini düzeltmeyi düşünebilirsiniz. (Steuer ve ark., 2002) genetik ağ çıkarsama görevi için MI için bazı düzeltmeleri tartışmaktadır.nn=100,000


Histogram için kutu sayısını tahmin etmek eski bir sorundur. Lauritz Dieckman'ın MI için çöp kutusu sayısını tahmin etme konusundaki bu konuşmayla ilgilenebilirsiniz . Bu konuşma Mike X Cohen'in nöral zaman serileri hakkındaki kitabındaki bir bölüme dayanıyor .

ve bağımsız olarak seçebilir ve 1D histogramlarındaki kutu sayısını tahmin etmek için kullanılan temel kuralı kullanabilirsiniz.DXDY

Freedman-Diaconis 'kuralı (dağıtım konusunda varsayım yok): Burada , 75-kantil ile 25-kantil arasındaki farktır. SE ile ilgili bu soruya bakın .

DX=maksimumX-minX2IQRn-1/3
IQR

Scott'ın kuralı (normallik varsayımı): ; burada standart sapmadır için .

DX=maksimumX-minX3.5sXn-1/3
sXX

Sturges kuralı (kutu sayısını küçümseyebilir ancak büyük için iyi olabilir ): n

DX=1+günlük2n

Histogramlarla MI'yı doğru bir şekilde tahmin etmek zordur. Daha sonra farklı bir tahminci seçebilirsiniz:

  • Kraskov'un parametre seçimine biraz daha az duyarlı olan NN tahmincisi: veya en yakın komşu genellikle varsayılan olarak kullanılır. Makale: (Kraskov, 2003)kk=4k=6
  • Çekirdeklerle MI Tahmini (Moon, 1995) .

MI değerini tahmin etmek için birçok paket vardır:

  • Python için Parametrik Olmayan Entropi Tahmini Araç Kutusu. site .
  • Java'da bilgi dinamikleri araç takımı ancak Python için de kullanılabilir. site .
  • Matlab'da ITE araç kutusu. site .

1

minepyPython'da karşılıklı bilgi almayı ve tahmin etmeyi tercih ederim .

Sen paketin uygulama ayrıntılarını görebilir burada ve bir örnek kod burada . Daha kolay başvuru amacıyla, örneği kopyalayıp yapıştırıyorum: çıktısı:

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)

Bu çıktı olarak verir:

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

Deneyimlerim, sonuçların hassas olması alphave varsayılan değerin .6makul olması. Ancak, gerçek verilerime alpha=.3göre çok daha hızlı ve tahmin edilen karşılıklı bilgiler bu durumla gerçekten yüksek bir korelasyona sahip alpha=.6. Bu nedenle, yüksek MI alphadeğerine sahip olanları seçmek için MI kullanıyorsanız, daha küçük bir değer kullanabilir ve en yüksek değerleri iyi bir doğrulukla değiştirme olarak kullanabilirsiniz.


Teşekkürler! MI tahmininde mayınla sklearn karşılaştırdınız mı?
pir

Hayır. Neden olmasın emin değilim!
adrin

Az önce sklearn ve minepy'nin bir karşılaştırmasını yaptım (hem alfa = 0,3 hem de alfa = 0,6). Sonuçlar çok farklı! Çok kolay olduğu için sonuçlarınızı her iki kütüphaneyi de kullanarak kontrol etmeniz gerekir :)
pir

2
MIC, karşılıklı bilgilere (MI) eşit değildir. Bunlar tamamen farklı iki şeydir.
Simone

1
Evet elbette. Orijinal MIC kağıdında MI ve MIC arasında birçok karşılaştırma vardır: uvm.edu/~cdanfort/csc-reading-group/… MIC, fonksiyonel bir ilişki için gürültü miktarının bir proxy'si olarak kullanılabileceğini gösteriyor - orijinal makalede 'eşitlik' adı verilen özellik. Bununla birlikte, MI birçok görev için hala çok iyi bir bağımlılık ölçüsüdür: örneğin özellik seçimi veya genetik ağ çıkarımı. Tahmin edilmesi MIC'den daha hızlıdır.
Simone
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.