通過(guò)這個(gè)筆記記錄以下學(xué)習(xí)的過(guò)程。
在使用python實(shí)現(xiàn)機(jī)器學(xué)習(xí)逊笆,可以使用anaconda (清華鏡像下載)去實(shí)現(xiàn)栈戳。
線性回歸是常見(jiàn)的擬合算法,本文通過(guò)梯度下降實(shí)現(xiàn)數(shù)據(jù)擬合难裆。
1.到入庫(kù)
import numpy as np #導(dǎo)入數(shù)據(jù)處理模塊numpy
import matplotlib.pyplot as plt #繪圖模塊
2. 產(chǎn)生隨機(jī)數(shù)據(jù)
x = np.arange(-2, 2, 0.1) # -2到2按照0.1為步距
length = len(x)
y = 2*x+4+(np.random.random(length)-0.5)*3 #y=2*x+4 加上隨機(jī)數(shù)
x = x.reshape(length, 1)
y = y.reshape(length, 1)
plt.figure()
plt.scatter(x, y)
plt.show()
效果圖:
image.png
3.梯度下降
(這一塊內(nèi)容推薦看吳恩達(dá)視頻分析子檀。)
在求取線性回歸的過(guò)程中,最主要步驟是使得預(yù)測(cè)值和樣本值之間的差異最小乃戈,如下公式表示樣本和預(yù)測(cè)值之間的差值平方褂痰。1/2參數(shù)是為了求導(dǎo)時(shí)與平方2約去。
image.png
對(duì)m b進(jìn)行求導(dǎo)
image.png
記err = h(x[i]) - y[i]症虑,則得到:
m,b的導(dǎo)數(shù)分別時(shí) err*x 和 err
得到導(dǎo)數(shù)之后缩歪,就需要使得m,b朝著使得ERROR值小的方向變化。下面結(jié)合代碼分析:
m = 1 #m, b初始化 一般用隨機(jī)值
b = 0
learning_rate = 0.005 #學(xué)習(xí)率
def gredient(x, y, m, b) :
for i in range(0, length) :
err = (m*x[i] + b) - y[i]
m -= err * x[i] * learning_rate
b -= err * learning_rate
return [m, b]
#訓(xùn)練次數(shù)
times = 100
for i in range(times) :
m, b = gredient(x, y, m, b)
print(m, b)
#繪制最終結(jié)果
x_b = [-2,2]
y_b = [-2*m + b,2*m +b]
plt.figure()
plt.plot(x_b, y_b)
plt.scatter(x, y)
plt.show()
對(duì)樣本進(jìn)行遍歷時(shí)谍憔,更新m,b的值匪蝙,這個(gè)變化的值由導(dǎo)數(shù)(理解為斜率)和learning_rate(理解為斜率方向移動(dòng)步長(zhǎng))組成。
實(shí)驗(yàn)結(jié)果:
image.png
image.png