逻辑斯蒂拟合报错IndexError:索引越界问题求助
解决逻辑斯蒂拟合中的IndexError问题
错误原因分析
你遇到的IndexError: index 1 is out of bounds for axis 0 with size 1主要来自两个核心问题:
- logistic函数运算优先级错误:原代码中
return l / 1+np.exp(-k*(x-x1))会先计算l/1,再与指数结果相加,导致返回的数组维度与输入不匹配,触发索引错误。正确的逻辑斯蒂公式需要给分母1 + np.exp(...)加上括号。 - 迭代次数不足:
maxfev=100设置过小,curve_fit无法完成足够迭代来收敛,容易引发拟合失败相关的异常。
修复后的代码
import numpy as np import matplotlib.pyplot as plt from scipy.optimize import curve_fit def logistic(x, l, k, x1): # 修正运算优先级,给分母添加括号 return l / (1 + np.exp(-k*(x-x1))) distance= [1.000*70, 2.000*70, 3.000*70, 4.000*70, 5.000*70, 6.000*70, 7.000*70, 8.000*70, 9.000*70, 11.00*70, 12.000*70, 13.000*70, 14.000*70, 15.000*70, 16.000*70, 17.000*70, 18.000*70, 19.000*70, 21.000*70, 22.000*70, 23.000*70, 24.000*70, 25.000*70, 26.000*70, 27.000*70, 28.000*70, 29.000*70, 30.000*70, 31.000*70, 32.000*70, 33.000*70, 34.000*70, 35.000*70, 36.000*70] amplitude= [26, 31, 29, 26, 27, 24, 24, 28, 24, 24, 28, 31, 24, 26, 55, 30, 73, 101, 168, 219, 448, 833, 1280, 1397, 1181, 1311, 1715, 1975, 2003, 2034, 2178, 2180, 2182] plt.plot(distance,amplitude, 'o') # 增大maxfev迭代次数,调整k的初始值和边界(避免指数溢出) popt, pcov = curve_fit(logistic, distance, amplitude, maxfev=10000, bounds=((100, 0.001, 0), (2500, 0.1, 2520)), p0=[2200, 0.01, 2000]) print(popt) plt.plot(distance, logistic(distance, *popt), 'r', label='logistic fit') plt.legend() plt.show()
额外优化说明
- 调整了
k的初始值和边界:原代码中k的初始值3000过大,结合distance的范围(702520),会导致`-k*(x-x1)`数值溢出,拟合无法收敛。缩小k的范围到0.0010.1,初始值设为0.01更合理。 - 调整了
l的上限:你的amplitude最大值在2182左右,把l的上限设为2500比200000更贴合数据,减少拟合的搜索范围。
内容的提问来源于stack exchange,提问作者Ben Jack
相关产品推荐
相关产品推荐

