梯度下降最小二乘法代码问题

-1 投票
1 回答
53 浏览
提问于 2025-04-14 18:00

我正在尝试在一个数据集上使用梯度下降法。我写的代码是:

import numpy
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

data = pd.read_csv('C:/Users/Teacher/Downloads/data.csv')
X = data.iloc[:, 0]  # selects all data from first column in data
Y = data.iloc[:, 1]
plt.scatter(X,Y)
plt.show()
n = len(X)

a = 0
b = 0
L = .001

for i in range(1000):
    y_predicted = a * X + b
    pd_a = (1 / n) * sum((y_predicted - Y) * X)
    pd_b = (1 / n) * sum(y_predicted - Y)
    a = a - L * pd_a
    b = b - L * pd_b
print(a, b)
plt.scatter(X, Y)
c, d = numpy.polyfit(X, Y, 1)
print(c, d)
plt.plot([min(X), max(X)], [a * x + b for x in [min(X), max(X)]], [c * x + d for x in [min(X), max(X)]])
plt.show()

如果我把X和Y = np.random.rand(20)这样定义,那么一切似乎都正常,所以问题可能出在从csv文件读取的数据上。

不过,即使我把X和Y定义为数据集的第一列和第二列,散点图看起来还是不错的,所以我不太明白发生了什么。

编辑:这是在定义X = data.iloc[:, 0]和Y = data.iloc[:, 1]之后的散点图的图片。

这里是图片描述

这是代码最后的图和线的图片。

这里是图片描述

打印出来的data.head()的结果:

这里是图片描述

编辑:只读取csv的一行:

这里是图片描述

这里是图片描述

1 个回答

1

因为我没有这个csv文件,所以我会按照下面的方法来排查为什么从csv读取数据不成功。

假设:每行有2行数据,所以我们会用下面的循环来创建X和Y这两个列表。

data = pd.read_csv('C:/Users/Teacher/Downloads/data.csv')
X, Y = [], []
for i in data:
  X.append(i.split()[0])
  Y.append(i.split()[1])

撰写回答