python學習之機器學習2-創(chuàng)新互聯(lián)

1、梯度下降思想

創(chuàng)新互聯(lián)是一家專注于成都網(wǎng)站建設、網(wǎng)站制作與策劃設計,曲麻萊網(wǎng)站建設哪家好?創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設十多年,網(wǎng)設計領域的專業(yè)建站公司;建站業(yè)務涵蓋:曲麻萊等地區(qū)。曲麻萊做網(wǎng)站價格咨詢:18982081108

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

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

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

批梯度下降Bath Gradient Descent:
指每下降一步,使用所有的訓練集來計算梯度值

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)

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

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

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

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

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

為了方便起見,就以2個樣本數(shù)量x1,x2 來解釋吧
python學習之機器學習2

python學習之機器學習2

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

隨機梯度下降Stochastic Gradient Descent
指的是每下降一步,使用一條訓練集來計算梯度值
把m個樣本分成m份,每次用1份做梯度下降;也就是說,當有m個樣本時,批梯度下降只能做一次梯度下降,但是隨機梯度下降可以做m次

有一個概念:epoch 輪次
1 epoch = 1次遍歷所有的數(shù)據(jù)
對于批梯度下降來說,1次梯度下降就是1epoch
對于隨機梯度下降來說,需要做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    # 學習率
m = 100                # 樣本數(shù)
num = [i for i in range(m)]    # 列表num:0 ~ 99
theta = np.random.rand(2, 1)     # 初始化theta值

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

print(theta)

運行結(jié)果:
python學習之機器學習2
3、Mini-Batch梯度下降

Mini-Batch Gradient Descent
指的是每下降一步,使用一部分的訓練集來計算梯度值

如果mini-batch 大小 = m:它就是批梯度下降
如果mini-batch 大小 = 1 :它就是隨機梯度下降
如果 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    # 學習率
m = 100                # 樣本數(shù)
theta = np.random.rand(2, 1)  # 初始化theta值

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

#做500epoch, 一次處理20條,一個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個樣本,所以乘以 1/batch_size
        theta = theta - learning_rate * gradients

print(theta)

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

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

我們在以上代碼中還提到了一個概念 α 學習率
一般我們選擇α時,可以嘗試 :1,0.1,0.2,0.3…
在做Mini-Batch的時候,因為噪聲的原因,可能訓練,結(jié)果不是收斂的,而是在最低點附近擺動,因為α是固定不變的,如果我們要解決這個問題,就需要減少學習率,讓步伐不斷減小,讓他在盡量小的范圍內(nèi)晃動
因此我們在設置了α初始值后,還可以設置它的衰減率,通過不斷更新學習率,從而達到要求

實現(xiàn)方法:
python學習之機器學習2
學習率初始值: 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               # 學習率初始值
decay_rate = 1         # 衰減率
#更新學習率
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條,一個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) # 更新的學習率
        theta = theta - learning_rate * gradients

print(theta)

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

#encoding:utf-8
"""
多項式回歸
"""

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: 簡單來說,就是求得訓練集X的均值,方差,大值,最小值這些訓練集X固有的屬性
    fit_transform: 首先fit,然后在此基礎上,進行標準化,降維,歸一化等操作
    """
    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學習之機器學習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))

另外有需要云服務器可以了解下創(chuàng)新互聯(lián)建站muchs.cn,海內(nèi)外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。

網(wǎng)站名稱:python學習之機器學習2-創(chuàng)新互聯(lián)
網(wǎng)站網(wǎng)址:http://muchs.cn/article14/dhgcde.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供用戶體驗手機網(wǎng)站建設、定制開發(fā)網(wǎng)站改版、網(wǎng)站內(nèi)鏈App設計

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

h5響應式網(wǎng)站建設