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

逻辑斯蒂拟合报错IndexError:索引越界问题求助

解决逻辑斯蒂拟合中的IndexError问题

错误原因分析

你遇到的IndexError: index 1 is out of bounds for axis 0 with size 1主要来自两个核心问题:

  1. logistic函数运算优先级错误:原代码中return l / 1+np.exp(-k*(x-x1))会先计算l/1,再与指数结果相加,导致返回的数组维度与输入不匹配,触发索引错误。正确的逻辑斯蒂公式需要给分母1 + np.exp(...)加上括号。
  2. 迭代次数不足: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 08:05:34