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

使用Python中Scipy的curve_fit拟合Sigmoid曲线失败求助

解决Sigmoid曲线拟合无效的问题

核心问题分析

你定义的Sigmoid是归一化版本(输出范围仅0-1),但你的array2数据取值在20-96之间,函数输出范围和数据完全不匹配,这是拟合失败的根本原因。同时初始猜测值p0和边界设置也不符合参数实际意义。

修正方案

1. 使用带上下限的Sigmoid函数

改用适配数据取值范围的变形Sigmoid,加入输出最小值、最大值参数:

def sigmoid(x, a, b, y_min, y_max):
    # a: 曲线中点对应的x值,b: 曲线斜率,y_min/y_max: 输出的最小/最大值
    return y_min + (y_max - y_min) / (1 + np.exp(-b*(x - a)))

2. 合理设置初始值与边界

观察数据分布:

  • array1的中点大致在10-15区间
  • array2最小值≈20,最大值≈96
  • 斜率b取较小值(比如0.2)避免拟合发散

修正后的完整代码

import numpy as np
import pylab
from scipy.optimize import curve_fit

# 原始数据
array1 = np.array([18.7327, 9.3784, 6.6293, 20.8361, 11.2603, 19.3706, 5.4302, 10.1293, 13.7516,
                   8.0567, 16.8688, 4.969, 3.94, 19.4793, 11.7527, 13.2811, 13.338, 0.5944,
                   7.4406, 11.2338, 6.2283, 3.4818, 10.1056, 16.2689, 22.442, 18.7345, 5.2605,
                   5.6405, 12.7186, 18.2497, 5.4315, 14.2651, 16.7544, 12.9192, 13.5955, 10.9256,
                   5.7798, 8.4485, 8.5229, 11.879, 6.5271, 10.3376, 7.781, 31.4558, 8.0236,
                   2.3527, 10.8926, 16.1995, 11.1924, 25.8071, 13.9692, 20.7791, 10.3045, 12.2833,
                   7.4066, 15.9807, 11.4462, 15.1504, 5.9021, 19.1184])
array2 = np.array([83.85, 52.45, 41.2, 92.59, 62.65, 86.77, 30.63, 53.78, 73.34, 48.55, 82.53, 28.3,
                   23.87, 90.99, 62.95, 68.82, 71.06, 20.74, 45.25, 60.65, 39.07, 21.93, 53.35, 79.61,
                   93.27, 85.88, 28.95, 32.73, 65.89, 83.51, 30.74, 75.22, 79.8, 67.43, 71.12, 58.41,
                   35.83, 49.61, 50.72, 63.49, 40.67, 55.75, 46.49, 96.22, 47.62, 21.8, 56.23, 76.97,
                   59.07, 94.67, 74.9, 92.52, 55.61, 63.51, 41.34, 76.8, 62.81, 75.99, 36.34, 85.96])

# 适配数据范围的Sigmoid函数
def sigmoid(x, a, b, y_min, y_max):
    return y_min + (y_max - y_min) / (1 + np.exp(-b*(x - a)))

# 设置初始值与边界
p0 = [12, 0.2, 20, 96]
bounds = ([0, 0, 15, 90], [35, 1, 25, 100])
popt, pcov = curve_fit(sigmoid, array1, array2, p0=p0, bounds=bounds)

print("拟合参数:", popt)

# 绘制拟合结果
x = np.linspace(0, 35, 100)
y = sigmoid(x, *popt)

pylab.plot(array1, array2, 'o', label='原始数据')
pylab.plot(x, y, label='拟合曲线', color='red')
pylab.ylim(15, 100)
pylab.legend(loc='best')
pylab.xlabel('array1')
pylab.ylabel('array2')
pylab.show()

效果说明

修正后拟合曲线会大致贴合数据趋势,满足你“无需高精度”的需求。核心是让函数输出范围与数据匹配,同时参数初始值和边界要符合数据实际分布。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 08:15:40