梯度下降最小二乘法代码问题
我正在尝试在一个数据集上使用梯度下降法。我写的代码是:
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])