線性回歸是一種較為簡單,但十分重要的機器學習方法。掌握線性的原理及求解方法,是深入了解線性回歸的基本要求。除此之外,線性回歸也是監督學習的基石,希望你能最終掌握機器學習的一些重要的思想。
今天就給大家展開講講線性回歸里的一元線性回歸和平方損失函數。
線性回歸介紹
回歸問題旨在實現對連續值的預測,例如股票的價格、房價的趨勢等。比如,下方展現了一個房屋面積和價格的對應關系圖。

如上圖所示,不同的房屋面積對應着不同的價格。現在,假設我手中有一套房屋想要出售,而出售時就需要預先對房屋進行估值。於是,我想通過上圖,也就是其他房屋的售價來判斷手中的房產價值是多少。應該怎么做呢?
我采用的方法是這樣的。如下圖所示,首先畫了一條紅色的直線,讓其大致驗證數據色點分布的延伸趨勢。然后,我將已知房屋的面積大小對應到紅色直線上,也就是藍色點所在位置。最后,再找到藍色點對應於房屋的價格作為房屋最終的預估價值。

在上圖呈現的這個過程中,通過找到一條直線去擬合數據點的分布趨勢的過程,就是線性回歸的過程。而線性回歸中的「線性」代指線性關系,也就是圖中所繪制的紅色直線。
此時,你可能心中會有一個疑問。上圖中的紅色直線是怎么繪制出來的呢?為什么不可以像下圖中另外兩條綠色虛線,而偏偏要選擇紅色直線呢?

綠色虛線的確也能反應數據點的分布趨勢。所以,找到最適合的那一條紅色直線,就成為了線性回歸中需要解決的目標問題。
通過上面這個小例子,相信你對線性回歸已經有一點點印象了,至少大致明白它能做什么。接下來的內容中,我們將了解線性回歸背后的數學原理,以及使用 Python 代碼對其實現。
一元線性回歸
上面針對 線性回歸 的介紹內容中,我們列舉了一個房屋面積與房價變化的例子。其中,房屋面積為自變量,而房價則為因變量。另外,我們將只有 1 個自變量的線性擬合過程叫做一元線性回歸。
下面,我們就生成一組房屋面積和房價變化的示例數據。𝑥 為房屋面積,單位是平方米; 𝑦 為房價,單位是萬元。
import numpy as np
x = np.array([56, 72, 69, 88, 102, 86, 76, 79, 94, 74])
y = np.array([92, 102, 86, 110, 130, 99, 96, 102, 105, 92])
示例數據由 10 組房屋面積及價格對應組成。接下來,通過 Matplotlib 繪制數據點, 𝑥 , 𝑦 分別對應着橫坐標和縱坐標。
from matplotlib import pyplot as plt
%matplotlib inline
plt.scatter(x, y)
plt.xlabel("Area")
plt.ylabel("Price")
正如上面所說,線性回歸即通過線性方程去擬合數據點。那么,我們可以令該 1 次函數的表達式為:
公式 \((1)\) 是典型的一元一次函數表達式,我們通過組合不同的 \(w_0\) 和 \(w_1\) 的值得到不同的擬合直線。
接下來,對公式 \((1)\) 進行代碼實現:
def f(x: list, w0: float, w1: float):
"""一元一次函數表達式
"""
y = w0 + w1 * x
return y
那么,哪一條直線最能反應出數據的變化趨勢呢?
想要找出對數據集擬合效果最好的直線,這里再拿出上小節圖示進行說明。如下圖所示,當我們使用 \(y(x, w) = w_0 + w_1x\) 對數據進行擬合時,就能得到擬合的整體誤差,即圖中藍色線段的長度總和。如果某一條直線對應的誤差值最小,是不是就代表這條直線最能反映數據點的分布趨勢呢?

平方損失函數
正如上面所說,如果一個數據點為 (\(x_{i}\), \(y_{i}\)),那么它對應的誤差就為:
上面的誤差往往也稱之為「殘差」。但是在機器學習中,我們更喜歡稱作「損失」,即真實值和預測值之間的偏離程度。那么,對 \(n\) 個全部數據點而言,其對應的殘差損失總和就為:
更進一步,在線性回歸中,我們一般使用殘差的平方和來表示所有樣本點的誤差。公式如下:
使用殘差平方和的好處在於能保證損失始終是累加的正數,而不會存在正負殘差抵消的問題。對於公式 \((4)\) 而言,機器學習中有一個專門的名詞,那就是「平方損失函數」。而為了得到擬合參數 \(w_0\) 和 \(w_1\) 最優的數值,我們的目標就是讓公式 \((4)\) 對應的平方損失函數最小。
同樣,我們可以對公式 \((4)\) 進行代碼實現:
def square_loss(x: np.ndarray, y: np.ndarray, w0: float, w1: float):
"""平方損失函數
"""
loss = sum(np.square(y - (w0 + w1 * x)))
return loss
如果某條直線擬合樣本得到的總損失最小,那么這條直線就是最終想得到的結果。而求解損失最小值的過程,就必須用到下面的數學方法了。
參考資料
如果對你有幫助就點個贊吧!
