2016-03-30 11 views
2

Öğelerin koleksiyonunu bir bilgisayarın belleğine sığamayacağınız çok büyük bir dizinin olduğunu hayal edin. Python'da bu dizinin ortalama, medyan, standart sapma ve diğer özet istatistik değerlerini nasıl hesaplarsınız?Python'daki büyük dizinin özet istatistiklerini artımlı olarak hesaplayın

Hesaplama işleminin ortalama değerini aşamalı olarak açıklayan ve bir liste veya yineleyici nesnesi alan bir Python işlevi sağlayan this post'u buldum, ancak her zaman bir yineleyici nesnesine erişemediğim için onu bir sınıf olarak uygulamıştım. collections.Counter'a benzer davranır. Ancak, std, min, max, median, skewness, kurtosis, vb.

Aşağıdaki kod uygulayan bir asgari çalışma örneğidir artan mean, min ve max ve dinlenme uyabilecek nereye gösterir:

class Inc_sumstats(object): 
    def __init__(self): 
     self.length = 0 
     self.mean = 0 
     #self.std = 0 
     self.min = np.inf 
     self.max = 0 
     #self.median = 0 
     #self.skewness = 0 
     #self.kurtosis = 0 

    def update(self, num): 
     self.length += 1 
     self.mean = (self.mean * (self.length - 1) + num)/self.length 
     #self.std = ... 
     self.min = num if num < self.min else self.min 
     self.max = num if num > self.max else self.max 
     #self.median = ... 
     #self.skewness = ... 
     #self.kurtosis = ... 
     return self 


Güncelleme:

ben Sitedeki similar questions'un farkındayım, ancak şimdiye kadar herhangi bir çözümü çözemedim. han demek. Arka plan araştırmamda bir şey kaçırıyorsam lütfen soruları işaretleyin veya yinelenen olarak işaretleyin.

+0

nasıl bellekte değilse bu diziyi depolamak var? – Natecat

+0

Diziyi artırdığınızda ortalama değişiklikler olduğundan, std'yi tekrar sıfırdan hesaplamanız gerektiğine inanıyorum. – lordingtar

+0

@Natecat Bu dizi potansiyel olarak büyük boyutlu e-posta karakter uzunlukları veya başka türde gerçek zamanlı veri akışı olabilir. Ya da sadece büyük bir sabit diskte saklanabilir. –

cevap

2

Ne arıyorsanız, sipariş istatistikleri için çevrimiçi algoritma olduğunu. Çevrimiçi bir algoritma, biraz istatistik için bir jeneratör gibidir; Bellek veya diskten okunduğunda veri biriktirir, böylece programcı bellek yönetimi sorunlarını ele alabilir ve yine de doğru çıktıyı elde edebilir.

Orada bu algoritmaların uygulanması arkasında CS teorisinin bir sürü, ama burada bu konuda daha fazla bilgi edinebilirsiniz: https://en.wikipedia.org/wiki/Selection_algorithm#Online_selection_algorithm

matematik olsa biraz sezgisel: sınıf elemanlarının sayısını güncelleme ve yeniden hesaplamak gerekir önceki değerlerin bir fonksiyonu olarak ortalama, min, max, kurtosis, std-dev vb. ve bu değerleri bir tuple olarak döndür. Ben online istatistik algoritmaları oluşturmak için nasıl olarak ayrıntılı bir cevap, bu soruya bakın:

"On-line" (iterator) algorithms for estimating statistical median, mode, skewness, kurtosis?

+0

Yani bağlantılı soru temelde BT. Bu soruların başlığını Python'daki bir uygulama için açık bir şekilde soracağı için güncelledim, aksi halde bu açıkça bir kopya. Yönünüz için teşekkürler, + 1 ama kabul etmeyecek. –