梯度下降法 3 實現線性回歸中的梯度下降法

2022-08-04 00:42:18 字數 3778 閱讀 8223

構造資料集

import numpy

import matplotlib.pyplot as plt

# 設定隨機數種子

numpy.random.seed(666)

x = 2 * numpy.random.random(size=100)

y = x * 3. + 4. + numpy.random.normal(size=100) #random.normal 為產生正太分布的噪點

#假設此樣本有乙個特徵值,把100個數轉化為100行,1列

繪製此資料集:

目標:使

\[ j = \frac\sum_^(y^ - \hat^)^2 $$盡可能的小

$$\lambda j = \begin

\frac \\

\frac \\

\frac \\

... \\

\frac

\end = \frac\begin

\sum(x^_b\theta - y^) \\

\sum(x^_b\theta - y^) \cdot x_1^\\

\sum(x^_b\theta - y^) \cdot x_2^\\

...\\

\sum(x^_b\theta - y^) \cdot x_3^

\end\]

定義函式和導數的表示式

def j(theta,x_b,y):   #損失函式的表示式

try:

return numpy.sum((y - x_b.dot(theta))**2)/len(x_b)

except:

return float('inf') #返回float的最大值

def dj(theta,x_b,y): #求導

#要返回的導數矩陣

res = numpy.empty(len(theta))

res[0] = numpy.sum(x_b.dot(theta)-y)

for i in range(1,len(theta)):

res[i] = ((x_b.dot(theta)-y).dot(x_b[:,i]))

return res*2/len(x_b)

定義梯度下降的演算法過程

def gradient_descent(x_b,y,init_theta,eta,n_iters=1e4,espilon=1e-8):

theta = init_theta

i_iters = 0

#n_iters 表示梯度下降的次數,超過這個值,有可能演算法不收斂,退出

while n_iters>i_iters:

gradient = dj(theta,x_b,y) #偏導數

last_theta = theta

theta = theta - eta * gradient #梯度下降,向極值移動

if abs(j(theta,x_b,y) - j(last_theta,x_b,y)) < espilon:

break

i_iters += 1

# 返回求出的theta值

return theta

構造初始引數,並進行梯度下降的過程:

x_b = numpy.hstack([numpy.ones((len(x),1)),x])

init_theta = numpy.zeros(x_b.shape[1])

eta = 0.01

theta = gradient_descent(x_b,y,init_theta,eta)

求得的theta值

建立資料集時,截距為4,斜率為3,由此可以看出,此梯度下降法成功的訓練了此模型

def fit_gd(self,x_train,y_train,eta=0.01,n_iters=1e4):

assert x_train.shape[0] == y_train.shape[0],\

"size of x_train must be equal to the size of y_train"

def j(theta,x_b,y):

try:

return numpy.sum((y - x_b.dot(theta))**2)/len(x_b)

except:

return float('inf') # 返回float的最大值

def dj(theta,x_b,y):

#要返回的導數矩陣

res = numpy.empty(len(theta))

res[0] = numpy.sum(x_b.dot(theta)-y)

for i in range(1,len(theta)):

res[i] = ((x_b.dot(theta)-y).dot(x_b[:,i]))

return res*2/len(x_b)

def gradient_descent(x_b,y,init_theta,eta,n_iters,espilon=1e-8):

theta = init_theta

i_iters = 0

while n_iters>i_iters:

gradient = dj(theta,x_b,y) #偏導數

last_theta = theta

theta = theta - eta * gradient #梯度下降,向極值移動

if abs(j(theta,x_b,y) - j(last_theta,x_b,y)) < espilon:

break

i_iters += 1

return theta

x_b = numpy.hstack([numpy.ones((len(x_train),1)),x_train])

init_theta = numpy.zeros(x_b.shape[1])

self._theta = gradient_descent(x_b,y_train,init_theta,eta,n_iters)

self.coef_ = self._theta[1:] #係數

self.interception_ = self._theta[0] #截距

return self

封裝後呼叫:

from mylib.lineregression import lineregression

lin_reg = lineregression()

# 用梯度下降法訓練

線性回歸與梯度下降法

原文 最近在看斯坦福的 機器學習 的公開課,這個課程是2009年的,有點老了,不過講的還是很好的,廓清了一些我以前關於機器學習懵懂的地方。我的一位老師曾經說過 什麼叫理解?理解就是你能把同乙個事情用自己的語言表達出來,並且能讓別人聽得懂。本著這樣的原則,同時也為了證明自己是 理解 的,於是決定打算在...

20191008 線性回歸 梯度下降法

不斷的迭代,還是波士頓房價 獲取資料 資料清洗預處理 劃分資料集 特徵工程 預估器流程 coef intercept 模型評估 from sklearn.datasets import load boston from sklearn.model selection import train tes...

梯度下降法求解線性回歸

梯度下降法 英語 gradient descent 是乙個一階最優化演算法,通常也稱為最速下降法。要使用梯度下降法找到乙個函式的區域性極小值,必須向函式上當前點對應梯度 或者是近似梯度 的反方向的規定步長距離點進行迭代搜尋。如果相反地向梯度正方向迭代進行搜尋,則會接近函式的區域性極大值點 這個過程則...