【機器學習基礎】線性回歸和梯度下降的初學者教程

2021-02-21 機器學習初學者

編譯 | VK 

來源 | Towards Data Science

假設我們有一個虛擬的數據集,一對變量,一個母親和她女兒的身高:

考慮到另一位母親的身高為63,我們如何預測她女兒的身高?

方法是用線性回歸。

首先,找到最合適的直線。然後用這條直線做預測。

線性回歸是尋找數據集的最佳擬合線。這條線可以用來做預測。

「你如何找到最合適的?」

這就是使用梯度下降的原因。

梯度下降是一種找到最佳擬合線的工具

在深入研究梯度下降之前,讓我們先看看另一種計算最佳擬合線的方法。

「最佳擬合線的統計計算方法:」

直線可以用公式表示:y=mx+b。

回歸線斜率m的公式為:

m = r * (SD of y / SD of x)

轉換:x和y值之間的相關係數(r),乘以y值的標準差(SD of y)除以x值的標準偏差(SD of x)。

以上數據中母親身高的標準差約為4.07。女兒身高的標準偏差約為5.5。這兩組變量之間的相關係數約為0.89。

因此,最佳擬合線或回歸線為:

y = 0.89*(5.5 / 4.07)x + b
y = 1.2x + b

我們知道回歸線穿過了平均點,所以線上的一個點是(x值的平均值,y值的平均值),其中有(63.5,63.33)

63.33 = 1.2*63.5 + b
b = -12.87

因此,使用相關係數和標準差計算的回歸線近似為:

y = 1.2x - 12.87

使用統計學的回歸線為y=1.2x-12.87

現在,讓我們來研究梯度下降。

「計算最佳擬合線的梯度下降法:」

在梯度下降中,你從一條隨機線開始。然後一點一點地改變直線的參數(即斜率和y軸截距),以得到最佳擬合的直線。

你怎麼知道你什麼時候到達最合適的位置?

對於你嘗試的每一條直線——直線A、直線B、直線C等等——你都要計算誤差的平方和。如果直線B的值比直線A的誤差小,那麼直線B更適合,等等。

誤差是你的實際值減去你的預測值。最佳擬合線使所有誤差平方和最小化。在線性回歸中,我們用相關係數計算出的最佳擬合線也恰好是最小平方誤差線。這就是回歸線被稱為最小二乘回歸線的原因。

最佳擬合線是最小二乘回歸線

在下面的圖像中,直線C比直線B更適合,直線B比直線A更適合。

這就是梯度下降的工作原理:

你從一條隨機線開始,比如說直線a,你計算這條線的誤差平方和。然後,調整斜率和y軸截距。重新計算新行的誤差平方和。繼續調整,直到達到局部最小值,其中平方誤差之和最小。

梯度下降法是一種通過多次迭代最小化誤差平方和來逼近最小平方回歸線的算法。

❞梯度下降算法

在機器學習術語中,誤差平方和稱為「成本」。這個成本公式是:

其中

因此,這個方程大致是「誤差平方和」,因為它計算的是預測值減去實際值平方的總和。

1/2m是「平均」數據點數量的平方誤差,這樣數據點的數量就不會影響函數。為什麼除以2請看這個解釋(https://datascience.stackexchange.com/questions/52157/why-do-we-have-to-divide-by-2-in-the-ml-squared-error-cost-function)。

在梯度下降中,目標是使代價函數最小化。我們通過嘗試不同的斜率和截距值來實現這一點。但是應該嘗試哪些值以及如何改變這些值?

我們根據梯度下降公式改變它們的值,這個公式來自於對代價函數的偏導數。確切的數學公式可以在這個連結中找到:https://www.ritchieng.com/one-variable-linear-regression/

通過偏導數,得到:

這個公式計算每次迭代時θ的變化量。

α(α)被稱為學習率。學習率決定了每次迭代的步驟有多大。有一個好的學習率是非常重要的,因為如果它太大,你的算法不會達到最小值,如果它太小,你的算法會花很長時間才能達到。對於我的例子,我選擇alpha為0.001

總而言之,步驟如下:

這是我使用梯度下降實現簡單線性回歸的方法。

斜率和截距都是0,0。

註:在機器學習中,我們使用θ來表示向量[y-截距,斜率]。θ=y軸截距。θ1=斜率。這就是為什麼在下面的實現中將theta看作變量名。

# x = [58, 62, 60, 64, 67, 70] # 媽媽的身高
# y = [60, 60, 58, 60, 70, 72] # 女兒的身高


class LinearRegression:
    def __init__(self, x_set, y_set):
        self.x_set = x_set
        self.y_set = y_set
        self.alpha = 0.0001  # alpha 是學習率

    def get_theta(self, theta):
        intercept, slope = theta
        intercept_gradient = 0
        slope_gradient = 0
        m = len(self.y_set)
        for i in range(0, len(self.y_set)):
            x_val = self.x_set[i]
            y_val = self.y_set[i]
            y_predicted = self.get_prediction(slope, intercept, x_val)
            intercept_gradient += (y_predicted - y_val)
            slope_gradient += (y_predicted - y_val) * x_val

        new_intercept = intercept - self.alpha * intercept_gradient
        new_slope = slope - self.alpha * (1/m) * slope_gradient
        return [new_intercept, new_slope]

    def get_prediction(self, slope, intercept, x_val):
        return slope * x_val + intercept

    def calc_cost(self, theta):
        intercept, slope = theta
        sum = 0
        for i in range(0, len(self.y_set)):
            x_val = self.x_set[i]
            y_val = self.y_set[i]
            y_predicted = self.get_prediction(slope, intercept, x_val)
            diff_sq = (y_predicted - y_val) ** 2
            sum += diff_sq

        cost = sum / (2*len(self.y_set))
        return cost

    def iterate(self):
        num_iteration = 0
        current_cost = None
        current_theta = [0, 0]  # 初始化為0

        while num_iteration < 500:
            if num_iteration % 10 == 0:
                print('current iteration: ', num_iteration)
                print('current cost: ', current_cost)
                print('current theta: ', current_theta)
            new_cost = self.calc_cost(current_theta)
            current_cost = new_cost
            new_theta = self.get_theta(current_theta)
            current_theta = new_theta
            num_iteration += 1

        print(f'After {num_iteration}, total cost is {current_cost}. Theta is {current_theta}')

使用這個算法和上面的母女身高數據集,經過500次迭代,我得到了3.4的成本。

500次迭代後的方程為y=0.998x+0.078。實際回歸線為y=1.2x-12.87,成本約為3.1。

用[0,0]作為[y-截距,斜率]的初始值,得到y=1.2x-12.87是不切實際的。為了在沒有大量迭代的情況下接近這個目標,你必須從一個更好的初始值開始。

例如,[-10,1]在不到10次迭代後,大約得到y=1.153x-10,成本為3.1。

在機器學習領域,調整學習率和初始估計等參數是比較常見的做法。

這就是線性回歸中梯度下降的要點。

梯度下降法是一種通過多次迭代最小化誤差平方和來逼近最小平方回歸線的算法。

到目前為止,我已經討論過簡單線性回歸,其中只有1個自變量(即一組x值)。理論上,梯度下降可以處理n個變量。

我已經重構了我以前的算法來處理下面的n個維度。

import numpy as np

class LinearRegression:
    def __init__(self, dataset):
        self.dataset = dataset
        self.alpha = 0.0001  # alpha 是學習率

    def get_theta(self, theta):
        num_params = len(self.dataset[0])
        new_gradients = [0] * num_params
        m = len(self.dataset)
        for i in range(0, len(self.dataset)):
            predicted = self.get_prediction(theta, self.dataset[i])
            actual = self.dataset[i][-1]
            for j in range(0, num_params):
                x_j = 1 if j == 0 else self.dataset[i][j - 1]
                new_gradients[j] += (predicted - actual) * x_j

        new_theta = [0] * num_params
        for j in range(0, num_params):
            new_theta[j] = theta[j] - self.alpha * (1/m) * new_gradients[j]

        return new_theta

    def get_prediction(self, theta, data_point):
        # 使用點乘
        # y = mx + b 可以重寫為 [b m] dot [1 x]
        # [b m] 是參數
        # 代入x的值
        values = [0]*len(data_point)
        for i in range(0, len(values)):
            values[i] = 1 if i == 0 else data_point[i-1]

        prediction = np.dot(theta, values)
        return prediction

    def calc_cost(self, theta):
        sum = 0
        for i in range(0, len(self.dataset)):
            predicted = self.get_prediction(theta, self.dataset[i])
            actual = self.dataset[i][-1]
            diff_sq = (predicted - actual) ** 2
            sum += diff_sq

        cost = sum / (2*len(self.dataset))
        return cost

    def iterate(self):
        num_iteration = 0
        current_cost = None
        current_theta = [0] * len(self.dataset[0])  # initialize to 0

        while num_iteration < 500:
            if num_iteration % 10 == 0:
                print('current iteration: ', num_iteration)
                print('current cost: ', current_cost)
                print('current theta: ', current_theta)
            new_cost = self.calc_cost(current_theta)
            current_cost = new_cost
            new_theta = self.get_theta(current_theta)
            current_theta = new_theta
            num_iteration += 1

        print(f'After {num_iteration}, total cost is {current_cost}. Theta is {current_theta}')

一切都是一樣的,唯一的例外是不用mx+b(即斜率乘以變量x加y截距)來獲得預測值,而是進行矩陣乘法。參見上述的def get_prediction。

使用點積,你的算法可以接受n個變量來計算預測。

相關焦點

  • 機器學習基礎:線性回歸和梯度下降的初學者教程
    重新計算新行的誤差平方和。繼續調整,直到達到局部最小值,其中平方誤差之和最小。❝梯度下降法是一種通過多次迭代最小化誤差平方和來逼近最小平方回歸線的算法。❞梯度下降算法在機器學習術語中,誤差平方和稱為「成本」。這個成本公式是:
  • 線性回歸和梯度下降的初學者教程
    假設有一個虛擬的數據集包含多對變量,即每位母親和她女兒的身高:通過這個數據集,我們如何預測另一位身高為63的母親的女兒的身高?方法是用線性回歸。首先找到最佳擬合線,然後用這條直線做預測。線性回歸是尋找數據集的最佳擬合線,這條線可以用來做預測。如何找到最佳擬合線?
  • 教程 從頭開始:如何用 Python 實現帶隨機梯度下降的線性回歸
    機器學習最常見的優化算法是隨機梯度下降(SGD:stochastic gradient descent)。本教程將指導大家用 Python 實現隨機梯度下降對線性回歸算法的優化。通過本教程的學習,你將了解到:如何用隨機梯度下降估計線性回歸係數如何對多元線性回歸做預測如何用帶隨機梯度下降的線性回歸算法對新數據做預測說明本文將對線性回歸、隨即梯度下降方法以及本教程所使用的葡萄酒品質數據集做一個集中闡釋。
  • 教程 從頭開始:用Python實現帶隨機梯度下降的線性回歸
    機器學習最常見的優化算法是隨機梯度下降(SGD:stochastic gradient descent)。本教程將指導大家用 Python 實現隨機梯度下降對線性回歸算法的優化。通過本教程的學習,你將了解到:如何用隨機梯度下降估計線性回歸係數如何對多元線性回歸做預測如何用帶隨機梯度下降的線性回歸算法對新數據做預測說明本文將對線性回歸、隨即梯度下降方法以及本教程所使用的葡萄酒品質數據集做一個集中闡釋。
  • 【機器學習基礎】(二):理解線性回歸與梯度下降並做簡單預測
    梯度下降我們把木棒(實線、模型)的表示數學化,我們既然可以用3、4做為x的係數,那我們當然可以嘗試別的數字。(偏差),然後再帶入損失函數以求得最小值的過程,就是梯度下降。梯度可以完全理解為導數,梯度下降的過程就是我們不斷求導的過程。學習率(步長)不斷調整權重和偏差來來尋找損失函數最小值的過程就是我們使用梯度下降方法擬合數據尋找最佳模型的過程。
  • 機器學習——梯度下降、梯度下降的線性回歸算法
    一、梯度下降梯度下降是一個用來求函數最小值的算法,我們將使用梯度下降算法來求出代價函數J(θo,θ1)的最小值。梯度下降算法中要做的就是不停地一點點改變θo和θ1,直到J成為最小值或局部最小值。通常將θo和θ1的初始值設為0。
  • 線性回歸與梯度下降
    Cost Function代價函數是線性回歸中的一個應用,在線性回歸中,要解決的一個問題就是最小化問題。假設在一元線性回歸中,在一個訓練集中,我們需要找到一條直線能和該訓練集中的點最接近。這也是梯度下降的一個特點。它會找到所有的局部最優解出來。梯度下降算法,不斷更新:直到收斂。
  • 文科生都能看懂的機器學習教程:梯度下降、線性回歸、邏輯回歸
    那些神秘拗口的概念,比如邏輯回歸、梯度下降到底是什麼?j  一個23歲的藥物學專業的學生說,當他去參加機器學習培訓課程的時候,感覺自己就家裡那位不懂現代科技的奶奶。  於是一名叫Audrey Lorberfeld的畢業生,試圖將大眾與機器學習之間的鴻溝,親手填補上。於是有了這個系列文章。  本系列第一講:梯度下降、線性回歸和邏輯回歸。
  • 線性回歸的求解:矩陣方程和梯度下降、數學推導及NumPy實現
    前一節我們曾描述了線性回歸的數學表示,最終得出結論,線性回歸的機器學習過程就是一個使得損失函數最小的最優化問題求解過程。Normal Equation對於損失函數,可以使其導數為零,尋找損失函數的極值點。
  • Python機器學習算法入門之梯度下降法實現線性回歸
    背景        文章的背景取自An Introduction to Gradient Descent and Linear Regression,本文想在該文章的基礎上,完整地描述線性回歸算法。部分數據和圖片取自該文章。沒有太多時間摳細節,所以難免有什麼缺漏錯誤之處,望指正。
  • 理解凸性:為什麼梯度下降適用於線性回歸
    在機器學習中我們總會遇到線性回歸問題,但是為什麼我們可以用梯度下降算法來求解線性回歸成本函數呢?凸性理論可以讓我們更容易理解這個問題。凸性首先,通過凸集和凸函數定義凸度。左邊和右邊的圖形都是凸的。不管你在這些圖上畫什麼線段,這個線段總是在函數圖的上面或者等於函數圖。現在我們對凸集和凸函數有了一些直覺和理解,讓我們轉向線性回歸,看看凸性在哪裡起作用。線性回歸回顧假設在n維空間中有m個數據樣本。每個樣本都有n個映射到單個輸出值的特性。
  • 機器學習之多元線性回歸模型梯度下降公式與代碼實現(篇二)
    上一篇我們介紹了線性回歸的概述和最小二乘的介紹,對簡單的一元線性方程模型手推了公式和python代碼的實現。,我們確定用梯度下降法來計算多元線性模型,當然還有更多計算方式。需要注意的 是對於複雜的非線性模型,通過梯度下降算法求解到的和可能是局部極小值而非全局 最小值解,這是由模型函數的非凸性決定的。但是我們在實踐中發現,通過梯度下降算法 求得的數值解,它的性能往往都能優化得很好,可以直接使用求解到的數值解和來近似作為最優解。
  • 從頭開始:用Python實現帶隨機梯度下降的Logistic回歸
    本文由機器之心編輯,「機器之心」專注生產人工智慧專業性內容,適合開發者和從業者閱讀參考。點擊右上角即刻關注。logistic 回歸是一種著名的二元分類問題的線性分類算法。它容易實現、易於理解,並在各類問題上有不錯的效果,即使該方法的原假設與數據有違背時。在本教程中,你將了解如何在 Python 中實現隨機梯度下降的 logistic 回歸算法。
  • 機器學習套路:線性回歸
    ,最基礎的機器學習算法,它是一種監督學習方法,可以被用來解決回歸問題。通常來說,用的最多的優化算法主要是梯度下降或擬牛頓法(L-BFGS或OWL-QN),計算過程都需要計算參數梯度值,下面僅從模型、代價函數以及參數梯度來描述一種機器學習算法。基本模型
  • 想入門機器學習?機器之心為你準備了一份中文資源合集
    機器之心整理參與:機器之心編輯部機器學習日益廣為人知,越來越多的計算機科學家和工程師投身其中。不幸的是,理論、算法、應用、論文、書籍、視頻等信息如此之多,很容易讓初學者迷失其中,不清楚如何才能提升技能。本文作者依據自身經驗給出了一套快速上手的可行方法及學習資源的分類匯總,機器之心在其基礎上做了增益,希望對讀者有所幫助。
  • 梯度下降背後的數學原理幾何?
    了解梯度下降背後的多元演算聽起來可能會讓人十分畏懼,別怕,下面我將對梯度下降背後的原理做出解釋並且僅跟大家探討理解梯度下降所需的數學概念。在此之前,我強烈建議你們查看我此前寫的一篇關於機器學習的文章或視頻先對基礎知識進行複習!
  • python機器學習--線性回歸
    python機器學習--線性回歸線性回歸是最簡單的機器學習模型,其形式簡單,易於實現,同時也是很多機器學習模型的基礎。對於一個給定的訓練集數據,線性回歸的目的就是找到一個與這些數據最吻合的線性函數。針對線性回歸算法在之前的數模案例也有涉及喔,歡迎去看看上一篇博客數學建模預測模型實例--大學生體測數據模型在這裡插入圖片描述OLS線性回歸Ordinary Least Squares 最小二乘法一般情況下,線性回歸假設模型為下,其中w為模型參數
  • 線性回歸:簡單線性回歸詳解
    【導讀】本文是一篇專門介紹線性回歸的技術文章,討論了機器學習中線性回歸的技術細節。線性回歸核心思想是獲得最能夠擬合數據的直線。
  • 機器學習 101:一文帶你讀懂梯度下降
    譯者 | 汪鵬(重慶郵電大學)、通夜(中山大學)編輯:王立魚英語原文:https://towardsdatascience.com/machine-learning-101-an-intuitive-introduction-to-gradient-descent-366b77b52645梯度下降無疑是大多數機器學習
  • 【重溫經典】吳恩達機器學習課程學習筆記七:Logistic回歸
    【重溫經典】吳恩達機器學習課程學習筆記一:監督學習【重溫經典】吳恩達機器學習課程學習筆記二:無監督學習(unsupervised learning)【重溫經典】吳恩達機器學習課程學習筆記三:監督學習模型以及代價函數的介紹【重溫經典】吳恩達機器學習課程學習筆記四:梯度下降【重溫經典】吳恩達機器學習課程學習筆記五:多元梯度下降