从截断法线绘制

时间:2018-12-24 11:39:37

标签: python scipy

我正在尝试使用truncnorm.rvs从截断的正态分布中提取。截断不是标准的:我正在尝试从在右边截断为零的N(x_i^T*beta, 1/lambda_i)进行绘制。 我使用了以下代码:

    b0 = np.dot(1/lambd[np.where(y ==0)],(0-meanZ[np.where(y ==0)]))
    Z[np.where(y ==0)] = truncnorm.rvs(a = -np.inf, b = 0, loc = meanZ[np.where(y ==0)], scale = 1/lambd[np.where(y ==0)])

我的两个问题是: -我仍然会得到Z的正值 -我还得到了-np.inf值,该值与我的其余代码混淆 例如,使用b0= -2445.6

loc = [ -4.262042 -11.300968  -5.482057  -5.660079  -5.586314   3.926029
-3.998386  -7.042979  -9.910377  -1.485213  -5.607546  -3.452188
-3.808936  -3.890414  -6.015614  -4.298134  -6.732967  -7.896627
-10.468604]

scale = [1.416786e+01 9.202257e+01 2.927436e+00 1.769420e+01 2.318473e+00
 1.053422e+03 8.480848e-01 1.023893e+00 1.837827e+00 1.849986e+01 
6.647380e+00 4.088136e+01 1.860682e+00 1.490134e+01 2.811685e+00 
3.485057e+00 1.108821e+00 1.344376e+01 1.463855e+00]

1 个答案:

答案 0 :(得分:1)

由参数ab设置的形状是根据标准正态分布(均值0,方差1)定义的。

您想将分布N(mu, sigma**2)限制为负值;也就是说,您希望N(mu, sigma**2) <0。使用正态分布的属性将其写为:

N(mu, sigma**2) = mu + sigma * N(0, 1) < 0

N(0, 1) < -mu/sigma

因此,您必须将b设置为-mu/sigma

这是一个简短的脚本来演示:

import numpy as np
from scipy.stats import truncnorm
import matplotlib.pyplot as plt


mu = -2.0
sigma = 3.5

size = 25000

x = truncnorm.rvs(a=-np.inf, b=-mu/sigma, loc=mu, scale=sigma, size=size)

plt.hist(x, bins=100, density=True, alpha=0.6)
xx = np.linspace(x.min(), 0, 400)
yy = truncnorm.pdf(xx, a=-np.inf, b=-mu/sigma, loc=mu, scale=sigma)
plt.plot(xx, yy, 'k--', linewidth=1)
plt.grid()
plt.show()

该脚本生成此图:

plot