線性回歸(最小二乘法和梯度下降)


一、定義與公式

線性回歸(Linear regression)是一種線性模型,利用回歸方程(函數)對一個或多個自變量(特征值)和因變量(目標值)之間關系進行建模的一種分析方式。

  • 具體來說,利用線性回歸模型,可以從一組輸入變量x的線性組合中,計算輸出變量y。
  • 只有一個自變量的情況稱為單變量回歸,大於一個自變量情況的叫做多元回歸

那么怎么理解呢?我們來看幾個例子

  • 期末成績:0.7×考試成績+0.3×平時成績
  • 房子價格 = 0.02×中心區域的距離 + 0.04×城市一氧化氮濃度 + (-0.12×自住房平均房價) + 0.254×城鎮犯罪率

上面兩個例子,我們看到特征值與目標值之間建立的一個關系,這個可以理解為回歸方程

多元線性回歸

如果有兩個或兩個以上的自變量,這樣的線性回歸分析就成為多元線性回歸。

實際問題中,一個現象往往是受到多個因素影響的,所以多元線性回歸比一元線性回歸的實際應用更廣。

二、最小二乘法

線性回歸模型的關鍵就是確定w和b。w和b學得之后,模型也就確定了。

那么該如何確定w和b?

假設輸入特征只有一個。

使f(x)與y之間的均方誤差最小

 試圖找到一條直線,使得所有樣本到直線上的歐式距離之和最小,這就是最小二乘法。

基於均方誤差最小化來進行模型求解的方法稱為“最小二乘法”(least square method)。

它的主要思想就是選擇未知參數,使得理論值與觀測值只差的平方和達到最小。

2.1 公式推導

使得

最小化的過程,稱為線性回歸模型的“最小二乘參數估計”,分別對w和b求偏導。

推導過程參見南瓜書:https://datawhalechina.github.io/pumpkin-book/#/chapter3/chapter3

 令偏導數都等於0

 

 

 

2.2 代碼實現

數據集:https://files.cnblogs.com/files/wkfvawl/data.rar

import numpy as np
import matplotlib.pyplot as plt
#導入數據
# delimiter 分隔符
points = np.genfromtxt('data.csv', delimiter=',')
# 提取points中的兩列數據,分別作為x,y
# 每行的第一個和每行的第二個
x = points[:, 0]
y = points[:, 1]
# 先定義一個求均值的函數
def average(data):
    sum = 0
    num = len(data)
    for i in range(num):
        sum += data[i]
    return sum/num

# 定義核心擬合函數
def fit(points):   
    M = len(points)
    #x均值    
    x_bar = average(points[:, 0])
    #求w     
    sum_yx = 0
    sum_x2 = 0
    sum_delta = 0
    for i in range(M):
        x = points[i, 0]
        y = points[i, 1]
        sum_yx += y * ( x - x_bar )
        sum_x2 += x ** 2
    # 根據公式計算w
    w = sum_yx / ( sum_x2 - M * (x_bar**2) )
    #求b
    for i in range(M):
        x = points[i, 0]
        y = points[i, 1]
        sum_delta += ( y - w * x )
    b = sum_delta / M
    return w, b

# scatter散點圖
plt.scatter(x, y)
# 針對每一個x,計算出預測的y值
pred_y = w * x + b
# plot線型圖
plt.plot(x, pred_y, c='r')
plt.show()

三、梯度下降

最小二乘法在面對大量數據時,太慢了,可以使用凸優化中最常見的梯度下降法進行優化。

梯度下降是一個用來求函數最小值的算法,我們將使用梯度下降算法來求出損失函數𝐽(𝜃0, 𝜃1) 的最小值。
梯度下降背后的思想是:開始時我們隨機選擇一個參數的組合(𝜃0, 𝜃1, . . . . . . , 𝜃𝑛),計算代價函數,然后我們尋找下一個能讓代價函數值下降最多的參數組合。我們持續這么做直到到到一個局部最小值(local minimum),因為我們並沒有嘗試完所有的參數組合,所以不能確定我們得到的局部最小值是否便是全局最小值(global minimum),選擇不同的初始參數組合,可能會找到不同的局部最小值。

3.1 公式推導

一元線性回歸

在多元線性回歸中

α為學習速率,需要手動指定(超參數),α旁邊的整體表示方向

沿着這個函數下降的方向找,最后就能找到山谷的最低點,然后更新𝜃值

我們可以通過α來控制步長,大不能太大也不能太小。

在多元線性回歸中,選擇損失函數

這里

 

梯度下降算法

 

 

3.2 代碼實現

import numpy as np
import matplotlib.pyplot as plt
# 模型超參數
alpha = 0.0001
# 初始值
initial_w = 0
initial_b = 0
# 迭代次數
num_iter = 10
# 導入數據
points = np.genfromtxt('data.csv', delimiter=',')

# 損失函數是系數的函數,另外還要傳入數據的x,y
def compute_cost(w, b, points):
    total_cost = 0
    M = len(points)
    # 逐點計算平方損失誤差,然后求平均數
    for i in range(M):
        x = points[i, 0]
        y = points[i, 1]
        total_cost += ( y - w * x - b ) ** 2
    return total_cost/M
# 核心算法
def grad_desc(points, initial_w, initial_b, alpha, num_iter):
    w = initial_w
    b = initial_b
    # 定義一個list保存所有的損失函數值,用來顯示下降的過程
    cost_list = []
    # 迭代     
    for i in range(num_iter):
        cost_list.append( compute_cost(w, b, points) )
        w, b = step_grad_desc( w, b, alpha, points )
    # 迭代結束 獲得最優w b        
    return [w, b, cost_list]

def step_grad_desc( current_w, current_b, alpha, points ):
    sum_grad_w = 0
    sum_grad_b = 0
    M = len(points)
    # 對每個點,代入公式求和
    for i in range(M):
        x = points[i, 0]
        y = points[i, 1]
        h = current_w * x + current_b - y
        sum_grad_w += h * x
        sum_grad_b += h - y
    # 用公式求當前梯度
    grad_w = 2/M * sum_grad_w
    grad_b = 2/M * sum_grad_b
    # 梯度下降,更新當前的w和b
    updated_w = current_w - alpha * grad_w
    updated_b = current_b - alpha * grad_b
    return updated_w, updated_b

測試:運行梯度下降算法計算最優的w和b

w, b, cost_list = grad_desc( points, initial_w, initial_b, alpha, num_iter )

print("w is: ", w)
print("b is: ", b)

cost = compute_cost(w, b, points)

print("cost is: ", cost)

plt.plot(cost_list)
plt.show()
w is:  1.47513229374931
b is:  0.17505959562572973
cost is:  112.56579741946545

畫出擬合曲線

plt.scatter(x, y)
# 針對每一個x,計算出預測的y值
pred_y = w * x + b

plt.plot(x, pred_y, c='r')
plt.show()


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM