機器學習 隨機梯度下降法(線性回歸中的應用)

2022-03-22 01:17:17 字數 3355 閱讀 6293

# 只針對線性回歸中的使用

1)批量梯度下降法的特點

運算量大:批量梯度下降法中的每一項計算:

,要計算所有樣本(共 m 個);

批量梯度下降法的梯度是損失函式減小最快的方向,也就是說,對應相同的 theta 變化量,損失函式在梯度方向上的變化量最大;

1)基礎理解

2)優化方向的公式

每一次搜尋的方向,不能保證是損失函式減小的方向;

每一次搜尋的方向,不能保證是損失函式減小最快的方向;

其優化方向具有不可預知性;

實驗結論表明,即使隨機梯度下降法的優化方向具有不可預知性,通過此方法依然可以差不多來到損失函式最小值的附近,雖然不像批量梯度下降法那樣,一定可以來到損失函式最小值位置,但是,如果樣本數量很大時,有時可以用一定的模型精度,換取優化模型所用的時間;

原因:在隨機梯度下降法優化損失函式的過程中,如果 η 一直取固定值,可能會出現,已經優化到損失函式最小值位置了,但由於隨機的過程不夠好,η 又是各固定值,導致優化時慢慢的又跳出最小值位置;

方案:優化過程中讓 η 逐漸遞減(隨著梯度下降法迴圈次數的增加,η 值越來越小);

3)η 的確定過程

問題:隨著迴圈次數(i_iters)的增加,η 的變化率差別太大;

解決了 η 的變化率差異過大

分子改為 a ,增加 η 取值的靈活度;

a、b:為隨機梯度下降法的超引數;

本次學習不對 a、b 調參,選用經驗上比較適合的值:a = 5、b = 50;

# 學習率隨著迴圈次數的增加,逐漸遞減;

# 這種逐漸遞減的思想,是模擬在搜尋領域的重要思路:模擬退火思想

#模擬退火思想:在退火過程中的冷卻函式,溫度與冷卻時間的關係;

將每個樣本都隨機抽取到;

將每個樣本至少抽取 n 次,也就是總的迴圈次數一般為:len(x_b) * n;

將變形後的資料集 x_b 的 index 做隨機亂序處理,得到新的資料集 x_b_new ;

根據亂序後的 index 逐個抽取 x_b_new 中的樣本,迴圈 n 遍;

# array . dot(m) == array . m

批量梯度下降法:1)達到設定的迴圈次數;2)找到損失函式的最小值

隨機梯度下降法:達到設定的迴圈次數

1)**實現隨機梯度下降法

2)封裝與呼叫自己的**

獲取原始資料

import

numpy as np

import

matplotlib.pyplot as plt

from sklearn import

datasets

boston =datasets.load_boston()

x =boston.data

y =boston.target

x = x[y < 50.0]

y = y[y < 50.0]

資料分割

from alg.data_split import

train_test_split

x_train, x_test, y_train, y_test = train_test_split(x, y, seed=666)

資料歸一化

from sklearn.preprocessing import

standardscaler

standardscaler =standardscaler()

standardscaler.fit(x_train)

x_train_standard =standardscaler.transform(x_train)

x_test_standard = standardscaler.transform(x_test)

# 資料歸一化,主要是將訓練資料集(x_train)和測試資料集(x_test)歸一化;

使用線性回歸演算法:linearregression

from lr.linearregression import

linearregression

lin_reg =linearregression()

%time lin_reg.fit_sgd(x_train_standard, y_train, n_iters=2)

lin_reg.score(x_test_standard, y_test)

#輸出:wall time: 10 ms

0.7865171620468298

#問題:通過score()函式得到的 r^2 值,也就是準確度過小

#原因:對所有的 x_train_standard 迴圈優化的遍數太少:n_iters=2

迴圈遍數改為 50:n_iters=50

%time lin_reg.fit_sgd(x_train_standard, y_train, n_iters=50)

lin_reg.score(x_test_standard, y_test)

#輸出:wall time: 143 ms

0.8085728716573835

迴圈遍數改為 100:n_iters = 100

%time lin_reg.fit_sgd(x_train_standard, y_train, n_iters=100)

lin_reg.score(x_test_standard, y_test)

#輸出:wall time: 502 ms

0.8125954368325295

總結隨著迴圈遍數的增加,模型的準確度也隨著增加;3)呼叫 scikit-learn 中的演算法模型

4)總結

通過計算時間就可以看出:n_iters=100時,自己的演算法需要 502ms,scikit-learn中的演算法需要 8ms;

自己所學的封裝好的演算法,只是為了幫助理解演算法的原來,而scikit-learn中使用了很多優化的方案

機器學習 批量梯度下降法(線性回歸中的使用)

1 基礎概念 2 梯度下降原理 此圖為有兩個引數的梯度下降法的視覺化 z x2 2y2 一圈圈的紅線為等高線,也就是每次引數x y的變化後目標函式 z 的取值 越外圈的 z 的取值越大,中心位置表示 z 的最小值 z 的取值可以延不同的方向逐層下降,箭頭表示梯度下降的方向,也是 z 的取值變化最快的...

機器學習之梯度下降法求解線性回歸

最小二乘法的優點 準確率比較高,缺點 當有兩個或者兩個以上的變數時,就會出現計算量大,過於複雜。這時我們將用梯度下降的方法來畫出擬合圖。梯度下降 import pandas as pd import numpy as np import matplotlib.pyplot as plt points...

線性回歸與梯度下降法

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