0-sansürlü çok değişkenli normalin ortalaması ve varyansı nedir?


9

Let be içinde . nin ortalama ve kovaryans matrisi nedir (maksimum eleman hesaplandığında)?ZN(μ,Σ)RdZ+=max(0,Z)

Bu, örneğin, ReLU aktivasyon işlevini derin bir ağda kullanırsak ve CLT aracılığıyla belirli bir katmana girişlerin yaklaşık normal olduğunu varsayarsak, bu çıkışların dağılımıdır.

(Eminim birçok insan bunu daha önce hesaplamıştı, ancak sonucu makul bir şekilde okunabilir bir şekilde bulamadım.)


İki ayrı sorunun sonuçlarını birleştirerek elde edebileceğinizi gözlemlemek - belki de büyük ölçüde - cevabınızı basitleştirir: (1) kesilmiş bir Normal dağılımın anları nelerdir ve (2) bir karışımın anları nelerdir ? İkincisi basittir ve yapmanız gereken tek şey birincisi için alıntı yapmaktır.
whuber

@whuber Hmm. Açıkça söylememiş olmama rağmen, cevabımda yaptığım budur, ancak genel bir ortalama ve varyansla kesilmiş iki değişkenli bir dağıtım için sonuçlar bulamadım ve bu yüzden yine de bazı ölçeklendirme ve kaydırma yapmak zorunda kaldım. Yapmam gereken cebir miktarını yapmadan örneğin kovaryans elde etmenin bir yolu var mı? Bu cevaptaki hiçbir şeyin yeni olduğunu iddia etmiyorum, sadece cebirin sıkıcı ve hataya açık olduğunu ve belki de başka birinin çözümü yararlı bulacağını iddia ediyorum.
Dougal

Doğru: Eminim cebiriniz anlattığımla aynıdır, bu yüzden cebiri basitleştirmek için bir takdir paylaşıyoruz. Cebiri azaltmanın kolay bir yolu, köşegen öğelerini birliğe standartlaştırmaktır, çünkü tek yapmanız gereken her değişken için bir ölçü birimi oluşturmaktır. Bu noktada, Rosenbaum'un sonuçlarını doğrudan karışım anları için (basit, açık) ifadelere ekleyebilirsiniz. Cebirsel sadeleştirmeye bile değip değmeyeceği bir zevk meselesi olabilir: sadeleştirmeden basit, modüler bir bilgisayar programına yol açar. Σ
whuber

1
Sanırım anları doğrudan Rosenbaum'un sonuçlarıyla hesaplayan ve uygun şekilde karıştıran bir program yazabilir ve sonra bunları orijinal alana geri kaydırır ve ölçeklendirir. Bu muhtemelen benim yaptığımdan daha hızlı olurdu.
Dougal

Yanıtlar:


7

Bunu ilk önce sadece tek değişkenli / iki değişkenli kesilmiş normal dağılım anlarına bağlı olarak azaltabiliriz: elbette

E[Z+]=[E[(Zi)+]]iCov(Z+)=[Cov((Zi)+,(Zj)+)]ij,
ve normal bir dağılımın belirli boyutlarının koordinat dönüşümlerini yaptığımız için, yalnızca 1d sansürlü normalin ortalaması ve varyansı ve iki 1d sansürlü normalin kovaryansı hakkında endişelenmeniz gerekir.

Şu kaynaktan bazı sonuçlar kullanacağız:

S Rosenbaum (1961). Kesik İki Değişkenli Normal Dağılımın Momentleri . JRSS B, cilt 23 s. 405-408. ( jstor )

Rosenbaum ve .

[X~Y~]N([00],[1ρρ1]),
V={X~aX,Y~aY}

Özellikle, şu üç sonucu kullanacağız, onun (1), (3) ve (5). İlk olarak aşağıdakileri tanımlayın:

qx=φ(birx)qy=φ(biry)Sx=Φ(-birx)Sy=Φ(-biry)R,xy=Φ(ρbirx-biry1-ρ2)R,yx=Φ(ρbiry-birx1-ρ2)rxy=1-ρ22πφ(h2-2ρhk+k21-ρ2)

Şimdi, Rosenbaum şunu gösteriyor:

(1)Pr(V)E[X~|V]=qxR,xy+ρqyR,yx(3)Pr(V)E[X~2|V]=Pr(V)+birxqxR,xy+ρ2biryqyR,yx+ρrxy(5)Pr(V)E[X~Y~|V]=ρPr(V)+ρbirxqxR,xy+ρbiryqyR,yx+rxy.

(1) ve (3) 'ün özel durumunu , yani 1d değerlendirmek de yararlı olacaktır : biry=-

(*)Pr(V)E[X~|V]=qx(**)Pr(V)E[X~2|V]=Pr(V)=Sx.

Şimdi

[XY]=[μxμy]+[σx00σy][X~Y~]N([μXμY],[σx2ρσxσyρσxσyσy2])=N(μ,Σ).

Biz kullanır değerleridir ve zaman , .

ax=μxσxay=μyσy,
X~Y~X=0Y=0

Şimdi, (*) kullanarak ve her ikisini de (*) ve (**) kullanarak böylece

E[X+]=Pr(X+>0)E[XX>0]+Pr(X+=0)0=Pr(X>0)(μx+σxE[X~X~ax])=Qxμx+qxσx,
E[X+2]=Pr(X+>0)E[X2X>0]+Pr(X+=0)0=Pr(X~ax)E[(μx+σxX~)2X~ax]=Pr(X~ax)E[μx2+μxσxX~+σx2X~2X~ax]=Qxμx2+qxμxσx+Qxσx2
Var[X+]=E[X+2]E[X+]2=Qxμx2+qxμxσx+Qxσx2Qx2μx2qx2σx22qxQxμxσx=Qx(1Qx)μx2+(12Qx)qxμxσx+(Qxqx2)σx2.

bulmak için ihtiyacımız olacak Cov(X+,Y+)

E[X+Y+]=Pr(V)E[XY|V]+Pr(¬V)0=Pr(V)E[(μx+σxX~)(μy+σyY~)|V]=μxμyPr(V)+μyσxPr(V)E[X~|V]+μxσyPr(V)E[Y~|V]+σxσyPr(V)E[X~Y~|V]=μxμyPr(V)+μyσx(qxR,xy+ρqyR,yx)+μxσy(ρqxR,xy+qyR,yx)+σxσy(ρPr(V)-ρμxqxR,xy/σx-ρμyqyR,yx/σy+rxy)=(μxμy+σxσyρ)Pr(V)+(μyσx+μxσyρ-ρμxσy)qxR,xy+(μyσxρ+μxσy-ρμyσx)qyR,yx+σxσyrxy=(μxμy+Σxy)Pr(V)+μyσxqxR,xy+μxσyqyR,yx+σxσyrxy,
ve daha sonra çıkarılarak elde ederiz E[X+]E[Y+]
Cov(X+,Y+)=(μxμy+Σxy)Pr(V)+μyσxqxR,xy+μxσyqyR,yx+σxσyrxy-(Sxμx+qxσx)(Syμy+qyσy).

İşte anları hesaplamak için bazı Python kodları:

import numpy as np
from scipy import stats

def relu_mvn_mean_cov(mu, Sigma):
    mu = np.asarray(mu, dtype=float)
    Sigma = np.asarray(Sigma, dtype=float)
    d, = mu.shape
    assert Sigma.shape == (d, d)

    x = (slice(None), np.newaxis)
    y = (np.newaxis, slice(None))

    sigma2s = np.diagonal(Sigma)
    sigmas = np.sqrt(sigma2s)
    rhos = Sigma / sigmas[x] / sigmas[y]

    prob = np.empty((d, d))  # prob[i, j] = Pr(X_i > 0, X_j > 0)
    zero = np.zeros(d)
    for i in range(d):
        prob[i, i] = np.nan
        for j in range(i + 1, d):
            # Pr(X > 0) = Pr(-X < 0); X ~ N(mu, S) => -X ~ N(-mu, S)
            s = [i, j]
            prob[i, j] = prob[j, i] = stats.multivariate_normal.cdf(
                zero[s], mean=-mu[s], cov=Sigma[np.ix_(s, s)])

    mu_sigs = mu / sigmas

    Q = stats.norm.cdf(mu_sigs)
    q = stats.norm.pdf(mu_sigs)
    mean = Q * mu + q * sigmas

    # rho_cs is sqrt(1 - rhos**2); but don't calculate diagonal, because
    # it'll just be zero and we're dividing by it (but not using result)
    # use inf instead of nan; stats.norm.cdf doesn't like nan inputs
    rho_cs = 1 - rhos**2
    np.fill_diagonal(rho_cs, np.inf)
    np.sqrt(rho_cs, out=rho_cs)

    R = stats.norm.cdf((mu_sigs[y] - rhos * mu_sigs[x]) / rho_cs)

    mu_sigs_sq = mu_sigs ** 2
    r_num = mu_sigs_sq[x] + mu_sigs_sq[y] - 2 * rhos * mu_sigs[x] * mu_sigs[y]
    np.fill_diagonal(r_num, 1)  # don't want slightly negative numerator here
    r = rho_cs / np.sqrt(2 * np.pi) * stats.norm.pdf(np.sqrt(r_num) / rho_cs)

    bit = mu[y] * sigmas[x] * q[x] * R
    cov = (
        (mu[x] * mu[y] + Sigma) * prob
        + bit + bit.T
        + sigmas[x] * sigmas[y] * r
        - mean[x] * mean[y])

    cov[range(d), range(d)] = (
        Q * (1 - Q) * mu**2 + (1 - 2 * Q) * q * mu * sigmas
        + (Q - q**2) * sigma2s)

    return mean, cov

ve Monte Carlo'nun çalıştığını test etti:

np.random.seed(12)
d = 4
mu = np.random.randn(d)
L = np.random.randn(d, d)
Sigma = L.T.dot(L)
dist = stats.multivariate_normal(mu, Sigma)

mn, cov = relu_mvn_mean_cov(mu, Sigma)

samps = dist.rvs(10**7)
mn_est = samps.mean(axis=0)
cov_est = np.cov(samps, rowvar=False)
print(np.max(np.abs(mn - mn_est)), np.max(np.abs(cov - cov_est)))

ki verir 0.000572145310512 0.00298692620286gösteren iddia beklenti ve (göre kovaryans maç Monte Carlo tahminleri örnekleri).10,000,000


bu nihai değerlerin ne olduğunu özetleyebilir misiniz? Ürettiğiniz mu ve L parametrelerinin tahminleri mi? Belki de bu hedef değerleri yazdırır?
AdamO

Hayır, dönüş değerleri ve ; şey, bu miktarların Monte Carlo tahmin edicileri ile hesaplanan değer arasındaki mesafesiydi. Belki ve için bir an eşleşen tahminci elde etmek için bu ifadeleri ters çevirebilirsiniz - Rosenbaum aslında kesilmiş durumda onun 3. bölümünde bunu yapar - ama burada istediğim şey bu değil. \ e(Z+)\ Cov(Z+)LμΣ
Dougal
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.