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

基于线性回归参数实现并绘制Sigmoid曲线报错求助

解决你的Sigmoid曲线绘制错误问题

我帮你排查下代码里的问题,这个错误其实是两个小细节导致的,咱们一步步解决:

错误原因拆解

  1. LR.coef_的类型问题:sklearn的LinearRegression返回的coef_是一个numpy数组(比如形状为(1,)),而不是单个浮点数。你直接把它传入sigmoid函数,后续计算时会出现数组与标量的运算不兼容问题。
  2. 循环里的变量误用+math.exp的限制:你在循环里写的是b0 + b1 * x,这里的x是整个输入数组,不是当前循环的item;而且math.exp()只能处理单个标量值,无法直接处理numpy数组,这就是报错only size-1 arrays can be converted to Python scalars的核心原因。

修正后的完整代码

我把代码优化了一下,既解决错误,又用numpy的向量化运算替代循环,效率更高:

import pandas as pd
import seaborn as sb
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression

# 构建数据集
glucose1 = [i for i in range(100,123)]
glucose2 = [i for i in range(130,140)]
glucose = glucose1 + glucose2
diabetes = [1 if i>126 else 0 for i in glucose]
Data = pd.DataFrame(list(zip(glucose,diabetes)), columns = ['Glucose','Diabetes'])

# 训练线性回归模型
Y = Data['Diabetes'].values
X = Data['Glucose'].values.reshape(-1,1)  # 这里直接reshape,后续不用重复处理
LR = LinearRegression()
LR.fit(X,Y)

# 修正后的Sigmoid函数:用numpy向量化运算,避免循环
def sigmoid(b0, b1, x):
    return 1 / (1 + np.exp(-(b0 + b1 * x)))

# 提取模型参数:coef_是数组,取第一个元素得到斜率值
b0 = LR.intercept_
b1 = LR.coef_[0]
# 计算Sigmoid值
sig = sigmoid(b0, b1, Data['Glucose'].values)

# 绘制曲线(添加原始数据散点更直观)
plt.scatter(Data['Glucose'], Data['Diabetes'], label='Raw Data')
plt.plot(Data['Glucose'], sig, color='red', label='Sigmoid Curve')
plt.xlabel('Glucose')
plt.ylabel('Diabetes Probability')
plt.legend()
plt.show()

关键修改点说明

  • 从LR.coef_中提取[0],把数组转成单个斜率数值;
  • 用np.exp()替代math.exp(),支持数组运算,同时去掉低效的循环;
  • 把X的reshape提前到训练模型前,代码更简洁;
  • 额外添加了原始数据的散点图,让曲线和数据的对应关系更清晰。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:51:23