> Photo by Jeremy Bishop on Unsplash
學習線性迴歸的概念並從頭開始在python中開發完整的線性迴歸演算法
最基本的機器學習演算法必須是具有單個變數的線性迴歸演算法。如今,可用的高階機器學習演算法,庫和技術如此之多,以至於線性迴歸似乎並不重要。但是,學習基礎知識總是一個好主意。這樣,您將非常清楚地理解這些概念。在本文中,我將逐步解釋線性迴歸演算法。
想法和公式線性迴歸使用非常基本的預測思想。公式如下:
Y = C + BX
我們在學校都學過這個公式。提醒您,這是一條直線方程。在此,Y是因變數,B是斜率,C是截距。通常,對於線性迴歸,它寫為:
在這裡," h"是假設或預測的因變數,X是輸入特徵,theta0和theta1是係數。Theta值從頭開始隨機初始化。然後使用梯度下降,我們將更新theta值以最小化成本函式。這是成本函式和梯度下降的解釋。
成本函式和梯度下降成本函式確定預測與原始因變數的距離。這是公式
任何機器學習演算法的想法都是最小化成本函式,以使假設接近於原始因變數。為此,我們需要最佳化theta值。如果我們分別基於theta0和theta1取成本函式的偏導數,則會得到梯度下降。要更新theta值,我們需要從相應的theta值中減去梯度下降:
經過偏導數後,以上公式將變為:
此處,m是訓練資料的數量,而alpha是學習率。我正在談論一種變數線性迴歸。這就是為什麼我只有兩個theta值的原因。如果有很多變數,則每個變數都有theta值。
工作例項我將要使用的資料集來自安德魯·伍(Andrew Ng)的Coursera機器學習課程。這是在Python中逐步實現線性迴歸的過程。
· 匯入包和資料集。
import numpy as npimport pandas as pddf = pd.read_csv('ex1data1.txt', header = None)df.head()
在此資料集中,列零是輸入要素,列1是輸出變數或因變數。我們將使用列0使用上面的直線公式預測列1。
2.將第1列與第0列相對應。
輸入變數和輸出變數之間的關係是線性的。當關係為線性時,線性迴歸效果最佳。
3.初始化theta值。我正在將theta值初始化為零。但是任何其他值也應該起作用。
def hypothesis(theta, X): return theta[0] + theta[1]*Xdef cost_calc(theta, X, y): return (1/2*m) * np.sum((hypothesis(theta, X) - y)**2)
5.計算訓練資料的數量作為DataFrame的長度。然後定義梯度下降函式。在此函式中,我們將更新theta值,直到cost函式達到最小值為止。可能需要任何數量的迭代。在每次迭代中,它將更新theta值,並使用每個更新的theta值來計算成本以跟蹤成本。
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.最後,定義預測函式。它將從梯度下降函式獲得更新的theta並預測假設或預測的輸出變數。
def predict(theta, X, y, epoch, alpha): theta, cost = gradient_descent(theta, X, y, epoch, alpha) return hypothesis(theta, X), cost, theta
7.使用預測函式,找到假設,成本和更新的theta值。我選擇學習率為0.01,然後將這個演算法執行2000個時期或迭代。
y_predict, cost, theta = predict(theta, df[0], df[1], 2000, 0.01)
最終theta值為-3.79和1.18。
8.在同一圖中繪製原始y和假設或預測y。
%matplotlib inlineimport matplotlib.pyplot as pltplt.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()
假設圖是公式中所預期的一條直線,並且該直線正在最佳位置透過。
9.記住,我們在每次迭代中都跟蹤成本函式。讓我們繪製成本函式。
plt.figure()plt.scatter(range(0, len(cost)), cost)plt.show()
如前所述,我們的目的是最佳化theta值以最小化成本。從該圖可以看出,成本從一開始就急劇下降,然後穩定下來。這意味著theta值已按照我們的預期正確最佳化。
我希望這可以幫到你。這是本文中使用的資料集的連結:https://github.com/rashida048/Machine-Learning-With-Python/blob/master/ex1data1.txt