機器學習(三)-單變量線性迴歸算法

@tocpython

1 預測數值型數據:迴歸

1.1 什麼是迴歸?

  • 大天然讓咱們迴歸到必定的區間範圍以內;反過來講就是,有一個平均的水平,可讓突出的事物能向他靠攏。
  • 迴歸是由達爾文(Charles Darwin)的表兄弟Francis Galton發明的。 Galton於1877年完成了第一次迴歸預測,目的是根據上一代豌豆種子(雙親)的尺寸來預測下一代豌豆種子(孩子)的尺寸。Galton在大量對象上應用了迴歸分析,甚至包括人的身高。他注意到,若是雙親的高度比平均高度高,他們的子女也傾向於比平均高度高,但尚不及雙親。孩子的高度向着平均高度回退(迴歸)。Galton在多項研究上都注意到這個現象,因此儘管這個英文單詞跟數值預測沒有任何關係,但這種研究方法仍被稱做迴歸 2 。
  • 那些高個子的後代的身高,有種迴歸到大衆身高的趨勢。 eg: 姚明身高2米26,葉莉身高1米90, 可是他們後代的身高是會逐漸迴歸到正常的身高水平。

在這裏插入圖片描述

1.2 迴歸的目的是預測數值型的目標值。

1.3 迴歸能夠作什麼事?

迴歸能夠作任何事情。然而大多數公司經常使用迴歸法作一些比較沉悶的事情,例如:算法

  • 銷售量預測
  • 製造缺陷預測。

固然也能夠作有新意的應用,例如:數組

  • 預測名人的離婚率。
  • 預測所在地區的房價。

2 線性迴歸模型表示

2.1 線性迴歸的基本概念

  • 迴歸,通常都是指線性迴歸(linear regression).

從咱們最熟悉的開始, 已知兩點,求直線公式設 y = ax+b, 帶入兩點,求得解析解爲 y = 3x-60dom

在這裏插入圖片描述

  • 迴歸方程 (regression equation): y = 3x-60
  • 迴歸係數 (regression weights): 3和-60能夠稱爲迴歸係數
  • 迴歸: 求這些迴歸係數的過程

2.2 西安高新區房價預測

這個例子是預測住房價格的,咱們要使用一個數據集,數據集包含西安市的住房價格。在這裏,我要根據不一樣房屋尺寸所售出的價格,畫出個人數據集。比方說,若是你朋友的房子是40平方米大小,你要告訴他們這房子能賣多少錢。那麼,你能夠作的一件事就是構建一個模型,也許是條直線,從這個數據模型上來看,也許你能夠告訴你的朋友,他能以大約78萬(人民幣)左右的價格賣掉這個房子。這就是監督學習算法的一個例子。
在這裏插入圖片描述機器學習

m:表示訓練集數據的總量
    x:表示輸入變量
    y:表示輸出變量
    (x,y): 表示一個訓練樣本
    (x(i),y(i)): 表示第i個訓練樣本

在這裏插入圖片描述

3 迴歸的通常方法

3.1 線性迴歸的通常步驟

在這裏插入圖片描述
對於一元線性迴歸(單變量線性迴歸)來講,學習算法爲 y = ax + b
咱們換一種寫法: hθ(x) = θ0 + θ1x1函數

3.2 利用Sklearn作線性迴歸的預測

  • 實現步驟
    1). 模擬數據
    2). 調用sklearn擬合數據, 把theta0 theta1求出來
    3). 預測
from sklearn.linear_model import LinearRegression
import numpy as np

# 1).模擬數據
X = np.random.rand(100, 1)
Y = 4 + 2 * X + np.random.randn(100, 1)

# 2). 調用sklearn擬合數據, 把theta0 theta1求出來
# 導入線性迴歸類
lin_reg = LinearRegression()
# 讓線性迴歸類作訓練
lin_reg.fit(X, Y)
# 輸出theta0 theta1; intercept_是截距, coef_是斜率係數;
print("\ntheat0, theta1:", lin_reg.intercept_, lin_reg.coef_)

# 3). 預測
X_new = np.array([[0], [1]])
print("\nx=0, x=1預測結果:\n", lin_reg.predict(X_new))
  • 測試結果:

在這裏插入圖片描述

3 損失/代價函數

3.1 擬合

  • 線性迴歸實際上要作的事情就是: 選擇合適的參數(θ0, θ1),使得hθ(x)方程,很好的擬合訓練集。實現如何把最有可能的直線與咱們的數據相擬合。
  • 擬合就是把平面上一系列的點,用一條光滑的曲線鏈接起來。由於這條曲線有無數種可能,從而有各類擬合方法。擬合的曲線通常能夠用函數表示.

下面的三張圖, 展現了擬合的三種狀態:學習

  • 圖一是部分擬合
  • 圖二是徹底不擬合
  • 圖三是徹底擬合

在這裏插入圖片描述

3.2 損失函數: 均方偏差MSE

  • 擬合過程當中由於theta0和theta1的取值準確度, 預測的結果與訓練集中的實際值有差距。
咱們選擇的參數決定了咱們獲得的直線相對於咱們的訓練集的準確程度,模型所預測的值與訓練集中實際值之間的差距(下圖中藍線所指)就是建模偏差(modeling error)。

在這裏插入圖片描述

  • 咱們的目標即是選擇出可使得建模偏差的平方和可以最小的模型參數。 即便得損函數最小。

在這裏插入圖片描述

3.3 均方偏差MSE最小化

  • 二維空間求均方差

在這裏插入圖片描述
上圖是參考吳恩達視頻的圖片, 咱們會發現隨着theta1的不斷變化, 均方偏差MSE會找到一個最小值。 若是從數學角度來看, 就是求解函數的導數,計算函數的最小值。測試

  • 三維空間求均方差

在這裏插入圖片描述

上圖是參考吳恩達視頻的圖片, 咱們會發現隨着theta0和theta1的不斷變化, 均方偏差MSE會找到一個最小值。爲了經過圖形化看到最小的均方差, 三維圖片並不直觀。 一般使用等高線實現。以下圖:
在這裏插入圖片描述spa

  • 更高維空間

咱們會遇到更復雜、更高維度、更多參數的狀況,而這些狀況是很難畫出圖的,所以更沒法將其可視化,所以咱們真正須要的是編寫程序來找出這些最小化代價函數的和的值,而梯度降低算法就是可以自動地找出能使代價函數最小化的參數和的值。3d

4 梯度降低

4.1 梯度降低的思想

梯度降低是一個用來求函數最小值的算法,咱們將使用梯度降低算法來求出代價函數的最小值。
在這裏插入圖片描述

梯度降低背後的思想是:開始時咱們隨機選擇一個參數的組合,計算代價函數,而後咱們尋找下一個能讓代價函數值降低最多的參數組合。咱們持續這麼作直到到到一個局部最小值(local minimum),由於咱們並無嘗試完全部的參數組合,因此不能肯定咱們獲得的局部最小值是否即是全局最小值(global minimum),選擇不一樣的初始參數組合,可能會找到不一樣的局部最小值。

在這裏插入圖片描述

4.2 梯度降低的分類

想象一下你正站立在山的這一點上,站立在你想象的公園這座紅色山上,在梯度降低算法中,咱們要作的就是旋轉360度,看看咱們的周圍,並問本身要在某個方向上,用小碎步儘快下山。這些小碎步須要朝什麼方向?若是咱們站在山坡上的這一點,你看一下週圍,你會發現最佳的下山方向,你再看看周圍,而後再一次想一想,我應該從什麼方向邁着小碎步下山?而後你按照本身的判斷又邁出一步,重複上面的步驟,從這個新的點,你環顧四周,並決定從什麼方向將會最快下山,而後又邁進了一小步,並依此類推,直到你接近局部最低點的位置。

  • 公式:

在這裏插入圖片描述

  • 理解

    • a是學習率(learning rate),它決定了咱們沿着能讓代價函數降低程度最大的方向向下邁出的步子有多大;
    • 若是α過小的話,梯度降低會很慢
    • 若是α太大的話,梯度降低越過最小值,不只不會收斂,並且有可能發散
    • 不論斜率正或負,梯度降低都會逐漸趨向最小值
    • 即便學習率α是固定不變的,梯度降低也會收斂到一個最低點
  • 梯度降低的兩種更新方式:

在這裏插入圖片描述

4.2.1 「Batch」 Gradient Descent 批梯度降低

批梯度降低:指的是每降低一步,使用全部的訓練集來計算梯度值

  • 在梯度降低中,在計算微分求導項時,咱們須要進行求和運算,因此,在每個單獨的梯度降低中,咱們最終都要計算這樣一個東西,這個項須要對全部個訓練樣本求和。所以,批量梯度降低法這個名字說明了咱們須要考慮全部這一"批"訓練樣本,
  • 代碼實現
"""
線性迴歸實現梯度降低的批處理(batch_gradient_descent )
"""
import numpy as np

X = 2 * np.random.rand(100, 1)
y = 4 + 3 * X + np.random.randn(100, 1)
X_b = np.c_[np.ones((100, 1)), X]
# print(X_b)

learning_rate = 0.1
# 一般在作機器學習的時候,通常不會等到他收斂,由於太浪費時間,因此會設置一個收斂次數
n_iterations = 100000
m = 100

# 1.初始化theta, w0...wn
theta = np.random.randn(2, 1)
count = 0

# 4. 不會設置閾值,之間設置超參數,迭代次數,迭代次數到了,咱們就認爲收斂了
for iteration in range(n_iterations):
    count += 1
    # 2. 接着求梯度gradient
    gradients = 1/m * X_b.T.dot(X_b.dot(theta)-y)
    # 3. 應用公式調整theta值, theta_t + 1 = theta_t - grad * learning_rate
    theta = theta - learning_rate * gradients

print(count)
print(theta)
  • 執行結果

在這裏插入圖片描述

4.2.2 「Stochastic」 Gradient Descent 隨機梯度降低

隨機梯度降低:指的是每降低一步,使用一條訓練集來計算梯度值

4.2.3 「Mini-Batch」 Gradient Descent 「Mini-Batch」梯度降低

「Mini-Batch」梯度降低:指的是每降低一步,使用一部分的訓練集來計算梯度值

相關文章
相關標籤/搜索