基于线性回归参数实现并绘制Sigmoid曲线报错求助
解决你的Sigmoid曲线绘制错误问题
我帮你排查下代码里的问题,这个错误其实是两个小细节导致的,咱们一步步解决:
错误原因拆解
LR.coef_的类型问题:sklearn的LinearRegression返回的coef_是一个numpy数组(比如形状为(1,)),而不是单个浮点数。你直接把它传入sigmoid函数,后续计算时会出现数组与标量的运算不兼容问题。- 循环里的变量误用+
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
相关产品推荐
相关产品推荐

