Veri kümesindeki değişiklikten sonra eski standart sapmayı kullanarak yeni standart sapmanın hesaplanması


16

Ortalama μ o l d ve standart sapma σ o l d olan gerçek değerler dizim var . X i dizisinin bir elemanı başka bir x j elemanı ile değiştirilirse , yeni ortalamanμoldσoldxixj

μnew=μold+xjxin

Bu yaklaşımın avantajı, değerine bakılmaksızın sürekli hesaplama gerektirmesidir . Hesaplamak için bir yaklaşım, var σ n e ağırlık kullanılarak σ o l d hesaplama gibi ^ ı n e ağırlık kullanılarak μ o l d ?nσnewσoldμnewμold


Bu ödev mi? Matematiksel istatistik
dersimizde

2
@ user946850: Hayır, ödev değil. Tezimi Evrimsel Algoritma üzerine yürütüyorum . Nüfus çeşitliliğinin bir ölçüsü olarak standart sapmayı kullanmak istiyorum. Sadece daha verimli bir çözüm arıyor.
kullanıcı

1
SD, varyansın kare köküdür, bu sadece ortalama kare değerdir (nasıl güncelleneceğini zaten bildiğiniz kare ortalamanın katı ile ayarlanır). Bu nedenle, çalışan bir ortalamayı hesaplamak için kullanılan aynı yöntemler , çalışan bir varyansı hesaplamak için herhangi bir temel değişiklik yapılmadan uygulanabilir. Aslında, çok daha karmaşık istatistikler çevrimiçi olarak aynı fikirler kullanılarak hesaplanabilir: örneğin, stats.stackexchange.com/questions/6920 ve stats.stackexchange.com/questions/23481 adresindeki konulara bakın .
whuber

1
@whuber: Bu, Varyans için Wikipedia makalesinde , aynı zamanda meydana gelebilecek felaket iptali (veya önem kaybı) üzerine bir notla belirtilmiştir. Bu abartılı mı yoksa devam eden varyans için gerçek bir problem mi?
krlmlr

Bu harika bir soru. Varyansları daha önce ortalamaksızın saf bir şekilde biriktirirseniz, gerçekten başınız belaya girebilir. Sorun, sayılar çok büyük ancak varyansları küçük olduğunda ortaya çıkar. Örneğin, 299792458.145, 299792457.883, 299792457.998, ... gibi, s / m ışık hızının doğru ölçümleri bir dizi göz önünde bulundurun: yaklaşık 0.01 değişkenliklerine, yaklaşık onların kareler kıyasla çok küçük olduğu , dikkatsiz hesaplama (çift kesinlikte bile) sıfır varyansla sonuçlanacaktır: tüm önemli basamaklar kaybolacaktır. 1017
whuber

Yanıtlar:


7

Wikipedia makalesinde "Varyans hesaplama algoritmaları" başlıklı bir bölüm , gözlemlerinize öğeler eklenirse varyansın nasıl hesaplanacağını gösterir. (Standart sapmanın varyansın karekökü olduğunu unutmayın.) Dizinize eklediğinizi varsayalım , ardındanxn+1

σnew2=σold2+(xn+1μnew)(xn+1μold).

DÜZENLEME : Yukarıdaki formül yanlış görünüyor, açıklamaya bakın.

Şimdi, bir öğeyi değiştirmek, gözlem eklemek ve başka bir öğeyi kaldırmak anlamına gelir; her ikisi de yukarıdaki formülle hesaplanabilir. Ancak, sayısal kararlılık sorunlarının ortaya çıkabileceğini unutmayın; alıntılanan ürün aynı zamanda sayısal olarak kararlı varyantlar da önermektedir.

Formülü kendiniz türetmek için , örnek varyans tanımını kullanarak değerini hesaplayın ve uygun olduğunda verdiğiniz formülle μ n e w yerine koyun . Bu verir σ 2 n- e ağırlık - σ 2 O l d , böylece bir formül sonunda ve σ n e ağırlık verilen σ o L d ve(n1)(σnew2σold2)μnewσnew2σold2σnewσold . Benim gösterimde, sana eleman yerine varsayalım x n tarafından x ' n :μoldxnxn

σ2=(n1)1k(xkμ)2(n1)(σnew2σold2)=k=1n1((xkμnew)2(xkμold)2)+ ((xnμnew)2(xnμold)2)=k=1n1((xkμoldn1(xnxn))2(xkμold)2)+ ((xnμoldn1(xnxn))2(xnμold)2)

Toplamdaki , μ o l d' ye bağımlı bir şeye dönüşür , ancak düzgün bir sonuç elde etmek için denklemi biraz daha çalıştırmanız gerekir. Bu size genel bir fikir vermelidir.xkμold


Verdiğiniz ilk formül doğru görünmüyor, yani hem yeni hem de eski ortalamadan daha küçük / büyükse, varyans her zaman artar, bu da mantıklı değildir. Dağılımına bağlı olarak artabilir veya azalabilir. xn+1
Emmet B

@EmmetB: Evet, haklısın - bu muhtemelen Ne yazık ki, bu tüm tartışmamı oradan geçersiz kılıyor, ancak tarihi amaçlar için bırakıyorum. Yine de düzenlemekten çekinmeyin. σnew2=n1nσold2+1n(xn+1μnew)(xn+1μold).
krlmlr

4

Bağlantılı Wikipedia makalesinde okuduğumu düşündüğüm göre, "çalışan" bir standart sapmayı koruyabilirsiniz:

real sum = 0;
int count = 0;
real S = 0;
real variance = 0;

real GetRunningStandardDeviation(ref sum, ref count, ref S, x)
{
   real oldMean;

   if (count >= 1)
   {
       real oldMean = sum / count;
       sum = sum + x;
       count = count + 1;
       real newMean = sum / count;

       S = S + (x-oldMean)*(x-newMean)
   }
   else
   {
       sum = x;
       count = 1;
       S = 0;         
   }

   //estimated Variance = (S / (k-1) )
   //estimated Standard Deviation = sqrt(variance)
   if (count > 1)
      return sqrt(S / (count-1) );
   else
      return 0;
}

Makalesinde ayrı bir çalışan korumak olmasa da sumve count, bunun yerine tek sahip mean. Bugün yaptığım şeyde count(istatistiksel amaçlar için) sakladığım için, her seferinde ortalamaları hesaplamak daha yararlıdır.


0

x¯snxnxns

s2+1n1(2nΔx¯(xnx¯)+n(n1)(Δx¯)2),
Δx¯=x¯x¯x¯

Belki de yazmanın daha çarpıcı bir yolu var mı?

Bunu küçük bir test senaryosuna karşı kontrol ettim ve işe yaramış gibiydi.


1
@john / Karanlıkta ıslık: Cevabınızı beğendim, küçük veri setimde düzgün çalışıyor gibi görünüyor. Üzerinde matematiksel bir temel / referans var mı? Nazikçe yardım eder misiniz?
Alok Chowdhury

Soru tüm @ Karanlıkta ıslık, sadece site için temizledim. Buradaki soru ve yanıtı referans alan yeni bir soru sormalısınız. Ayrıca bu şekilde hissediyorsanız bu cevabı iptal etmelisiniz.
John
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.