[英]Linear regression using Gradient Descent
我在嘗試使用梯度下降找到線性回歸線時遇到了一些問題,得到了奇怪的結果。 這是 function:
def gradient_descent(m_k, c_k, learning_rate, points):
n = len(points)
dm, dc = 0, 0
for i in range(n):
x = points.iloc[i]['alcohol']
y = points.iloc[i]['total']
dm += -(2/n) * x * (y - (m_k * x + c_k)) # Partial der in m
dc += -(2/n) * (y - (m_k * x + c_k)) # Partial der in c
m = m_k - dm * learning_rate
c = c_k - dc * learning_rate
return m, c
並結合一個 for 循環
l_rate = 0.0001
m, c = 0, 0
epochs = 1000
for _ in range(epochs):
m, c = gradient_descent(m, c, l_rate, dataset)
plt.scatter(dataset.alcohol, dataset.total)
plt.plot(list(range(2, 10)), [m * x + c for x in range(2,10)], color='red')
plt.show()
給出這個結果:
問題是雖然利用 sklearn 來計算斜率和截距,即
model = LinearRegression(fit_intercept=True).fit(np.array(dataset['alcohol']).copy().reshape(-1, 1),
np.array(dataset['total']).copy())
我得到了完全不同的東西:
知道為什么嗎? 看着 SO,我發現一個可能的問題可能是學習率太高,但如上所述,我目前使用的是 0.0001
Sklearn 的線性回歸不使用梯度下降 - 它使用普通最小二乘 (OLS) 回歸,這是一種非迭代方法。
對於您的 model,您可以考慮隨機初始化 m, c 而不是從 0,0 開始。 您還可以考慮調整學習率或使用自適應學習率。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.