0删减的多元法线的均值和方差是多少?


9

设在。的均值和协方差矩阵是什么(最大逐元素计算)?ZN(μ,Σ)RdZ+=max(0,Z)

例如,这是因为,如果我们在深层网络中使用ReLU激活功能,并通过CLT假定给定层的输入近似正常,则这就是输出的分布。

(我确信很多人以前都已经计算过了,但是我找不到以合理可读的方式列出的结果。)


它会简化您的答案(可能会大大简化),以观察您可以通过组合两个独立问题的结果来获得答案:(1)截断正态分布的矩是什么,(2)混合的矩是什么?后者很简单,您要做的就是引用前者的结果。
ub

@whuber嗯。尽管我没有明确说出来,但这基本上就是我的回答,只是我没有找到具有均值和方差的截短的双变量分布的结果,因此无论如何都必须进行一定的缩放和平移。有没有某种方法可以导出例如协方差而不做我必须做的代数运算?我当然不是在说这个答案中的任何内容都是新颖的,只是说代数是乏味且容易出错的,也许其他人会发现该解决方案有用。
Dougal '18

正确:我确定您的代数与我所描述的相同,因此我们似乎很高兴简化代数。减少代数的一种简单方法是将的对角元素标准化为1,因为所有操作都是为每个变量建立一个度量单位。那时,您可以将Rosenbaum的结果直接插入(简单,明显)的表达式中,以进行混合。是否值得进行代数简化可能是个问题:如果不进行简化,它将导致一个简单的模块化计算机程序。Σ
ub

1
我想可以编写一个程序,用Rosenbaum的结果直接计算矩并适当地混合,然后将其移位并缩放回原始空间。那可能比我做的更快。
Dougal '18

Answers:


7

我们首先可以将其减少为仅取决于单变量/双变量截断正态分布的某些时刻:当然,请注意

E[Z+]=[E[(Zi)+]]iCov(Z+)=[Cov((Zi)+,(Zj)+)]ij,
,由于我们要对正态分布的某些维进行坐标变换,所以我们只需要担心一维删减法线的均值和方差以及两个一维删减法线的协方差。

我们将使用来自的一些结果

S·罗森鲍姆(1961)。截断的二元正态分布的矩。JRSS B,第23卷,第405-408页。(jstor

Rosenbaum认为 并考虑到事件。 V ={X一个Xÿ一个ÿ }

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

具体来说,我们将使用以下三个结果,即他的(1),(3)和(5)。首先,定义以下内容:

qx=ϕ(ax)qy=ϕ(ay)Qx=Φ(ax)Qy=Φ(ay)Rxy=Φ(ρaxay1ρ2)Ryx=Φ(ρayax1ρ2)rxy=1ρ22πϕ(h22ρhk+k21ρ2)

现在,Rosenbaum显示:

(1)Pr(V)E[X~V]=qxRxy+ρqyRyx(3)Pr(V)E[X~2V]=Pr(V)+axqxRxy+ρ2ayqyRyx+ρrxy(5)Pr(V)E[X~Y~V]=ρPr(V)+ρaxqxRxy+ρayqyRyx+rxy.

考虑的(1)和(3)的特殊情况也将很有用,即一截断: Vé [ X | V ]ay=

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

现在,我们要考虑

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

我们将使用 它们是,时和的值。X Ŷ X=0

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

现在,使用(*),我们获得 并同时使用(*)和(**)得出 ,使得 ë [ X 2 + ]

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.

要找到,我们将需要 Cov(X+,Y+)

E[X+Y+]=Pr(V)E[XYV]+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(qxRxy+ρqyRyx)+μxσy(ρqxRxy+qyRyx)+σxσy(ρPr(V)ρμxqxRxy/σxρμyqyRyx/σy+rxy)=(μxμy+σxσyρ)Pr(V)+(μyσx+μxσyρρμxσy)qxRxy+(μyσxρ+μxσyρμyσx)qyRyx+σxσyrxy=(μxμy+Σxy)Pr(V)+μyσxqxRxy+μxσyqyRyx+σxσyrxy,
然后减去我们得到 E[X+]E[Y+]
Cov(X+,Y+)=(μxμy+Σxy)Pr(V)+μyσxqxRxy+μxσyqyRyx+σxσyrxy(Qxμx+qxσx)(Qyμy+qyσy).

这是一些用于计算矩的Python代码:

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

并进行有效的蒙特卡洛测试:

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)))

给出0.000572145310512 0.00298692620286,表明所声明的期望和协方差与Monte Carlo估计相符(基于样本)。10,000,000


您可以总结一下这些最终值是什么?他们是对您生成的参数mu和L的估计吗?也许打印那些目标值?
AdamO '18年

不,返回值为和;我打印的是这些数量的蒙特卡洛估计量与计算值之间的距离。您也许可以反转这些表达式以获得和的矩匹配估计量– Rosenbaum实际上在截断的情况下在他的第3节中做了这一点–但这不是我想要的。\E(Z+)\Cov(Z+)LμΣ
Dougal '18
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.