溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

python學(xué)習(xí)之機(jī)器學(xué)習(xí)2

發(fā)布時(shí)間:2020-03-11 02:06:02 來(lái)源:網(wǎng)絡(luò) 閱讀:338 作者:霍金181 欄目:編程語(yǔ)言

1、梯度下降思想

在數(shù)學(xué)中的梯度下降是:
xk+1 = xk + λkPk
λk表示步長(zhǎng)
Pk表示方向,沿梯度方向下降最快
沿著方向不斷更新x,直到x達(dá)到最小

為了得到最好的擬合線,我們的目標(biāo)是讓損失函數(shù)達(dá)到最小
因此,引入梯度下降的思想:
條件:有一個(gè)J(θ0,θ1)
目標(biāo):讓J(θ0,θ1)最小
步驟:
1、初始化θ0,θ1
2、持續(xù)改變?chǔ)?,θ1的值,讓J(θ0,θ1)越來(lái)越小
3、直到得到一個(gè)J(θ0,θ1)的最小值
2、梯度下降算法

重復(fù)執(zhí)行:
python學(xué)習(xí)之機(jī)器學(xué)習(xí)2
其中:α為學(xué)習(xí)率,也是步長(zhǎng)
求偏導(dǎo)部分(也就是求梯度)是下降方向
python學(xué)習(xí)之機(jī)器學(xué)習(xí)2
線性回歸用到的是同步更新
不論斜率正或負(fù),梯度下降都會(huì)逐漸趨向最小值
如果α太小的話,梯度下降會(huì)很慢
如果α太大的話,梯度下降會(huì)越過(guò)最小值,不僅不會(huì)收斂,還有可能發(fā)散
即使α是固定不變的,梯度下降也會(huì)逐漸到一個(gè)最低點(diǎn),因?yàn)殡S著梯度下降迭代次數(shù)的遞增,斜率會(huì)趨于平緩,也就是說(shuō),倒數(shù)部分會(huì)慢慢變小
至于怎么選取α,下面會(huì)講到
3、線性回歸的梯度下降
python學(xué)習(xí)之機(jī)器學(xué)習(xí)2
python學(xué)習(xí)之機(jī)器學(xué)習(xí)2
python學(xué)習(xí)之機(jī)器學(xué)習(xí)2
四、三種梯度下降
1、批梯度下降

批梯度下降Bath Gradient Descent:
指每下降一步,使用所有的訓(xùn)練集來(lái)計(jì)算梯度值

import numpy as np

X = 2 * np.random.rand(100, 1)
y = 4 + 3 * X + np.random.randn(100, 1)
X_b = np.c_[np.ones((100, 1)), X]
#print(X_b)

#學(xué)習(xí)率α
learning_rate = 0.1
#通常在做機(jī)器學(xué)習(xí)的時(shí)候,一般不會(huì)等到它收斂,太浪費(fèi)時(shí)間,所以會(huì)設(shè)置一個(gè)收斂次數(shù)n_iterations
n_iterations = 1000
#樣本數(shù)
m = 100

#1.初始化 θ0 , θ1
theta = np.random.randn(2, 1)
count = 0

#4. 不會(huì)設(shè)置閾值,之間設(shè)置超參數(shù),迭代次數(shù),迭代次數(shù)到了,我們就認(rèn)為收斂了
for iteration in range(n_iterations):
    count += 1
    #2. 接著求梯度gradient
    gradients = 1.0/m * X_b.T.dot(X_b.dot(theta)-y)
    #3. 應(yīng)用公式不斷更新theta值
    theta = theta - learning_rate * gradients
print(count)
print(theta)

運(yùn)行結(jié)果:
python學(xué)習(xí)之機(jī)器學(xué)習(xí)2
這里其實(shí)我還是想拿矩陣來(lái)解釋一下
函數(shù) hθ(x) = -4000 + 12000x
當(dāng)x = 120 , 150 時(shí),方程可由矩陣表示為
python學(xué)習(xí)之機(jī)器學(xué)習(xí)2
代碼中:
np.c_[ ] 表示把2個(gè)維度相同的矩陣拼在一起
np.ones((100,1)) 表示100行1列元素全是1的矩陣
np.dot(a,b) 表示矩陣a和b點(diǎn)乘,或者寫(xiě)為 a.dot(b)
.T 表示求矩陣的轉(zhuǎn)置

計(jì)算梯度的這段代碼: gradients = 1.0/m * X_b.T.dot(X_b.dot(theta)-y)

為了方便起見(jiàn),就以2個(gè)樣本數(shù)量x1,x2 來(lái)解釋吧
python學(xué)習(xí)之機(jī)器學(xué)習(xí)2

python學(xué)習(xí)之機(jī)器學(xué)習(xí)2

再除以m : 1.0/m X_b.T.dot(X_b.dot(theta)-y) ,就相當(dāng)于紅框中的這一部分
python學(xué)習(xí)之機(jī)器學(xué)習(xí)2
因此:不斷更新的theta值就為:
theta = theta - learning_rate
gradients
2、隨機(jī)梯度下降

隨機(jī)梯度下降Stochastic Gradient Descent
指的是每下降一步,使用一條訓(xùn)練集來(lái)計(jì)算梯度值
把m個(gè)樣本分成m份,每次用1份做梯度下降;也就是說(shuō),當(dāng)有m個(gè)樣本時(shí),批梯度下降只能做一次梯度下降,但是隨機(jī)梯度下降可以做m次

有一個(gè)概念:epoch 輪次
1 epoch = 1次遍歷所有的數(shù)據(jù)
對(duì)于批梯度下降來(lái)說(shuō),1次梯度下降就是1epoch
對(duì)于隨機(jī)梯度下降來(lái)說(shuō),需要做m次才是1epoch

import numpy as np
import random

x = 2 * np.random.rand(100, 1)
y = 4 + 3 * x + np.random.randn(100 ,1)
X = np.c_[np.ones((100, 1)), x]

n_epochs = 500         # 輪次
learning_rate = 0.1    # 學(xué)習(xí)率
m = 100                # 樣本數(shù)
num = [i for i in range(m)]    # 列表num:0 ~ 99
theta = np.random.rand(2, 1)     # 初始化theta值

#做500epoch,一次處理1條,一個(gè)epoch循環(huán)100次
for epoch in range(n_epochs):
    rand = random.sample(num, m)   # 在列表num中隨機(jī)選取100個(gè)數(shù)字,其實(shí)是將順序打亂
    #print(rand)
    for i in range(m):
        random_index = rand[i]   # rand是一個(gè)列表,拿到列表中的每一個(gè)元素作為索引
        xi = X[random_index: random_index+1]    # 隨機(jī)選取一個(gè)樣本
        yi = y[random_index: random_index+1]
        gradients = xi.T.dot(xi.dot(theta) - yi)  #只選取了1個(gè)樣本,所以乘以的是 1/1
        theta = theta - learning_rate * gradients

print(theta)

運(yùn)行結(jié)果:
python學(xué)習(xí)之機(jī)器學(xué)習(xí)2
3、Mini-Batch梯度下降

Mini-Batch Gradient Descent
指的是每下降一步,使用一部分的訓(xùn)練集來(lái)計(jì)算梯度值

如果mini-batch 大小 = m:它就是批梯度下降
如果mini-batch 大小 = 1 :它就是隨機(jī)梯度下降
如果 1 < mini-batch大小 < m :它就是Mini-Batch梯度下降

import numpy as np
import random

x = 2 * np.random.rand(100, 1)
y = 4 + 3 * x + np.random.randn(100 ,1)
X = np.c_[np.ones((100, 1)), x]

n_epochs = 500         # 輪次
learning_rate = 0.1    # 學(xué)習(xí)率
m = 100                # 樣本數(shù)
theta = np.random.rand(2, 1)  # 初始化theta值

batch_num = 5             # 循環(huán)5次
batch_size = m // 5       # 一次處理20條

#做500epoch, 一次處理20條,一個(gè)epoch循環(huán)5次
for epoch in range(n_epochs):
    for i in range(batch_num):  # 循環(huán)5次
        start = i * batch_size
        end = (i + 1) * batch_size
        xi = X[start: end]
        yi = y[start: end]
        gradients = 1 / batch_size * xi.T.dot(xi.dot(theta) - yi) #選取了batch_size個(gè)樣本,所以乘以 1/batch_size
        theta = theta - learning_rate * gradients

print(theta)

運(yùn)行結(jié)果:
python學(xué)習(xí)之機(jī)器學(xué)習(xí)2
4、三種梯度下降比較
梯度下降類別 速度 準(zhǔn)確度
批梯度下降 最慢 最準(zhǔn)確
Mini-Batch梯度下降 中等 中等
隨機(jī)梯度下降 最快 不準(zhǔn)確

如何選擇:
隨機(jī)梯度下降會(huì)喪失向量帶來(lái)的加速,所以我們不太會(huì)用隨機(jī)梯度下降
當(dāng)訓(xùn)練集比較小時(shí),使用批梯度下降(小于2000個(gè))
當(dāng)訓(xùn)練集比較大時(shí),使用Mini-Batch梯度下降
一般的Mini-Batch size為:64,128,256,512,1024
Mini-Batch size要適用CPU/GPU的內(nèi)存
5、學(xué)習(xí)率衰減

我們?cè)谝陨洗a中還提到了一個(gè)概念 α 學(xué)習(xí)率
一般我們選擇α?xí)r,可以嘗試 :1,0.1,0.2,0.3…
在做Mini-Batch的時(shí)候,因?yàn)樵肼暤脑?,可能?xùn)練,結(jié)果不是收斂的,而是在最低點(diǎn)附近擺動(dòng),因?yàn)棣潦枪潭ú蛔兊?,如果我們要解決這個(gè)問(wèn)題,就需要減少學(xué)習(xí)率,讓步伐不斷減小,讓他在盡量小的范圍內(nèi)晃動(dòng)
因此我們?cè)谠O(shè)置了α初始值后,還可以設(shè)置它的衰減率,通過(guò)不斷更新學(xué)習(xí)率,從而達(dá)到要求

實(shí)現(xiàn)方法:
python學(xué)習(xí)之機(jī)器學(xué)習(xí)2
學(xué)習(xí)率初始值: a0
衰減率:decay_rate
代數(shù):epoch_num,第幾次循環(huán)

import numpy as np
import random

x = 2 * np.random.rand(100, 1)
y = 4 + 3 * x + np.random.randn(100 ,1)
X = np.c_[np.ones((100, 1)), x]

a0 = 0.1               # 學(xué)習(xí)率初始值
decay_rate = 1         # 衰減率
#更新學(xué)習(xí)率
def learning_schedule(epoch_num):
    return (1.0 / (1 + decay_rate * epoch_num )) * a0

n_epochs = 500         # 輪次
m = 100                # 樣本數(shù)
theta = np.random.rand(2, 1)  # 初始化theta值

batch_num = 5             # 循環(huán)5次
batch_size = m // 5       # 一次處理20條

#做500epoch, 一次處理20條,一個(gè)epoch循環(huán)5次
for epoch in range(n_epochs):
    for i in range(batch_num):  # 循環(huán)5次
        start = i * batch_size
        end = (i + 1) * batch_size
        xi = X[start: end]
        yi = y[start: end]
        gradients = (1 / batch_size) * xi.T.dot(xi.dot(theta) - yi)
        learning_rate = learning_schedule(i) # 更新的學(xué)習(xí)率
        theta = theta - learning_rate * gradients

print(theta)

實(shí)現(xiàn)學(xué)習(xí)率衰減還有其他幾種方法:
python學(xué)習(xí)之機(jī)器學(xué)習(xí)2
python學(xué)習(xí)之機(jī)器學(xué)習(xí)2
python學(xué)習(xí)之機(jī)器學(xué)習(xí)2
五、多變量線性回歸
1、多變量線性回歸模型
python學(xué)習(xí)之機(jī)器學(xué)習(xí)2
python學(xué)習(xí)之機(jī)器學(xué)習(xí)2

#encoding:utf-8
"""
多項(xiàng)式回歸
"""

import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression

m = 100
X = 6 * np.random.rand(m, 1) - 3
y = 0.5 * X ** 2 + X + 2 + np.random.randn(m, 1)

plt.plot(X, y, 'b.')
# plt.show()

d = {1: 'g-', 2: 'r+', 10: 'y*'}
for i in d:
    #include_bias 可以理解為w0 =False 意思就是不要w0
    poly_features = PolynomialFeatures(degree=i, include_bias=False)
    """
    fit 和 fit_transform的區(qū)別
    fit: 簡(jiǎn)單來(lái)說(shuō),就是求得訓(xùn)練集X的均值,方差,最大值,最小值這些訓(xùn)練集X固有的屬性
    fit_transform: 首先f(wàn)it,然后在此基礎(chǔ)上,進(jìn)行標(biāo)準(zhǔn)化,降維,歸一化等操作
    """
    X_poly = poly_features.fit_transform(X)
    #print(X[0])
    #print(X_poly[0])
    #print(X_poly[:, 0])

    lin_reg = LinearRegression()
    lin_reg.fit(X_poly, y)
    print(lin_reg.intercept_, lin_reg.coef_)

    y_predict = lin_reg.predict(X_poly)
    plt.plot(X_poly[:, 0], y_predict, d[i])

plt.show()

2、多元梯度下降

python學(xué)習(xí)之機(jī)器學(xué)習(xí)2

import numpy as np
import random

from sklearn.linear_model import LinearRegression
x1=np.array([1,1,1])
x2=np.array([1,1,2])
x3=np.array([2,2,2])
x4=np.array([1,2,3])
x5=np.array([2,3,4])
x=np.c_[x1,x2,x3,x4,x5]
y=np.array([3,4,6,6,9])

lin_reg=LinearRegression()
lin_reg.fit(x.T,y)

print(lin_reg.intercept_,lin_reg.coef_)

x_new=np.array([[12,15,17]])
print(lin_reg.predict(x_new))
向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI