技术求助:优化高斯分布参数m、s,期望esti_parametrs输出[0,1]
修复正态分布参数估计的代码问题
我来帮你排查下代码里的问题,让你能得到期望的[0,1]参数结果:
原代码存在的几个关键问题
- 目标函数输入格式错误:
scipy.optimize.minimize要求目标函数接收单个参数数组,而不是分开的m和s,你当前的lambda函数会导致参数传递不匹配。 - 未计算总对数似然:
gaus函数返回的是单个样本的对数似然值,优化时需要对所有样本的对数似然求和,才能得到正确的目标函数值。 - 初始猜测不合理:初始猜测的
s设为0,会导致gaus函数里出现除以0的情况,引发数值错误;而且标准差必须是正数,初始值应该设为正数。 - 未添加参数约束:标准差
s必须大于0,没有约束的话优化过程中可能出现负数或0,导致计算失效。
修改后的完整代码
from scipy import optimize import numpy as np # 生成数据集(均值0,标准差1的正态分布) x = np.random.randn(100) def gaus(x, m, s): return np.log(1 / (np.sqrt(2 * np.pi) * s) * np.exp(- (x - m) ** 2 / (2 * s ** 2))) # 修正目标函数:接收参数数组,计算总对数似然的负值(因为minimize是求最小值,对应最大化对数似然) def objective(params): m, s = params # 对所有样本的对数似然求和,再取负 return -np.sum(gaus(x, m, s)) # 合理的初始猜测:均值设0,标准差设1(或者其他正数比如0.5也可以) initial_guess = [0, 1] # 添加约束:标准差s必须大于0(使用bounds参数) bounds = [(-np.inf, np.inf), (1e-6, np.inf)] # m无约束,s最小设为极小正数避免除以0 # 执行优化 esti_parametrs = optimize.minimize(objective, initial_guess, bounds=bounds) print("估计的参数:", esti_parametrs.x) print("优化结果详情:\n", esti_parametrs)
关键修改点说明
- 目标函数重构:把原来的lambda改成接收单个参数数组的函数,拆分出
m和s,然后对所有样本的对数似然求和再取负——因为我们要最大化对数似然,而minimize是求最小值,所以取负转换为最小化问题。 - 初始猜测调整:把
s的初始值从0改成1,避免初始计算时出现除以0的错误。 - 添加参数边界:通过
bounds参数限制s必须大于一个极小的正数(1e-6),确保优化过程中s始终是有效的标准差。
运行修改后的代码,你应该能得到接近[0,1]的估计参数,因为你的数据集x本身就是用均值0、标准差1的正态分布生成的。
内容的提问来源于stack exchange,提问作者Bartłomiej Bojanowski
相关产品推荐
相关产品推荐

