Yeni Çözüm
işe yarayabilecek, ben içine bakmaya karar verdi corrcoef()
kodu ve aşağıdaki uygulamayı yapmak için ilham aldı.
ms = data.mean(axis=1)[(slice(None,None,None),None)]
datam = data - ms
datass = np.sqrt(scipy.stats.ss(datam,axis=1))
for i in xrange(rows):
temp = np.dot(datam[i:],datam[i].T)
rs = temp/(datass[i:]*datass[i])
boyunca her döngü i ve satırları ı ile son satıra satır arasında Pearson katsayıları oluşturur. Çok hızlı. Sadece corrcoef()
'u kullanmanın en az 1.5 katı kadardır çünkü katsayıları ve diğer birkaç şeyi gereksiz yere hesaplamamaktadır. Aynı zamanda daha hızlı olacaktır ve 50.000 satır matrisiyle bellek sorunlarını size vermeyecektir, çünkü daha sonra her bir r kümesini saklamayı veya başka bir set oluşturmadan önce bunları işlemeyi seçebilirsiniz. R'in uzun vadesini saklamaksızın, 50.000 x 10 set rasgele oluşturulmuş veriyi, yeni dizüstü bilgisayarımda bir dakikadan kısa bir süre içinde çalıştırabilmek için yukarıdaki kodu alabiliyordum.
Eski Çözüm
Birincisi, ekrana r en çıktısını tavsiye etmem. 100 satır (10 sütun) için bu, kodunuzu kullanmadan 0,301 saniye gibi bir baskı ile 19.79 saniyede bir fark yaratır. Sadece r'leri saklayın ve isterseniz daha sonra kullanın ya da en büyük r'lerden bazılarını aradığınız gibi bazı işlemleri gerçekleştirin. İkinci olarak, bazı miktarları gereksiz olarak hesaplayarak biraz tasarruf sağlayabilirsiniz. Pearson katsayısı, bir satırın kullanıldığı her zaman hesaplamak yerine önceden hesaplayabileceğiniz bazı miktarlar kullanılarak scipy cinsinden hesaplanır. Doğruca SciPy üzerinde yaklaşık 4.8x bir hızlandırması olsun
r = np.zeros((rows,rows))
ms = data.mean(axis=1)
datam = np.zeros_like(data)
for i in xrange(rows):
datam[i] = data[i] - ms[i]
datass = scipy.stats.ss(datam,axis=1)
for i in xrange(rows):
for j in xrange(i,rows):
r_num = np.add.reduce(datam[i]*datam[j])
r_den = np.sqrt(datass[i]*datass[j])
r[i,j] = min((r_num/r_den), 1.0)
. Ayrıca, aşağıdaki kodu kullanarak bu da o yüzden çizmelerine izin de pearsonr()
tarafından döndürülen p değeri (kullanmıyorsunuz kodu p-değeri maddelerini kaldırdığımda - 8.8x p-değerlerini burada bırakırsam (yüzlerce satır ile 10 sütun kullandım) aynı sonucu verdiğimi de kontrol ettim. gerçekten büyük bir gelişme, ama yardımcı olabilir.Nihayetinde, (50000) * (50001)/2 = 1,250,025,000 Pearson katsayıları (eğer doğru bir şekilde sayıyorsam) problemi ile uğraşıyorsunuz demektir. Bu çok fazla. Bu arada, her bir dizinin Pearson katsayısını kendi başına hesaplamaya gerek yoktur (1'e eşit olacaktır), ancak bu sadece 50.000 Pearson katsayısını hesaplamanızı sağlar. Yukarıdaki kodla, daha küçük veri kümelerindeki sonuçlara dayanarak verilere göre 10 sütununuz varsa, hesaplama yapmak için yaklaşık 4 1/4 saat geçmesini beklerim. Yukarıdaki kodu Cython'a veya benzer bir şeye alarak biraz iyileştirme yapabilirsiniz. Şanslıysan, düz Scipy üzerinden 10 katına çıkabileceğini umuyorum. Ayrıca, pyInTheSky tarafından önerildiği gibi, bazı çok işlem yapabilirsiniz.
Burada kastettiğiniz şeyin daha kapsamlı bir örneğini görmek isterim. – vgoklani
Bence cevabım bu noktada bu sorudan çok uzaktır, ancak multiprocessiong ile ilgileniyorsanız, http://docs.python.org/library/multiprocessing.html adresine bakın. , bir işlev ve bir iş parçacığı havuzu oluşturmak ve sadece p.map (myfunc, xrange (satır)) – pyInTheSky