免費(fèi)Python機(jī)器學(xué)習(xí)課程一:線性回歸算法
最基本的機(jī)器學(xué)習(xí)算法必須是具有單個(gè)變量的線性回歸算法。如今,可用的高級(jí)機(jī)器學(xué)習(xí)算法,庫(kù)和技術(shù)如此之多,以至于線性回歸似乎并不重要。但是,學(xué)習(xí)基礎(chǔ)知識(shí)總是一個(gè)好主意。這樣,您將非常清楚地理解這些概念。在本文中,我將逐步解釋線性回歸算法。
想法和公式
線性回歸使用非常基本的預(yù)測(cè)思想。公式如下:
Y = C + BX
我們?cè)趯W(xué)校都學(xué)過這個(gè)公式。提醒您,這是一條直線方程。在此,Y是因變量,B是斜率,C是截距。通常,對(duì)于線性回歸,它寫為:

在這里," h"是假設(shè)或預(yù)測(cè)的因變量,X是輸入特征,theta0和theta1是系數(shù)。Theta值從頭開始隨機(jī)初始化。然后使用梯度下降,我們將更新theta值以最小化成本函數(shù)。這是成本函數(shù)和梯度下降的解釋。
成本函數(shù)和梯度下降
成本函數(shù)確定預(yù)測(cè)與原始因變量的距離。這是公式

任何機(jī)器學(xué)習(xí)算法的想法都是最小化成本函數(shù),以使假設(shè)接近于原始因變量。為此,我們需要優(yōu)化theta值。如果我們分別基于theta0和theta1取成本函數(shù)的偏導(dǎo)數(shù),則會(huì)得到梯度下降。要更新theta值,我們需要從相應(yīng)的theta值中減去梯度下降:

經(jīng)過偏導(dǎo)數(shù)后,以上公式將變?yōu)椋?/p>

此處,m是訓(xùn)練數(shù)據(jù)的數(shù)量,而alpha是學(xué)習(xí)率。我正在談?wù)撘环N變量線性回歸。這就是為什么我只有兩個(gè)theta值的原因。如果有很多變量,則每個(gè)變量都有theta值。
工作實(shí)例
我將要使用的數(shù)據(jù)集來自安德魯·伍(Andrew Ng)的Coursera機(jī)器學(xué)習(xí)課程。這是在Python中逐步實(shí)現(xiàn)線性回歸的過程。
(1) 導(dǎo)入包和數(shù)據(jù)集。
- import numpy as np
 - import pandas as pd
 - df = pd.read_csv('ex1data1.txt', header = None)
 - df.head()
 

在此數(shù)據(jù)集中,列零是輸入要素,列1是輸出變量或因變量。我們將使用列0使用上面的直線公式預(yù)測(cè)列1。
(2) 將第1列與第0列相對(duì)應(yīng)。

輸入變量和輸出變量之間的關(guān)系是線性的。當(dāng)關(guān)系為線性時(shí),線性回歸效果最佳。
(3) 初始化theta值。我正在將theta值初始化為零。但是任何其他值也應(yīng)該起作用。
- theta = [0,0]
 
(4) 根據(jù)前面討論的公式定義假設(shè)和成本函數(shù)。
- def hypothesis(theta, X):
 - return theta[0] + theta[1]*X
 - def cost_calc(theta, X, y):
 - return (1/2*m) * np.sum((hypothesis(theta, X) - y)**2)
 
(5) 計(jì)算訓(xùn)練數(shù)據(jù)的數(shù)量作為DataFrame的長(zhǎng)度。然后定義梯度下降函數(shù)。在此函數(shù)中,我們將更新theta值,直到cost函數(shù)達(dá)到最小值為止??赡苄枰魏螖?shù)量的迭代。在每次迭代中,它將更新theta值,并使用每個(gè)更新的theta值來計(jì)算成本以跟蹤成本。
- m = len(df)
 - def gradient_descent(theta, X, y, epoch, alpha):
 - cost = []
 - i = 0
 - while i < epoch:
 - hx = hypothesis(theta, X)
 - theta[0] -= alpha*(sum(hx-y)/m)
 - theta[1] -= (alpha * np.sum((hx - y) * X))/m
 - cost.append(cost_calc(theta, X, y))
 - i += 1
 - return theta, cost
 
(6) 最后,定義預(yù)測(cè)函數(shù)。它將從梯度下降函數(shù)獲得更新的theta并預(yù)測(cè)假設(shè)或預(yù)測(cè)的輸出變量。
- def predict(theta, X, y, epoch, alpha):
 - theta, cost = gradient_descent(theta, X, y, epoch, alpha)
 - return hypothesis(theta, X), cost, theta
 
(7) 使用預(yù)測(cè)函數(shù),找到假設(shè),成本和更新的theta值。我選擇學(xué)習(xí)率為0.01,然后將這個(gè)算法運(yùn)行2000個(gè)時(shí)期或迭代。
- y_predict, cost, theta = predict(theta, df[0], df[1], 2000, 0.01)
 
最終theta值為-3.79和1.18。
(8) 在同一圖中繪制原始y和假設(shè)或預(yù)測(cè)y。
- %matplotlib inline
 - import matplotlib.pyplot as plt
 - plt.figure()
 - plt.scatter(df[0], df[1], label = 'Original y')
 - plt.scatter(df[0], y_predict, label = 'predicted y')
 - plt.legend(loc = "upper left")
 - plt.xlabel("input feature")
 - plt.ylabel("Original and Predicted Output")
 - plt.show()
 

假設(shè)圖是公式中所預(yù)期的一條直線,并且該直線正在最佳位置通過。
(9) 記住,我們?cè)诿看蔚卸几櫝杀竞瘮?shù)。讓我們繪制成本函數(shù)。
- plt.figure()
 - plt.scatter(range(0, len(cost)), cost)
 - plt.show()
 

如前所述,我們的目的是優(yōu)化theta值以最小化成本。從該圖可以看出,成本從一開始就急劇下降,然后穩(wěn)定下來。這意味著theta值已按照我們的預(yù)期正確優(yōu)化。
我希望這可以幫到你。這是本文中使用的數(shù)據(jù)集的鏈接:
https://github.com/rashida048/Machine-Learning-With-Python/blob/master/ex1data1.txt。















 
 
 







 
 
 
 