Değerler kümesinin medyanını, modunu, çarpıklığını ve / veya basıklığını tahmin etmek için bir algoritma var mı, ancak bu, tüm değerlerin aynı anda bellekte saklanmasını GEREKTİRMEZ?
Temel istatistikleri hesaplamak istiyorum:
- ortalama: aritmetik ortalama
- varyans: ortalamadan kare sapmaların ortalaması
- standart sapma: varyansın karekökü
- ortanca: sayıların büyük yarısını küçük yarısından ayıran değer
- mod: sette bulunan en sık değer
- çarpıklık: tl; dr
- basıklık: tl; dr
Bunlardan herhangi birini hesaplamak için temel formüller ilkokul aritmetiğidir ve bunları biliyorum. Bunları uygulayan birçok istatistik kitaplığı da var.
Benim sorunum, ele aldığım kümelerdeki çok sayıda (milyarlarca) değer: Python'da çalışarak, milyarlarca öğeyle bir liste veya hash yapamam. Bunu C'de yazmış olsam bile, milyar elemanlı diziler çok pratik değil.
Veriler sıralanmamış. Diğer süreçler tarafından anında rastgele üretilir. Her setin boyutu oldukça değişkendir ve boyutları önceden bilinmeyecektir.
Kümedeki her bir değeri herhangi bir sırayla yineleyerek, ortalama ve varyansı nasıl çok iyi idare edeceğimi zaten buldum. (Aslında benim durumumda, onları oluşturuldukları sırayla alıyorum.) İşte kullandığım algoritma, http://en.wikipedia.org/wiki/Algorithms_for_calculating_variance#On-line_algorithm izniyle :
- Üç değişkeni başlatın: count, sum ve sum_of_squares
- Her değer için:
- Artış sayısı.
- Toplanacak değeri ekleyin.
- Sum_of_squares'e değerin karesini ekleyin.
- Toplamı sayıya bölün, değişken ortalama olarak saklayın.
- Sum_of_squares öğesini sayıya bölerek, ortalama_kareler değişkeni olarak saklayın.
- Ortalama karekök olarak saklanan kare ortalama.
- Ortalama_karakterlerden ortalama_karesini çıkar, varyans olarak sakla.
- Çıktı ortalaması ve varyans.
Bu "çevrimiçi" algoritmanın zayıf yönleri vardır (örneğin, sum_of_squares tamsayı aralığından veya kayan kesinlikten hızlı bir şekilde büyüdüğü için doğruluk sorunları), ancak temelde her bir kümedeki her değeri saklamak zorunda kalmadan ihtiyacım olanı verir.
Ancak, ek istatistikleri tahmin etmek için benzer tekniklerin var olup olmadığını bilmiyorum (medyan, mod, çarpıklık, basıklık). N değerlerini işlemek için gereken bellek önemli ölçüde O (N) 'den daha az olduğu sürece yanlı bir tahmin ediciyle veya hatta doğruluğu belirli bir dereceye kadar tehlikeye atan bir yöntemle yaşayabilirim.
Kitaplığın bu işlemlerden birini veya birkaçını "çevrimiçi" olarak hesaplamak için işlevleri varsa, beni mevcut bir istatistik kitaplığına yönlendirmek de yardımcı olacaktır.