簡體   English   中英

使用梯度下降的線性回歸

[英]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()

給出這個結果:

  • 坡度:2.8061974241244196
  • Y截距:0.5712221080810446

在此處輸入圖像描述

問題是雖然利用 sklearn 來計算斜率和截距,即

model = LinearRegression(fit_intercept=True).fit(np.array(dataset['alcohol']).copy().reshape(-1, 1),
                                                 np.array(dataset['total']).copy())

我得到了完全不同的東西:

  • 坡度:2.0325063
  • 截取:5.8577761548263005

在此處輸入圖像描述

知道為什么嗎? 看着 SO,我發現一個可能的問題可能是學習率太高,但如上所述,我目前使用的是 0.0001

Sklearn 的線性回歸不使用梯度下降 - 它使用普通最小二乘 (OLS) 回歸,這是一種非迭代方法

對於您的 model,您可以考慮隨機初始化 m, c 而不是從 0,0 開始。 您還可以考慮調整學習率或使用自適應學習率。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM