从截断范数抽取

2024-09-28 01:27:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图从截断正态分布中,用树干.rvs. 截断不是标准的:我试图从右边被0截断的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]

Tags: lambda代码标准npb0wherelocbeta
1条回答
网友
1楼 · 发布于 2024-09-28 01:27:55

由参数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

相关问题 更多 >

    热门问题