1. 程式人生 > >機器學習基礎——推導線性迴歸公式

機器學習基礎——推導線性迴歸公式

在之前的文章當中,我們介紹過了簡單的樸素貝葉斯分類模型,介紹過最小二乘法,所以這期文章我們順水推舟,來講講線性迴歸模型。


線性迴歸的本質其實是一種統計學當中的迴歸分析方法,考察的是自變數和因變數之間的線性關聯。後來也許是建模的過程和模型訓練的方式和機器學習的理念比較接近,所以近年來,這個模型被歸入到了機器學習的領域當中。然而,不管它屬於哪個領域,整個模型的思想並沒有發生變化。我們只要有所瞭解即可。


模型概念


線性迴歸的定義非常簡單,它最簡單的形式其實就是一元一次方程組。比如,我們有如下式子:

\[y=wx+b\]

我們知道若干的x和y,要求w和b。解的方法很簡單,我們通過消元法,就可以很容易求出來w和b。


我們針對以上的式子做兩個變形,第一個變形是我們的自變數x不再是一個單值,而是一個m * n的矩陣。m表示樣本數,n表示特徵數,我們寫成X。X矩陣的每一行是一個n維的行向量,它代表一個樣本。它的係數W也不再是一個值,而是一個n * 1的列向量,它的每一維代表一個樣本當中這一維的權重。我們把上面的公式寫成矩陣相乘的形式:

\[Y=XW+b\]

式子裡的Y、X和W分別是m * 1, m * n和n * 1的矩陣。


這裡有兩點要注意,第一點是這裡的b我們可以當做是一個浮點數的引數,但是實際上它也是一個m * 1的矩陣(列向量)。但即使我們用的是浮點數也沒關係,因為在我們實現模型的時候,numpy或者TensorFlow或者是其他的框架會自動地使用廣播將它轉化成向量來做加法。


第二點是這裡的X寫在了W的前面,這也是為了矩陣乘法計算方便。當然我們也可以將X和W都轉置,寫成WX,但這樣得到的結果是一個1 * m的行向量,如果要和Y進行比較,那麼還需要再進行一次轉置。所以為了簡便,我們對調了X和W的順序。所以大家不要覺得疑惑,明明是WX+b怎麼寫出來就成了XW+b了。


我們把式子列出來之後,目標就很明確了,就是要通過計算求到一個W和b使得式子成立。但是在此之前,我們需要先明確一點:在實際的工程應用場景當中,是不可能找到W和b使得XW+b恰好和Y完全相等的。因為真實的場景當中資料都存在誤差,所以精確的解是不存在的,我們只能退而求其次,追求儘可能精確的解。


最小二乘法與均方差


在之前的文章當中我們介紹過最小二乘法,遺忘的同學可以點選下方連結回顧一下。


概率統計——期望、方差與最小二乘法


在機器學習的過程當中,模型不是直接達到最佳的,而是通過一步一步的迭代,效果逐漸提高,最終收斂不再劇烈變化。我們明白了這個過程,就能理解,在學習的過程當中,我們需要一個量化的指標來衡量模型當前學習到的能力。就好像學生在上學的時候需要考試來測試學生的能力一樣,我們也需要一個指標來測試模型的能力。


對於迴歸模型而言,預測的目標是一個具體的值。顯然這個預測值和真實值越接近越好。我們假設預測值是\(\hat{y}\),真實值是y,顯然應該是\(|y-\hat{y}|\)越小越好。


但是絕對值的計算非常麻煩,也不方便求導,所以我們通常會將它平方,即:\((y-\hat{y})^2\)最小。對於m個樣本而言,我們希望它們的平方和儘量小:\(\sum_{i=1}^m(y_i - \hat{y_i})^2\)。


這個式子和我們之前介紹的方差非常相似,只不過在方差當中減的是期望值,而在這裡我們減的是真實值。所以這個平方差也有一個類似的名稱,叫做均方差。


方差反應的是變數在期望值附近的震盪程度,同樣的,均方差反應的是模型預測值距離真實值的震盪程度。


尋找最佳的引數來使得均方差儘量小,就是最小二乘法。


推導過程


到這裡,我們已經搞清楚了模型的公式,也寫出了優化的目標,已經非常接近了,只剩下最後一步,就是優化這個目標的方法。


如果我們觀察一下均方差,我們把它寫全:\((Y-(XW+b))^2\),我們將W視作變數的話,這其實是一個廣義的二次函式。二次函式怎麼求最小值?當然是求導了。


在求導之前,我們先對均方差做一個簡單的變形:我們想辦法把b處理掉,讓式子儘可能簡潔。


首先,我們在X當中增加一列1,也就是將X變成m * (n+1)的矩陣,它的第一列是常數1,新的矩陣寫成\(X_{new}\)


同樣,我們在W中也增加一行,它的第一行寫成b,我們將新的矩陣寫成\(\theta\),我們可以得到:


\[XW+b = X_{new}\theta=\left[ \begin{matrix} 1 & x_{11} & x_{12} & \cdots & x_{1n}\\ 1 & x_{21} & x_{22} & \cdots & x_{2n}\\ \vdots & \vdots & \vdots & \vdots & \vdots\\ 1 & x_{m1} & x_{m2} & \cdots & x_{mn} \end{matrix} \right] \cdot \left[ \begin{matrix} b & w_1 & w_2 \cdots w_n \end{matrix} \right]\]


之後,我們對均方差進行變形:

\[J(\theta) = \frac{1}{2m}\sum_{i=1}^m(x_i\cdot \theta - y_i)^2\]

這裡的m是樣本的數量,是一個常數,我們對均方差乘上這個係數並不會影響\(\theta\)的取值。這個\(J(\theta)\)就是我們常說的模型的損失函式,這裡它代表的意義是所有樣本均方差的平均數的1/2。


這裡的損失其實是誤差的意思,損失函式的值越小,說明模型的誤差越小,和真實結果越接近。


我們計算\(J(\theta)\)對\(\theta\)的導數:

\[\frac{\partial J(\theta)}{\partial \theta}=\frac{1}{m}X^T(X\theta - Y)\]

我們令導數等於0,由於m是常數,可以消掉,得到:

\[ \begin{aligned} X^T(X\theta - Y) &= 0 \\ X^TX\theta &= X^TY \\ \theta &= (X^T \cdot X)^{-1}X^TY \end{aligned} \]

上面的推導過程初看可能覺得複雜,但實際上並不困難。只是一個簡單的求偏導的推導,我們就可以寫出最優的\(\theta\)的取值。


從這個公式來看並不難計算,實際上是否真的是這麼簡單呢?我們試著用程式碼來實驗一下。


程式碼實驗


為了簡單起見,我們針對最簡單的場景:樣本只有一個特徵,我們首先先試著自己生產一批資料:


import numpy as np
X = 2 * np.random.rand(100, 1)
y = 4 + 3 * X + np.random.randn(100, 1)

import matplotlib.pyplot as plt
plt.scatter(X, y)


我們先生成一百個0~2範圍內的x,然後y= 3x + 4,為了模擬真實存在誤差的場景,我們再對y加上一個0~1範圍內的誤差。


我們把上面的點通過plt畫出來可以得到這樣一張圖:

接著,我們就可以通過上面的公式直接計算出\(\theta\)的取值了:


def get_theta(x, y):
    m = len(y)
    # x中新增一列常數1
    x = np.c_[np.ones(m).T, x]
    # 通過公式計算theta
    theta = np.dot(np.dot(np.linalg.inv(np.dot(x.T, x)), x.T), y)
    return theta


我們傳入x和y得到\(\theta\),打印出來看,會發現和我們設定的非常接近:



最後,我們把模型擬合的結果和真實樣本的分佈都畫在一張圖上:


# 我們畫出模型x在0到2區間內的值
X_new = np.array([[0],[2]])
# 新增一列常數1的結果
X_new_b = np.c_[np.ones((2, 1)), X_new]
# 預測的端點值
y_predict = X_new_b.dot(theta)

# 畫出模型擬合的結果
plt.plot(X_new, y_predict,"r-")
# 畫出原來的樣本
plt.scatter(X,y)
plt.show()


得到的結果如下:


從結果上來看模型的效果非常棒,和我們的逾期非常吻合,並且實現的程式碼實在是太簡單了,只有短短几行。


但實際上,有一點我必須要澄清,雖然上面的程式碼只有幾行,非常方便,但是在實際使用線性迴歸的場景當中,我們並不會直接通過公式來計算\(\theta\),而是會使用其他的方法迭代來優化。


那麼,我們為什麼不直接計算,而要繞一圈用其他方法呢?


原因也很簡單,第一個原因是我們計算\(\theta\)的公式當中用到了逆矩陣的操作。在之前線性代數的文章當中我們曾經說過,只有滿秩矩陣才有逆矩陣。如果\(X^T \cdot X\)是奇異矩陣,那麼它是沒有逆矩陣的,自然這個公式也用不了了


當然這個問題並不是不能解決的,\(X^T \cdot X\)是奇異矩陣的條件是矩陣\(X\)當中存在一行或者一列全為0。我們通過特徵預處理,是可以避免這樣的事情發生的。所以樣本無法計算逆矩陣只是原因之一,並不是最關鍵的問題。


最關鍵的問題是複雜度,雖然我們看起來上面核心的程式碼只有一行,但實際上由於我們用到了逆矩陣的計算,它背後的開銷非常大,\(X^T \cdot X\)的結果是一個n * n的矩陣,這裡的n是特徵的維度。這樣一個矩陣計算逆矩陣的複雜度大概在\(n^{2.4}\)到\(n^3\)之間。隨著我們使用特徵的增加,整個過程的耗時以指數級增長,並且很多時候我們的樣本數量也非常大,我們計算矩陣乘法也會有很大的開銷。


正是因為以上這些原因,所以通常我們並不會使用直接通過公式計算的方法來求模型的引數。


那麼問題來了,如果我們不通過公式直接計算,還有其他方法求解嗎?


答案當然是有的,由於篇幅限制,我們放到下一篇文章當中。


今天的文章就到這裡,掃描下方二維碼,關注我的微信公眾號,獲取更多文章,你們的支援是我最大的動力。

相關推薦

機器學習基礎——推導線性迴歸公式

在之前的文章當中,我們介紹過了簡單的樸素貝葉斯分類模型,介紹過最小二乘法,所以這期文章我們順水推舟,來講講線性迴歸模型。 線性迴歸的本質其實是一種統計學當中的迴歸分析方法,考察的是自變數和因變數之間的線性關聯。後來也許是建模的過程和模型訓練的方式和機器學習的理念比較接近,所以近年來,這個模型被歸入到了機器學

機器學習入門之線性迴歸演算法推導

心血來潮,想將所學到的知識寫篇部落格,筆者所研究的方向為機器學習,剛學習的時候,走了很多彎路,看的書不少,在推導機器學習一些演算法時候遇到了不少困難,查了不少資料,在剛才學的時候,有很多公式推導起來很困難,或者說大多數人都會遇到這樣的問題,本部落格目的就是解決在機器學習公式推導過程中遇到的問

吳恩達機器學習-多變數線性迴歸 吳恩達機器學習 - 多變數線性迴歸

原 吳恩達機器學習 - 多變數線性迴歸 2018年06月18日 17:50:26 離殤灬孤狼 閱讀數:84 收起

機器學習之一元線性迴歸

概述 線性迴歸是利用數理統計中迴歸分析,來確定兩種或兩種以上變數間相互依賴的定量關係的一種統計分析方法,運用十分廣泛。其表達形式為y = w'x+e,e為誤差服從均值為0的正態分佈。 迴歸分析中,只包括一個自變數和一個因變數,且二者的關係可用一條直線近似表示,這種迴歸分析稱為一元線性迴歸分析。 如果迴歸分析

Python 機器學習系列之線性迴歸篇深度詳細

前兩篇部落格主要是講解基礎的線性迴歸,以下轉載自:http://www.jianshu.com/p/738f6092ef53,對迴歸進行深度分析,並加入了多項式的內容。 前言 本次推文介紹用線性模型處理迴歸問題。 從簡單問題開始,先處理一個響應變數和一個解釋變數的一元問題。 然後,介

機器學習》筆記 - 線性迴歸

對應於《機器學習》書中3.1與3.2節 1.基本形式 線性模型就是試圖找到一個可以進行預測的線性函式: 其中x是示例的屬性,w是權重,當d>1時的問題叫多變量回歸問題,否則叫單變量回歸問題。 線性模型的優點在於其可解釋性強,因為可以直觀表達每個屬性的重要程度。 &nb

機器學習筆記】線性迴歸之最小二乘法

線性迴歸    線性迴歸(Linear Regreesion)就是對一些點組成的樣本進行線性擬合,得到一個最佳的擬合直線。 最小二乘法    線性迴歸的一種常用方法是最小二乘法,它通過最小化誤差的平方和尋找資料的最佳函式匹配。 代數推導    假設擬合函式為 y

機器學習實戰》線性迴歸python原始碼

開啟pycharm建立一個regression.py檔案,輸入如下程式碼: #coding:utf-8 from numpy import * seterr(divide='ignore',invalid='ignore') """-------------------

吳恩達-機器學習(2)-多元線性迴歸、正規方程

文章目錄 Multivariate Linear Regression 特徵縮放 學習率 多項式迴歸(Ploynomial regression) Normal Equation

機器學習一:線性迴歸 (Linear Regression)

1.基本問題 線性迴歸屬於有監督的演算法,用來做迴歸預測。在實際的有監督迴歸問題中,我們通過擬合係數 的線性模型,以最小化資料集中觀察到的響應y與線性近似預測的響應之間的殘差平方和。我們的目標便是選擇出可以使得殘差平方和最小的模型引數,即得到代價函式 表達方式: (1)單變數線

機器學習筆記(6) 線性迴歸

先從最簡單的例子開始,假設我們有一組樣本(如下圖的一個個黑色的圓點),只有一個特徵,如下圖,橫軸是特徵值,縱軸是label。比如橫軸是房屋面積,縱軸是房屋價格. 現在我們要做什麼呢?我們試圖找到一條直線y=ax+b,可以儘量好的擬合這些點. 你可能要問了,為啥是直線,不是曲線,不是折線?因為我們的前提

[050]Python 機器學習系列之線性迴歸篇深度詳細

本次推文介紹用線性模型處理迴歸問題。 從簡單問題開始,先處理一個響應變數和一個解釋變數的一元問題。 然後,介紹多元線性迴歸問題(multiple linear regression),線性約束由多個解釋變數構成。 緊接著,介紹多項式迴歸分析(polynomial regression 問題),一種具有非線性

機器學習演算法總結--線性迴歸和邏輯迴歸

1. 線性迴歸 簡述 在統計學中,線性迴歸(Linear Regression)是利用稱為線性迴歸方程的最小平方函式對一個或多個自變數和因變數之間關係進行建模的一種迴歸分析。這種函式是一個或多個稱為迴歸係數的模型引數的線性組合(自變數都是一次方)。只有一

機器學習演算法】線性迴歸以及手推logistic迴歸

一,基本形式: 在樣本集D中有n個樣本,即。其中每個樣本x有d個屬性描述, x = (x1;x2;...;xd),其中xi表示的是第i個屬性上的取值,線性模型試圖學得一個通過屬性的線性組合來進行預測的函式,即: 其中w,b是要訓練的引數, w = (w1;w2;...;w

各種機器學習方法(線性迴歸、支援向量機、決策樹、樸素貝葉斯、KNN演算法、邏輯迴歸)實現手寫數字識別並用準確率、召回率、F1進行評估

本文轉自:http://blog.csdn.net/net_wolf_007/article/details/51794254 前面兩章對資料進行了簡單的特徵提取及線性迴歸分析。識別率已經達到了85%, 完成了數字識別的第一步:資料探測。 這一章要做的就各

機器學習sklearn19.0——線性迴歸演算法(應用案例)

一、sklearn中的線性迴歸的使用 二、線性迴歸——家庭用電預測 (1)時間與功率之間的關係 #!/usr/bin/env python # -*- coding:utf-8 -*- # Author:ZhengzhengLiu #線性迴歸——家庭用電預

機器學習入門:線性迴歸及梯度下降(附matlab程式碼)

 本文會講到: (1)線性迴歸的定義 (2)單變數線性迴歸 (3)cost function:評價線性迴歸是否擬合訓練集的方法 (4)梯度下降:解決線性迴歸的方法之一 (5)feature scaling:加快梯度下降執行速度的方法 (6)多變數線性迴歸 Linea

8.1 機器學習—R語言-線性迴歸

機器學習就是擬人資料+演算法-->找規律大資料公司主要分四類:1,資料擁有者,資料來源,PB級資料的包子鋪2,大資料諮詢公司,Cloudera--CDH3,大資料工具公司,Databricks--Apache Shark4,整合應用型,結合機器學習來解決更多實際的痛點機

大資料(四十一)機器學習【多元線性迴歸例項】

一、前言         保險公司對個人投保時或根據歷史資料生成的模型來計算個人保費,那麼本次我們就以這個模型的求解過程為例來實踐下多元線性迴歸。 二、資料&簡單分析         我們已經獲取到保險公司部分資料,檔名為insurance.csv,檔案內容如下

機器學習】【線性迴歸】梯度下降的三種方式(BGD+SGD+MSGD)以及三種調優方法(加快收斂速度)

1.梯度下降演算法梯度下降演算法的核心思路和公式推導,可以詳見前面的文章:梯度下降演算法的核心思路和公式推導如果代價函式是凸函式,用梯度下降演算法一定可以求得最優解。2.梯度下降的三種方式在ML中,梯度下降有三種方式:1)批量梯度下降(Batch Gradient  Desc