为新数据集创建梯度下降模型时出错

-1 投票
1 回答
25 浏览
提问于 2025-04-14 17:43
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}")

我刚接触机器学习,正在用一个数据集练习,结果遇到了错误。

这是数据集的截图 -

这是错误的截图 -

我在创建一个梯度下降模型,这个模型我之前用不同的数据集练习过。这次我尝试用随机数据来练习,以更好地理解梯度下降。

1 个回答

0

这个模糊的错误是因为数据类型不对,比如说像 [1,2] * 1.0 或者 "hello" * 3 这样的乘法运算。

你的错误是因为使用了错误的迭代方法,类似于下面这个:

>>> df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})
>>> for x in df:
...     print(x)
A
B

你的 xi, yi 变量是字符串,当你用浮点数去乘它们时就会导致错误。


你可以用多种方法来修改你的代码。不过,最有效的方法是这样做:

# Do not duplicate memory, and use a Series instead of a data frame
x = file.X
y = file.Y

现在这个 for 循环部分就不会再报错了。此外,如果你使用全批量梯度下降的话,可以不需要 for 循环就能使用向量化。


附注:记住一件事:遍历数据框(dataframe)通常不是个好主意,因为有更高效的方法。

撰写回答