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

Python定义拟合函数如何加约束?三对数正态混合分布权重和不为1问题

问题根因

你在函数内部对P1的赋值仅会改变计算函数返回值时用到的P1数值,完全不会约束scipy.optimize.curve_fit的参数优化逻辑:

  • curve_fit会独立优化你在函数入参里定义的所有9个参数(3个mu、3个sigma、3个权重P),你内部覆盖P1的操作不会影响优化器对入参P1的迭代更新
  • 你看到拟合曲线符合预期,是因为计算曲线值时用的是你内部重新赋值的P1,但优化器最终返回的params里的第6位(也就是你定义的入参P1)是没有被约束的无效值,你直接把三个参数里的P相加自然不会等于1

解决方法

直接把P1从待优化参数中移除,仅保留P2和P3作为待拟合的权重参数,自然满足三个权重之和为1的约束,同时可以根据需要修正直方图的归一化逻辑,让拟合得到的权重数值更符合真实占比。

步骤1:修改拟合函数

import numpy as np
from scipy.optimize import curve_fit, LinearConstraint

def logN(x, mu1, mu2, mu3, sigma1, sigma2, sigma3, P2, P3 ):
    P1 = 1 - P2 - P3
    part1 = P1 * (np.exp(-(np.log(x) - mu1)**2 / (2 * sigma1 **2)) / (x * sigma1 * np.sqrt(2 * np.pi)))
    part2 = P2 * (np.exp(-(np.log(x) - mu2)**2 / (2 * sigma2 **2)) / (x * sigma2 * np.sqrt(2 * np.pi)))
    part3 = P3 * (np.exp(-(np.log(x) - mu3)**2 / (2 * sigma3 **2)) / (x * sigma3 * np.sqrt(2 * np.pi)))
    return part1 + part2 + part3

步骤2:调整curve_fit调用参数

移除和P1相关的参数定义,同时可以添加线性约束保证P1不会为负数:

#  bounds顺序:mu1,mu2,mu3,sigma1,sigma2,sigma3,P2,P3
bounds_low = (0, 0, 0, 0, 0, 0, 0, 0)
bounds_high = (2, 2, 2, np.inf, np.inf, np.inf, 1, 1)
# 初始值同理,移除原P1的初始值
p0 = (1, 1, 1, 0.5, 0.5, 0.5, 0.3, 0.3)
# 添加线性约束:P2 + P3 <=1,保证P1>=0
constraints = LinearConstraint([[0,0,0,0,0,0,1,1]], 0, 1)

params, pcov = curve_fit(
    logN, X, Y, 
    method="trf", 
    bounds=(bounds_low, bounds_high), 
    p0=p0, 
    constraints=constraints,
    maxfev=4000
)

步骤3:获取拟合后的权重

P2_fit = params[6]
P3_fit = params[7]
P1_fit = 1 - P2_fit - P3_fit
# 三者之和必然为1
print(f"三个权重分别为:{P1_fit:.3f}, {P2_fit:.3f}, {P3_fit:.3f}, 和为:{P1_fit+P2_fit+P3_fit}")

可选优化:修正直方图归一化逻辑

你当前的Y = Yi/Yi.sum()是对频数做归一化,总和为1,但对数正态PDF的积分(面积)为1,两者差了bin宽度的系数,会导致拟合得到的权重整体偏小。如果需要权重数值匹配真实的1/3占比,可修改Y的计算方式:

bin_width = np.diff(bins)[0]
Y = Yi / (Yi.sum() * bin_width)

绘图调整

拟合函数入参减少后,绘图时传参也要对应调整:

plt.plot(X, logN(X, params[0], params[1], params[2], params[3], params[4], params[5], params[6], params[7]),'b', linewidth=2)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 13:45:02