首頁>技術>

> Photo by Michael Dziedzic on Unsplash

從頭開始學習為Python中任意數量的變數開發多元線性迴歸。

線性迴歸可能是最簡單的機器學習演算法。對於初學者來說非常好,因為它使用簡單的公式。因此,這對學習機器學習概念很有幫助。在本文中,我將嘗試逐步解釋多元線性迴歸。

概念和公式

線性迴歸使用我們在學校都學過的簡單公式:

Y = C + AX

提醒一下,Y是輸出或因變數,X是輸入或自變數,A是斜率,C是截距。

對於線性迴歸,對於相同的公式,我們遵循以下符號:

如果我們有多個自變數,則線性迴歸的公式將如下所示:

在這裡," h"稱為假設。這是預測的輸出變數。Theta0是偏差項,所有其他theta值是係數。它們首先是隨機啟動的,然後使用演算法進行最佳化,以便此公式可以緊密預測因變數。

成本函式和梯度下降

當theta值從一開始就被初始化時,該公式未經過訓練以預測因變數。該假設與原始輸出變數" Y"相去甚遠。這是估算所有訓練資料的累積距離的公式:

這稱為成本函式。如果您注意到了,它從假設(預測輸出)中減去y(原始輸出),取平方去掉負數,求和除以2乘以m。在此,m是訓練資料的數量。您可能會看到成本函式是原始輸出和預測輸出之間差異的指示。機器學習演算法的思想是最小化成本函式,以使原始輸出與預測輸出之間的差異更小。為此,我們需要最佳化theta值。

這是我們更新theta值的方法。我們將成本函式相對於每個theta值的偏微分,然後從現有theta值中減去該值,

在此,alpha是學習率,它是一個常數。我沒有為所有theta值顯示相同的公式。但這是所有theta值的相同公式。經過微分後,公式得出為:

這稱為梯度下降。

逐步實現演算法

我要使用的資料集來自吳安德(Andre Ng)的Coursera機器學習課程。我將在此頁面底部提供連結。請隨時下載資料集並透過本教程進行練習。我鼓勵您在閱讀資料集時進行練習(如果這對您來說是新的)。那是瞭解它的唯一方法。

在此資料集中,只有兩個變數。但是我開發了適用於任意數量變數的演算法。如果您對10個變數或20個變數使用相同的演算法,那麼它也應該工作。我將在Python中使用Numpy和Pandas庫。所有這些豐富的Python庫使機器學習演算法更加容易。匯入包和資料集:

import pandas as pdimport numpy as npdf = pd.read_csv('ex1data2.txt', header = None)df.head()

· 在偏項中新增一列。之所以選擇1,是因為如果您將一個值乘以任意值,則該值不會改變。

df = pd.concat([pd.Series(1, index=df.index, name='00'), df], axis=1)df.head()

2.定義輸入變數或自變數X以及輸出變數或因變數y。在此資料集中,列0和1是輸入變數,列2是輸出變數。

X = df.drop(columns=2)y = df.iloc[:, 3]

3.透過將每一列除以該列的最大值來標準化輸入變數。這樣,每列的值將在0到1之間。此步驟不是必需的。但這會使演算法更快地達到最佳狀態。同樣,如果您注意到資料集,則列0的元素與列1的元素相比太大。如果對資料集進行規範化,則可以防止第一列在演算法中占主導地位。

for i in range(1, len(X.columns)): 	X[i-1] = X[i-1]/np.max(X[i-1])X.head()

4.初始化theta值。我將它們初始化為零。但是任何其他數字都可以。

theta = np.array([0]*len(X.columns))#Output: array([0, 0, 0])

5.計算在上式中以m表示的訓練資料的數量:

m = len(df)

6.定義假設函式

def hypothesis(theta, X): 	return theta*X

7.使用上述成本函式的公式定義成本函式

def computeCost(X, y, theta): 	y1 = hypothesis(theta, X) 	y1=np.sum(y1, axis=1) 	return sum(np.sqrt((y1-y)**2))/(2*47)

8.編寫梯度下降函式。此函式將以X,y,theta,學習率(公式中的alpha)和曆元(或迭代)作為輸入。我們需要不斷更新theta值,直到成本函式達到最小值為止。

def gradientDescent(X, y, theta, alpha, i):    J = []  #cost function in each iterations    k = 0    while k < i:                y1 = hypothesis(theta, X)        y1 = np.sum(y1, axis=1)        for c in range(0, len(X.columns)):            theta[c] = theta[c] - alpha*(sum((y1-y)*X.iloc[:,c])/len(X))        j = computeCost(X, y, theta)        J.append(j)        k += 1    return J, j, theta

9.使用梯度下降函式獲得最終成本,每次迭代的成本列表以及最佳化的引數theta。我選擇alpha為0.05。但是您可以嘗試使用其他一些值(例如0.1、0.01、0.03、0.3)來檢視會發生什麼。我運行了10000次迭代。請嘗試進行更多或更少的迭代,以檢視差異。

J, j, theta = gradientDescent(X, y, theta, 0.05, 10000)

10.使用最佳化的theta預測輸出

y_hat = hypothesis(theta, X)y_hat = np.sum(y_hat, axis=1)

11.繪製原始y和預測輸出y_hat

%matplotlib inlineimport matplotlib.pyplot as pltplt.figure()plt.scatter(x=list(range(0, 47)),y= y, color='blue') plt.scatter(x=list(range(0, 47)), y=y_hat, color='black')plt.show()

一些輸出點幾乎與預測輸出重疊。有些接近但不重疊。

12.繪製每次迭代的成本以檢視行為

plt.figure()plt.scatter(x=list(range(0, 10000)), y=J)plt.show()

每次迭代的成本都在下降。這表明演算法執行良好。

35
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 人臉識別:insightface自定義資料集製作