原创:机器学习代码练习(一、回归)
吳恩達(dá)老師在coursea上的機(jī)器學(xué)習(xí)課程的作業(yè)是OCTAVE(matlab)做的,當(dāng)時(shí)python還不怎么流行,現(xiàn)在吳恩達(dá)老師也用python了,我把原課程作業(yè)用python重新寫了一遍,并放在我的github上。(黃海廣)
本文是第一部分,回歸作業(yè)的重構(gòu)。
機(jī)器學(xué)習(xí)練習(xí) 1 - 回歸
單變量線性回歸
代碼修改并注釋:黃海廣,haiguang2000@qq.com
import?numpy as?np import?pandas as?pd import?matplotlib.pyplot as?pltpath = 'data/ex1data1.txt'#這里讀取原始作業(yè)的數(shù)據(jù) data = pd.read_csv(path, header=None, names=['Population', 'Profit']) data.head()數(shù)據(jù)長(zhǎng)這樣:
看下數(shù)據(jù)長(zhǎng)什么樣子:
data.plot(kind='scatter', x='Population', y='Profit', figsize=(8,6)) plt.show()現(xiàn)在讓我們使用梯度下降來實(shí)現(xiàn)線性回歸,以最小化成本函數(shù)。
首先,我們將創(chuàng)建一個(gè)代價(jià)函數(shù):
其中:
def computeCost(X, y, theta):inner = np.power(((X * theta.T)?- y), 2)# (m,n)?@ (n, 1)?->?(n, 1) # return np.sum(inner) / (2 * len(X))return?np.sum(inner) / (2?* X.shape[0])讓我們?cè)谟?xùn)練集中添加一列,以便我們可以使用向量化的解決方案來計(jì)算代價(jià)和梯度。
data.insert(0, 'Ones', 1) data.head()# set X (training data) and y (target variable) cols?= data.shape[1] X?= data.iloc[:,:cols-1]#X是所有行,去掉最后一列 y?= data.iloc[:,cols-1:]#X是所有行,最后一列代價(jià)函數(shù)是應(yīng)該是numpy矩陣,所以我們需要轉(zhuǎn)換X和Y,然后才能使用它們。我們還需要初始化theta。
X?= np.matrix(X.values) y?= np.matrix(y.values) theta?= np.matrix(np.array([0,0]))看下維度:
X.shape, theta.shape, y.shape輸出:
計(jì)算代價(jià)函數(shù) (theta初始值為0).
computeCost(X, y, theta)32.072733877455676batch gradient decent(批量梯度下降)
def gradientDescent(X, y, theta, alpha, iters):temp = np.matrix(np.zeros(theta.shape))parameters = int(theta.ravel().shape[1])cost = np.zeros(iters)for?i in?range(iters):error = (X * theta.T) - yfor?j in?range(parameters):term = np.multiply(error, X[:,j])temp[0,j] = theta[0,j] - ((alpha / len(X)) * np.sum(term))theta = tempcost[i] = computeCost(X, y, theta)return?theta, cost初始化一些附加變量 - 學(xué)習(xí)速率alpha和要執(zhí)行的迭代次數(shù)。
alpha?= 0.01 iters?= 1000現(xiàn)在讓我們運(yùn)行梯度下降算法來將我們的參數(shù)theta合于訓(xùn)練集。
g, cost = gradientDescent(X, y, theta, alpha, iters) gmatrix([[-3.24140214, 1.1272942 ]])最后,我們可以使用我們擬合的參數(shù)計(jì)算訓(xùn)練模型的代價(jià)函數(shù)(誤差)。
computeCost(X, y, g)4.515955503078912現(xiàn)在我們來繪制線性模型以及數(shù)據(jù),直觀地看出它的擬合。
x?= np.linspace(data.Population.min(), data.Population.max(), 100) #np.linspace在指定的間隔內(nèi)返回均勻間隔的數(shù)字。 f?= g[0, 0] + (g[0, 1] * x) fig, ax = plt.subplots(figsize=(10,6)) ax.plot(x, f, 'r', label='Prediction') ax.scatter(data.Population, data.Profit, label='Traning Data') ax.legend(loc=2) ax.set_xlabel('Population') ax.set_ylabel('Profit') ax.set_title('Predicted Profit vs. Population Size') plt.show()由于梯度方程式函數(shù)也在每個(gè)訓(xùn)練迭代中輸出一個(gè)代價(jià)的向量,所以我們也可以繪制。請(qǐng)注意,代價(jià)總是降低 - 這是凸優(yōu)化問題的一個(gè)例子。
fig, ax = plt.subplots(figsize=(12,8)) ax.plot(np.arange(iters), cost, 'r') ax.set_xlabel('Iterations') ax.set_ylabel('Cost') ax.set_title('Error vs. Training Epoch') plt.show()多變量線性回歸
練習(xí)1還包括一個(gè)房屋價(jià)格數(shù)據(jù)集,其中有2個(gè)變量(房子的大小,臥室的數(shù)量)和目標(biāo)(房子的價(jià)格)。我們使用我們已經(jīng)應(yīng)用的技術(shù)來分析數(shù)據(jù)集。
path = 'data/ex1data2.txt' data2 = pd.read_csv(path, header=None, names=['Size', 'Bedrooms', 'Price']) data2.head()對(duì)于此任務(wù),我們添加了另一個(gè)預(yù)處理步驟 - 特征歸一化。這個(gè)對(duì)于pandas來說很簡(jiǎn)單
data2 = (data2 - data2.mean()) / data2.std() data2.head()現(xiàn)在我們重復(fù)第1部分的預(yù)處理步驟,并對(duì)新數(shù)據(jù)集運(yùn)行線性回歸程序。
#?添加一列 data2.insert(0, 'Ones', 1)#?設(shè)置X和y cols = data2.shape[1] X2 = data2.iloc[:,0:cols-1] y2 = data2.iloc[:,cols-1:cols]#?轉(zhuǎn)為矩陣并且初始化theta X2 = np.matrix(X2.values) y2 = np.matrix(y2.values) theta2 = np.matrix(np.array([0,0,0]))g2, cost2 = gradientDescent(X2, y2, theta2, alpha, iters) #?得到模型誤差 computeCost(X2, y2, g2)0.13070336960771892我們也可以快速查看這一個(gè)的訓(xùn)練進(jìn)程。
fig, ax = plt.subplots(figsize=(12,8)) ax.plot(np.arange(iters), cost2, 'r') ax.set_xlabel('Iterations') ax.set_ylabel('Cost') ax.set_title('Error vs. Training Epoch') plt.show()normal equation(正規(guī)方程)
正規(guī)方程是通過求解下面的方程來找出使得代價(jià)函數(shù)最小的參數(shù)的:?。 假設(shè)我們的訓(xùn)練集特征矩陣為 X(包含了)并且我們的訓(xùn)練集結(jié)果為向量 y,則利用正規(guī)方程解出向量??。 上標(biāo) T 代表矩陣轉(zhuǎn)置,上標(biāo)-1 代表矩陣的逆。設(shè)矩陣,則:
梯度下降與正規(guī)方程的比較:
梯度下降:需要選擇學(xué)習(xí)率 α,需要多次迭代,當(dāng)特征數(shù)量 n 大時(shí)也能較好適用,適用于各種類型的模型
正規(guī)方程:不需要選擇學(xué)習(xí)率 α,一次計(jì)算得出,需要計(jì)算,如果特征數(shù)量 n 較大則運(yùn)算代價(jià)大,因?yàn)榫仃嚹娴挠?jì)算時(shí)間復(fù)雜度為,通常來說當(dāng)小于 10000 時(shí)還是可以接受的,只適用于線性模型,不適合邏輯回歸模型等其他模型。
# 正規(guī)方程 def?normalEqn(X, y):theta = np.linalg.inv(X.T@X)@X.T@y#X.T@X等價(jià)于X.T.dot(X)return?thetafinal_theta2=normalEqn(X, y)#感覺和批量梯度下降的theta的值有點(diǎn)差距 final_theta2輸出:
matrix([[-3.89578088],[ 1.19303364]])備注:
代碼和數(shù)據(jù)都在:
https://github.com/fengdu78/Coursera-ML-AndrewNg-Notes/tree/master/code/ex1-linear%20regression
參考:
https://www.coursera.org/course/ml
關(guān)于本站
“機(jī)器學(xué)習(xí)初學(xué)者”公眾號(hào)由是黃海廣博士創(chuàng)建,黃博個(gè)人知乎粉絲23000+,github排名全球前110名(32000+)。本公眾號(hào)致力于人工智能方向的科普性文章,為初學(xué)者提供學(xué)習(xí)路線和基礎(chǔ)資料。原創(chuàng)作品有:吳恩達(dá)機(jī)器學(xué)習(xí)個(gè)人筆記、吳恩達(dá)深度學(xué)習(xí)筆記等。
往期精彩回顧
那些年做的學(xué)術(shù)公益-你不是一個(gè)人在戰(zhàn)斗
適合初學(xué)者入門人工智能的路線及資料下載
吳恩達(dá)機(jī)器學(xué)習(xí)課程筆記及資源(github標(biāo)星12000+,提供百度云鏡像)
吳恩達(dá)深度學(xué)習(xí)筆記及視頻等資源(github標(biāo)星8500+,提供百度云鏡像)
《統(tǒng)計(jì)學(xué)習(xí)方法》的python代碼實(shí)現(xiàn)(github標(biāo)星7200+)
精心整理和翻譯的機(jī)器學(xué)習(xí)的相關(guān)數(shù)學(xué)資料
首發(fā):深度學(xué)習(xí)入門寶典-《python深度學(xué)習(xí)》原文代碼中文注釋版及電子書
備注:加入本站微信群或者qq群,請(qǐng)回復(fù)“加群”
加入知識(shí)星球(4300+用戶,ID:92416895),請(qǐng)回復(fù)“知識(shí)星球”
總結(jié)
以上是生活随笔為你收集整理的原创:机器学习代码练习(一、回归)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BERT论文总结
- 下一篇: 快速掌握TensorFlow中张量运算的