Varyansı hesaplamak için algoritmalar - Algorithms for calculating variance

Varyansı hesaplamak için kullanılan algoritmalar , hesaplama istatistiklerinde önemli bir rol oynar . Bu problem için iyi algoritmaların tasarımındaki önemli bir zorluk , varyans formüllerinin , büyük değerlerle uğraşırken aritmetik taşmanın yanı sıra sayısal kararsızlığa da yol açabilen karelerin toplamını içerebilmesidir .

Naif algoritma

N büyüklüğündeki bir popülasyonun tamamının varyansını hesaplamak için bir formül :

Kullanılması Bessel düzeltme bir hesaplamak için tarafsız bir sonlu popülasyon varyansının tahminini numunenin ait n gözlemleri, formüldür:

Bu nedenle, tahmin edilen varyansı hesaplamak için naif bir algoritma aşağıdaki şekilde verilir:

  • Let n ← 0, Sum ← 0, SUMSQ ← 0
  • Her veri x için :
    • nn + 1
    • Toplam ← Toplam + x
    • Toplam Sq ← Toplam Sq + x × x
  • Var = (SumSq − (Toplam × Toplam) / n) / (n − 1)

Bu algoritma, sonlu bir popülasyonun varyansını hesaplamak için kolayca uyarlanabilir:  son satırda n − 1 yerine basitçe N'ye bölün .

Çünkü SUMSQ ve (Sum × Sum) / n çok benzer sayılar olabilir, iptal yol açabilir hassas çok daha az doğal hassasiyet daha olmasını sonucun kayan nokta aritmetik hesaplama yapmak için kullandı. Bu nedenle bu algoritma pratikte kullanılmamalıdır ve birkaç alternatif, sayısal olarak kararlı algoritmalar önerilmiştir. Standart sapma ortalamaya göre küçükse bu özellikle kötüdür.

Kaydırılan verileri hesaplama

Varyans, bir konum parametresindeki değişikliklere göre değişmezdir , bu formülde feci iptali önlemek için kullanılabilecek bir özelliktir.

ile yeni formül yol açan herhangi bir sabit,

ortalama değere ne kadar yakınsa , sonuç o kadar doğru olur, ancak sadece numune aralığı içinde bir değer seçmek istenen kararlılığı garanti edecektir. Değerler küçükse karelerinin toplamında sorun yoktur, aksine büyükse varyansın da büyük olduğu anlamına gelir. Her durumda, formüldeki ikinci terim her zaman birinciden daha küçüktür, bu nedenle iptal olmaz.

İlk örnek olarak alınırsa algoritmada yazılabilir Python programlama dili olarak

def shifted_data_variance(data):
    if len(data) < 2:
        return 0.0
    K = data[0]
    n = Ex = Ex2 = 0.0
    for x in data:
        n = n + 1
        Ex += x - K
        Ex2 += (x - K) * (x - K)
    variance = (Ex2 - (Ex * Ex) / n) / (n - 1)
    # use n instead of (n-1) if want to compute the exact variance of the given data
    # use (n-1) if data are samples of a larger population
    return variance

Bu formül aynı zamanda şu şekilde ifade edilebilen artımlı hesaplamayı da kolaylaştırır.

K = n = Ex = Ex2 = 0.0

def add_variable(x):
    global K, n, Ex, Ex2
    if n == 0:
        K = x
    n += 1
    Ex += x - K
    Ex2 += (x - K) * (x - K)

def remove_variable(x):
    global K, n, Ex, Ex2
    n -= 1
    Ex -= x - K
    Ex2 -= (x - K) * (x - K)

def get_mean():
    global K, n, Ex
    return K + Ex / n

def get_variance():
    global n, Ex, Ex2
    return (Ex2 - (Ex * Ex) / n) / (n - 1)

İki geçişli algoritma

Varyans için farklı bir formül kullanan alternatif bir yaklaşım, önce örnek ortalamasını hesaplar,

ve sonra ortalamadan farkların karelerinin toplamını hesaplar,

burada s standart sapmadır. Bu, aşağıdaki kod tarafından verilir:

def two_pass_variance(data):
    n = sum1 = sum2 = 0

    for x in data:
        n += 1
        sum1 += x

    mean = sum1 / n

    for x in data:
        sum2 += (x - mean) * (x - mean)

    variance = sum2 / (n - 1)
    return variance

Bu algoritma, n küçükse sayısal olarak kararlıdır . Bununla birlikte, bu basit algoritmaların her ikisinin ("naif" ve "iki geçişli") sonuçları, verilerin sıralanmasına aşırı derecede bağlı olabilir ve çok büyük veri kümeleri için tekrarlanan yuvarlama hatası nedeniyle çok büyük veri kümeleri için kötü sonuçlar verebilir. toplamlar. Bu hatayla bir dereceye kadar mücadele etmek için telafi edilmiş toplama gibi teknikler kullanılabilir.

Welford'un çevrimiçi algoritması

Varyansı tek geçişte hesaplayabilmek ve her değeri yalnızca bir kez inceleyebilmek genellikle yararlıdır ; örneğin, veriler, tüm değerleri tutmak için yeterli depolama olmadan toplandığında veya bellek erişimi maliyetleri, hesaplama maliyetlerinin önüne geçtiğinde. Böyle bir çevrimiçi algoritma için , gerekli istatistiklerin sayısal olarak kararlı bir şekilde hesaplanabileceği miktarlar arasında bir tekrarlama ilişkisi gereklidir.

Ek bir x n öğesi için dizinin ortalamasını ve (tahmini) varyansını güncellemek için aşağıdaki formüller kullanılabilir . Burada, ilk örnek ortalamasını gösterir , n numuneleri , onların önyargılı örnek varyans ve onların tarafsız örnek varyansı .

Bu formüller, n ile ölçeklenen büyük bir sayıdan art arda küçük bir sayıyı çıkardıkları için sayısal kararsızlıktan muzdariptir . Güncelleme için daha iyi bir miktar , burada belirtilen mevcut ortalamadan farklılıkların karelerinin toplamıdır, :

Bu algoritma Welford tarafından bulundu ve kapsamlı bir şekilde analiz edildi. Ayrıca belirtmek için yaygındır ve .

Welford'un algoritması için örnek bir Python uygulaması aşağıda verilmiştir.

# For a new value newValue, compute the new count, new mean, the new M2.
# mean accumulates the mean of the entire dataset
# M2 aggregates the squared distance from the mean
# count aggregates the number of samples seen so far
def update(existingAggregate, newValue):
    (count, mean, M2) = existingAggregate
    count += 1
    delta = newValue - mean
    mean += delta / count
    delta2 = newValue - mean
    M2 += delta * delta2
    return (count, mean, M2)

# Retrieve the mean, variance and sample variance from an aggregate
def finalize(existingAggregate):
    (count, mean, M2) = existingAggregate
    if count < 2:
        return float("nan")
    else:
        (mean, variance, sampleVariance) = (mean, M2 / count, M2 / (count - 1))
        return (mean, variance, sampleVariance)

Bu algoritma, yıkıcı iptal nedeniyle kesinlik kaybına çok daha az eğilimlidir , ancak döngü içindeki bölme işlemi nedeniyle o kadar verimli olmayabilir. Varyansı hesaplamak için özellikle sağlam bir iki geçişli algoritma için, önce ortalamanın bir tahmini hesaplanabilir ve çıkarılabilir ve daha sonra bu algoritma artıklar üzerinde kullanılabilir.

Aşağıdaki paralel algoritma , çevrimiçi olarak hesaplanan birden çok istatistik kümesinin nasıl birleştirileceğini gösterir.

Ağırlıklı artımlı algoritma

Algoritma, eşit olmayan numune ağırlıklarını işlemek için genişletilebilir, basit sayaç n şimdiye kadar görülen ağırlıkların toplamı ile değiştirilir . West (1979) bu artımlı algoritmayı önerir :

def weighted_incremental_variance(data_weight_pairs):
    w_sum = w_sum2 = mean = S = 0

    for x, w in data_weight_pairs:
        w_sum = w_sum + w
        w_sum2 = w_sum2 + w * w
        mean_old = mean
        mean = mean_old + (w / w_sum) * (x - mean_old)
        S = S + w * (x - mean_old) * (x - mean)

    population_variance = S / w_sum
    # Bessel's correction for weighted samples
    # Frequency weights
    sample_frequency_variance = S / (w_sum - 1)
    # Reliability weights
    sample_reliability_variance = S / (w_sum - w_sum2 / w_sum)

paralel algoritma

Chan ve ark. Welford'un yukarıda ayrıntıları verilen çevrimiçi algoritmasının, rastgele kümeleri birleştirmek için çalışan bir algoritmanın özel bir durumu olduğunu unutmayın ve :

.

Bu, örneğin, girdinin ayrı bölümlerine birden çok işlem birimi atanabildiğinde yararlı olabilir.

Chan'ın ortalamayı tahmin etme yöntemi, her ikisi de büyük olduğunda sayısal olarak kararsızdır , çünkü içindeki sayısal hata, durumda olduğu gibi küçültülmez . Bu gibi durumlarda tercih edin .

def parallel_variance(n_a, avg_a, M2_a, n_b, avg_b, M2_b):
    n = n_a + n_b
    delta = avg_b - avg_a
    M2 = M2_a + M2_b + delta ** 2 * n_a * n_b / n
    var_ab = M2 / (n - 1)
    return var_ab

Bu, AVX ile GPU'lar ve bilgisayar kümeleri ile paralelleştirmeye ve kovaryansa izin verecek şekilde genelleştirilebilir .

Örnek

Tüm kayan nokta işlemlerinin standart IEEE 754 çift kesinlikli aritmetik kullandığını varsayın . Sonsuz bir popülasyondan örneği (4, 7, 13, 16) düşünün. Bu örneğe dayanarak, tahmini popülasyon ortalaması 10'dur ve popülasyon varyansının yansız tahmini 30'dur. Hem naif algoritma hem de iki geçişli algoritma bu değerleri doğru şekilde hesaplar.

Ardından , ilk örnekle aynı tahmini varyansa yol açan örneği ( 10 8  + 4 , 10 8  + 7 , 10 8  + 13 , 10 8  + 16 ) düşünün . İki geçişli algoritma bu varyans tahminini doğru bir şekilde hesaplar, ancak saf algoritma 30 yerine 29.33333333333332 döndürür.

Bu kesinlik kaybı tolere edilebilir ve naif algoritmanın küçük bir kusuru olarak görülse de, ofseti daha da artırmak hatayı felakete götürür. Örneği düşünün ( 10 9  + 4 , 10 9  + 7 , 10 9  + 13 , 10 9  + 16 ). Yine tahmini popülasyon varyansı 30, iki geçişli algoritma tarafından doğru bir şekilde hesaplanır, ancak saf algoritma şimdi bunu -170.6666666666666 olarak hesaplar. Bu, saf algoritma ile ilgili ciddi bir sorundur ve algoritmanın son aşamasında benzer iki sayının çıkarılmasındaki feci iptalden kaynaklanmaktadır .

Üst düzey istatistikler

Terriberry, Chan'ın formüllerini , örneğin çarpıklık ve basıklığı tahmin ederken gerekli olan üçüncü ve dördüncü merkezi momentleri hesaplamak için genişletir :

Burada yine ortalama farkları güçlerin toplamından oluşmasıdır , verme

Artımlı durum (yani, ) için bu, şunları basitleştirir:

Değeri korunarak , yalnızca bir bölme işlemine ihtiyaç duyulur ve böylece daha yüksek mertebeden istatistikler, küçük bir artımlı maliyetle hesaplanabilir.

Açıklandığı gibi uygulanan basıklık için çevrimiçi algoritmanın bir örneği:

def online_kurtosis(data):
    n = mean = M2 = M3 = M4 = 0

    for x in data:
        n1 = n
        n = n + 1
        delta = x - mean
        delta_n = delta / n
        delta_n2 = delta_n * delta_n
        term1 = delta * delta_n * n1
        mean = mean + delta_n
        M4 = M4 + term1 * delta_n2 * (n*n - 3*n + 3) + 6 * delta_n2 * M2 - 4 * delta_n * M3
        M3 = M3 + term1 * delta_n * (n - 2) - 3 * delta_n * M2
        M2 = M2 + term1

    # Note, you may also calculate variance using M2, and skewness using M3
    # Caution: If all the inputs are the same, M2 will be 0, resulting in a division by 0.
    kurtosis = (n * M4) / (M2 * M2) - 3
    return kurtosis

Pébaÿ bu sonuçları , artımlı ve ikili durumlar için keyfi sıralı merkezi momentlere daha da genişletir ve ardından Pébaÿ ve diğerleri. ağırlıklı ve bileşik anlar için. Orada da kovaryans için benzer formüller bulunabilir .

Choi ve Sweetman, eğriliği ve basıklığı hesaplamak için, her biri belirli uygulamalarda önemli bilgisayar belleği gereksinimlerinden ve CPU zamanından tasarruf edebilen iki alternatif yöntem sunar. İlk yaklaşım, verileri kutulara ayırarak istatistiksel anları hesaplamak ve ardından daha yüksek anlar için etkin bir şekilde tek geçişli bir algoritma haline gelen histogramın geometrisinden anları hesaplamaktır . Bir fayda, istatistiksel moment hesaplamalarının, hesaplamaların, örneğin veri depolama formatının veya orijinal ölçüm donanımının kesinliğine ayarlanabilmesi için keyfi doğrulukta gerçekleştirilebilmesidir. Rastgele bir değişkenin göreli histogramı geleneksel yolla oluşturulabilir: potansiyel değerlerin aralığı kutulara bölünür ve her kutu içindeki oluşum sayısı sayılır ve her dikdörtgenin alanı örnek değerlerin kısmına eşit olacak şekilde çizilir. o kutunun içinde:

burada ve sıklığı ve depo göreceli sıklığını temsil ve histogram toplam alanıdır. Bu normalleştirmeden sonra, ham momentler ve merkezi momentler , bağıl histogramdan hesaplanabilir:

burada üst simge , histogramdan hesaplanan momentleri gösterir. Sabit bölme genişliği için bu iki ifade aşağıdakiler kullanılarak basitleştirilebilir :

Choi ve Sweetman'ın ikinci yaklaşımı, bir zaman-tarihinin bireysel bölümlerinden istatistiksel anları birleştirmek için analitik bir metodolojidir, öyle ki, sonuçta ortaya çıkan genel anlar, tam zaman-tarihininkilerdir. Bu metodoloji, bu anların müteakip kombinasyonları ile istatistiksel anların paralel hesaplanması için veya ardışık zamanlarda hesaplanan istatistiksel anların kombinasyonu için kullanılabilir.

Eğer istatistik anları takımları bilinmektedir: için , daha sonra her bir eşdeğer cinsinden ifade edilebilir ham anlar:

burada genellikle zaman geçmişinin süresi veya sabit ise nokta sayısı olarak alınır.

İstatistiksel momentleri cinsinden ifade etmenin faydası , kümelerin toplama ile birleştirilebilmesi ve değerinde bir üst sınır olmamasıdır .

burada alt simge , birleştirilmiş zaman geçmişini veya birleştirilmiş . Bu birleşik değerler daha sonra ters bir şekilde sıralı zaman-tarihinin tamamını temsil eden ham anlara dönüştürülebilir.

Ham momentler ( ) ve merkezi momentler ( ) arasındaki bilinen ilişkiler , daha sonra birleştirilmiş zaman tanım alanının merkezi anlarını hesaplamak için kullanılır. Son olarak, birleştirilmiş geçmişin istatistiksel anları, merkezi anlardan hesaplanır:

kovaryans

Kovaryansı hesaplamak için çok benzer algoritmalar kullanılabilir .

Naif algoritma

Saf algoritma:

Yukarıdaki algoritma için aşağıdaki Python kodu kullanılabilir:

def naive_covariance(data1, data2):
    n = len(data1)
    sum12 = 0
    sum1 = sum(data1)
    sum2 = sum(data2)

    for i1, i2 in zip(data1, data2):
        sum12 += i1 * i2

    covariance = (sum12 - sum1 * sum2 / n) / n
    return covariance

Ortalama tahmini ile

Varyansa gelince, iki rastgele değişkenin kovaryansı da kaydırma ile değişmezdir, bu nedenle herhangi iki sabit değer verilir ve şu şekilde yazılabilir:

ve yine değerler aralığı içinde bir değer seçmek, formülü feci iptallere karşı stabilize edecek ve aynı zamanda büyük meblağlara karşı daha sağlam hale getirecektir. Her veri setinin ilk değeri alınarak algoritma şu şekilde yazılabilir:

def shifted_data_covariance(data_x, data_y):
    n = len(data_x)
    if n < 2:
        return 0
    kx = data_x[0]
    ky = data_y[0]
    Ex = Ey = Exy = 0
    for ix, iy in zip(data_x, data_y):
        Ex += ix - kx
        Ey += iy - ky
        Exy += (ix - kx) * (iy - ky)
    return (Exy - Ex * Ey / n) / n

iki geçiş

İki geçişli algoritma önce örnek ortalamayı ve ardından kovaryansı hesaplar:

İki geçişli algoritma şu şekilde yazılabilir:

def two_pass_covariance(data1, data2):
    n = len(data1)

    mean1 = sum(data1) / n
    mean2 = sum(data2) / n

    covariance = 0

    for i1, i2 in zip(data1, data2):
        a = i1 - mean1
        b = i2 - mean2
        covariance += a * b / n
    return covariance

Biraz daha doğru bir telafi edilmiş sürüm, artıklar üzerinde tam saf algoritmayı gerçekleştirir. Son toplamlar ve sıfır olmalıdır , ancak ikinci geçiş herhangi bir küçük hatayı telafi eder.

İnternet üzerinden

Varyansı hesaplamak için çevrimiçi algoritmaya benzer, eş momenti hesaplayan kararlı bir tek geçişli algoritma mevcuttur :

Bu son denklemdeki bariz asimetri , her iki güncelleme teriminin de eşit olması gerçeğinden kaynaklanmaktadır . İlk önce ortalamaları hesaplayarak, ardından artıklar üzerinde kararlı tek geçişli algoritmayı kullanarak daha da büyük doğruluk elde edilebilir.

Böylece kovaryans şu şekilde hesaplanabilir:

def online_covariance(data1, data2):
    meanx = meany = C = n = 0
    for x, y in zip(data1, data2):
        n += 1
        dx = x - meanx
        meanx += dx / n
        meany += (y - meany) / n
        C += dx * (y - meany)

    population_covar = C / n
    # Bessel's correction for sample variance
    sample_covar = C / (n - 1)

Ağırlıklı kovaryansı hesaplamak için küçük bir değişiklik de yapılabilir:

def online_weighted_covariance(data1, data2, data3):
    meanx = meany = 0
    wsum = wsum2 = 0
    C = 0
    for x, y, w in zip(data1, data2, data3):
        wsum += w
        wsum2 += w * w
        dx = x - meanx
        meanx += (w / wsum) * dx
        meany += (w / wsum) * (y - meany)
        C += w * dx * (y - meany)

    population_covar = C / wsum
    # Bessel's correction for sample variance
    # Frequency weights
    sample_frequency_covar = C / (wsum - 1)
    # Reliability weights
    sample_reliability_covar = C / (wsum - wsum2 / wsum)

Benzer şekilde, hesaplamayı paralelleştirmek için kullanılabilecek iki kümenin kovaryanslarını birleştirmek için bir formül vardır:

Ağırlıklı toplu sürüm

Toplu güncelleme yapan ağırlıklı çevrimiçi algoritmanın bir sürümü de mevcuttur: ağırlıkları belirtelim ve yazalım

Kovaryans daha sonra şu şekilde hesaplanabilir:

Ayrıca bakınız

Referanslar

  1. ^ a b Einarsson, Bo (2005). Bilimsel Hesaplamada Doğruluk ve Güvenilirlik . SIAM. P. 47. ISBN 978-0-89871-584-2.
  2. ^ a b c Chan, Tony F. ; Golub, Gene H .; LeVeque, Randall J. (1983). "Örnek varyansını hesaplamak için algoritmalar: Analiz ve öneriler" (PDF) . Amerikan İstatistikçisi . 37 (3): 242–247. doi : 10.1080/00031305.1983.10483115 . JSTOR  2683386 .
  3. ^ a b c Schubert, Erich; Gertz, Michael (9 Temmuz 2018). (Ko-)varyansın sayısal olarak kararlı paralel hesaplaması . ACM. P. 10. doi : 10.1145/3221269.3223036 . ISBN'si 9781450365055. S2CID  49665540 .
  4. ^ Higham, Nicholas (2002). Sayısal Algoritmaların Doğruluğu ve Kararlılığı (2 ed) (Problem 1.10) . SIAM.
  5. ^ Welford, BP (1962). "Düzeltilmiş kareler ve çarpımlar toplamını hesaplama yöntemine ilişkin not". Teknometri . 4 (3): 419–420. doi : 10.2307/1266577 . JSTOR  1266577 .
  6. ^ Donald E. Knuth (1998). Bilgisayar Programlama Sanatı , cilt 2: Yarı Sayısal Algoritmalar , 3. Baskı , s. 232. Boston: Addison-Wesley.
  7. ^ Ling, Robert F. (1974). "Örnek Ortalamaları ve Varyansları Hesaplamak İçin Çeşitli Algoritmaların Karşılaştırılması". Amerikan İstatistik Derneği Dergisi . 69 (348): 859-866. doi : 10.2307/2286154 . JSTOR  2286154 .
  8. ^ http://www.johndcook.com/standard_deviation.html
  9. ^ Batı, DHD (1979). "Ortalama ve Varyans Tahminlerinin Güncellenmesi: İyileştirilmiş Bir Yöntem". ACM'nin İletişimi . 22 (9): 532-535. doi : 10.1145/359146.359153 . S2CID  30671293 .
  10. ^ Chan, Tony F. ; Golub, Gene H .; LeVeque, Randall J. (1979), "Örnek Varyansların Hesaplanması için Formüllerin Güncellenmesi ve İkili Bir Algoritma." (PDF) , Teknik Rapor STAN-CS-79-773 , Bilgisayar Bilimleri Bölümü, Stanford Üniversitesi.
  11. ^ Terriberry, Timothy B. (2007), Computing Higher-Order Moments Online , orijinalinden 23 Nisan 2014 tarihinde arşivlendi , alındı 5 Mayıs 2008
  12. ^ Pébaÿ, Philippe (2008), "Formulas for Robust, One-Pass Parallel Computation of Covariances and Abitrary-Order İstatistiksel Momentler" (PDF) , Teknik Rapor SAND2008-6212 , Sandia National Laboratories
  13. ^ Pebaÿ, Philippe; Terriberry, Timothy; Kolla, Hemanth; Bennett, Janine (2016), "Rastgele Ağırlıklı Yüksek Dereceli Çok Değişkenli Merkezi Momentlerin Paralel ve Çevrimiçi Hesaplaması için Sayısal Olarak Kararlı, Ölçeklenebilir Formüller" , Hesaplamalı İstatistikler , Springer, 31 (4): 1305–1325, doi : 10.1007/s00180- 015-0637-z , S2CID  124570169
  14. ^ a b Choi, Myoungkeun; Sweetman, Bert (2010), "Yapısal Sağlık İzleme için İstatistiksel Momentlerin Verimli Hesaplanması", Yapısal Sağlık İzleme Dergisi , 9 (1): 13–24, doi : 10.1177/1475921709341014 , S2CID  17534100

Dış bağlantılar