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

为新数据集创建Gradient Descent模型时出现错误求助

梯度下降模型报错问题排查

我是机器学习(ML)新手,此前曾使用其他数据集练习创建梯度下降模型,本次尝试使用随机数据集进一步学习梯度下降,但在创建模型时出现错误。

相关代码如下:

import pandas as pd 

file = pd.read_excel('slr06.xlsx')
# Data 
x = pd.DataFrame(file, columns=['X'])
y = pd.DataFrame(file, columns=['Y'])
# Parameters 
w = 0.0
b = 0.0
# HyperParameters 
learning_rate = 0.01

# Creating Gradient Descent 

def descend(x, y, w, b, learning_rate):
    dl_dw = 0.0
    dl_db = 0.0
    n = x.shape[0]
    # loss = (y-yhat)**2
    for xi, yi in zip(x, y):
        dl_dw = -2*xi*(yi-(w*xi+b))
        dl_db = -2*(yi-(w*xi+b))
    # Make an Update
    w = w - learning_rate*(1/n)*dl_dw
    b = b - learning_rate*(1/n)*dl_db
    
    return w, b
# Iteratively make updates 
for epoch in range(500):
    w, b = descend(x, y, w, b, learning_rate)
    yhat = w * x + b
    loss = np.divide(np.sum((y - yhat)**2, axis=0), x.shape[0])
    print(f"{epoch} loss is {loss} parameters w: {w} | b:{b}")

数据与错误说明

  • 数据集:包含X和Y两列的表格数据
  • 错误:运行代码时出现类型不匹配错误,无法对DataFrame对象与数值进行运算,同时存在np未定义的NameError

问题根源

  1. 遍历对象错误:zip(x, y)遍历的是DataFrame的列名(字符串类型),而非每行的数值,导致后续计算出现类型不兼容问题
  2. 缺失numpy导入:代码中使用np.divide但未导入numpy库,引发NameError
  3. 梯度计算错误:循环中直接覆盖dl_dw和dl_db,未累加所有样本的梯度,导致梯度值仅保留最后一个样本的计算结果

修复后的代码

import pandas as pd
import numpy as np  # 新增numpy库导入

file = pd.read_excel('slr06.xlsx')
# 将DataFrame列转为numpy数组,便于逐元素访问
x = file['X'].values
y = file['Y'].values
# 参数初始化
w = 0.0
b = 0.0
# 超参数
learning_rate = 0.01

# 梯度下降函数
def descend(x, y, w, b, learning_rate):
    dl_dw = 0.0
    dl_db = 0.0
    n = x.shape[0]
    # 遍历所有样本,累加梯度
    for xi, yi in zip(x, y):
        yhat = w * xi + b
        dl_dw += -2 * xi * (yi - yhat)
        dl_db += -2 * (yi - yhat)
    # 更新参数
    w = w - learning_rate * (dl_dw / n)
    b = b - learning_rate * (dl_db / n)
    
    return w, b

# 迭代更新参数
for epoch in range(500):
    w, b = descend(x, y, w, b, learning_rate)
    yhat = w * x + b
    loss = np.mean((y - yhat)**2)  # 用np.mean简化损失计算
    print(f"{epoch} loss is {loss:.4f} parameters w: {w:.4f} | b:{b:.4f}")

关键修复点

  • 将DataFrame列转为numpy数组(values属性),确保遍历的是数值而非列名
  • 补充numpy库导入,解决np未定义问题
  • 循环中使用+=累加梯度,保证梯度是所有样本的平均值
  • 用np.mean替代手动计算均值,代码更简洁易读

内容的提问来源于stack exchange,提问作者Syed Mohmmad Ali Jafri

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 09:42:48