为新数据集创建梯度下降模型时出错
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)通常不是个好主意,因为有更高效的方法。