You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Scipy拟合固定截断阈值的截断正态分布

用Scipy拟合已知绝对截断范围的截断正态分布

我需要用Scipy拟合截断正态分布,已知数据的截断范围为[np.log(2.5e6), np.inf],且有经验数据可用。已知通过scipy.stats.truncnorm.fit(data, fb=np.inf)可以设置正确的上界,但fa参数需要通过公式fa=(np.log(2.5e6)-mu)/sigma计算——而潜在正态分布的mu和sigma是未知的,无法直接确定fa。

遇到的问题:

  • 不提供fa参数时,拟合结果完全错误;
  • 用样本均值和标准差估算fa时,拟合效果极差;
  • 只有在模拟场景中传入正确的fa作为初始值时,拟合才能正常进行。

我尝试过以下约束优化代码,但运行后只得到NaN值:

def func(p, r, xa):
    a, loc, scale = p
    return scipy.stats.truncnorm.nnlf([a, np.inf, loc, scale], r)
    #return truncnorm.nnlf(p, r)


def constraint(p, r, xa):
    a, loc, scale = p
    return np.array([a*scale + loc - xa])


xa = np.log(2.5e6)
mu = 14.71
sigma = 1.14
a = (xa - mu)/sigma
log_data = scipy.stats.truncnorm(a=a, b=np.inf, loc=mu, scale=sigma).rvs(10**6)
loc_guess = np.mean(log_data)
scale_guess = np.std(log_data)
a_guess = (xa - loc_guess)/scale_guess
p0 = [a_guess, loc_guess, scale_guess]

par = scipy.optimize.fmin_slsqp(func, p0, f_eqcons=constraint, args=(log_data, xa),
                 iprint=False, iter=1000)

print(par)

补充说明:我还做了模拟数据拟合测试:不传入归一化下界时,拟合结果错误;传入正确的归一化下界则拟合正常。但实际场景中,我只知道绝对值形式的截断点(即log_data >= np.log(2.5e6)),不知道相对于mu和sigma的归一化值,该怎么处理?

对应测试代码:

import scipy
import numpy as np

THRESHOLD = np.log(2.5e6)
mu = 14.71
sigma = 1.14
A_CORRECT = (THRESHOLD - mu)/sigma
BLN = scipy.stats.truncnorm(loc=mu, scale=sigma, a=A_CORRECT, b=np.inf)
log_data = BLN.rvs(10**6)
print('理论正态分布统计量', BLN.mean(), BLN.std())
print('经验正态分布统计量', np.mean(log_data), np.std(log_data))
# 原代码中data未定义,此处注释
# print('对数正态经验统计量', np.mean(data), np.std(data))
# A_GUESS = (THRESHOLD-np.mean(log_data))/np.std(log_data)
# print(A_CORRECT, A_GUESS)
x = scipy.stats.truncnorm.fit(log_data, fb=np.inf, method='MLE')
print("a", "b", "loc", "std")
print(x)
print(scipy.stats.truncnorm.fit(log_data, fb=np.inf, fa=A_CORRECT, method="MLE"))

测试输出:

理论正态分布统计量 14.73053747333533 1.139387450709973
经验正态分布统计量 14.73043234715727 1.1392765414017013
a b loc std
(4.332558230073726, inf, -0.26590264062021884, 3.4612803954831683)
(0.019123938454760524, inf, 14.710001292351723, 1.1399781227638002)

内容的提问来源于stack exchange,提问作者Massimo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 04:43:32