回歸算法是機器學習的一個基礎算法,簡單的就是線性回歸,還有非線性回歸。本節我們講解簡單的線性回歸。
線性回歸就是用直線來描述兩個變量之間的線性關係。我們在中學時可以根據平面上的兩個點來計算出通過這兩個點的直線。而線性回歸呢跟這個類似,只不過這裡有無窮多個點,我們知道一條直線一般是不能同時通過這無窮多個點的,所以呢,線性回歸要求這條直線像下面的圖所顯示的那樣能大致通過這些點就可以。而回歸的目標就是使得直線儘量不要偏離這些點太遠。因為直線要照顧所有的點,所以要有一個整體性的表達式來衡量直線偏離所有點的程度。然後我們調整直線的係數,使得這個偏離程度表達式最小化。
其中的數學化公式小編不做詳細講解,雖然線性回歸是機器學習算法中最簡單的一個,但是其數學表達也超出了很多菜鳥的理解範圍。不過我可以做一下簡單的說明
上文提到的直線偏離所有點的程度,這個偏離程度在機器學習裡有一個專門的詞彙叫著損失,而表達這種損失的表達式叫著損失函數。我們的目標是最小化損失函數。
當我們定義線性回歸的損失函數是每個點到直線的距離的平方和時,這種線性回歸算法稱之為最小二乘法。
下面我們使用sklearn提供的LinearRegression[最小二乘法]模塊來練練手,先使用virtualenv安裝一下sklearn,如果網絡不好,下面的過程可能會比較長,請耐心等待。
mkdir -p ~/source/skl
cd ~/source/sklvirtualenv .py --python=python2.7
source .py/bin/activatepip install sklearnpip install scipy # 科學計算
pip install matplotlib # 畫圖
pip install ipython # 命令行工具
我們先用y=5x+2直線生成100個點,還要加上浮動,避免所有的點能連成一條直線。
# -*- coding: utf-8 -*-
import random
import matplotlib.pyplot as plt
xs = range(100)
ys = []for x in xs: y.append(5*x+2+random.random()*50) # random加上浮動
plt.scatter(xs, ys, marker='.') # 畫點
plt.show() # 顯示圖形窗口
於是畫圖窗口打開了,我們看到
接下來我們開始使用sklearn的線性回歸模塊
# -*- coding: utf-8 -*-
import random
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
xs = range(100)
ys = []for x in xs: ys.append(5*x+2+random.random()*50) # 生成隨機散點
model = LinearRegression()
model.fit([[x] for x in xs], ys) # 擬合直線,*轉換輸入為多維*
ys_ = model.predict([[x] for x in xs]) # 預測所有的樣本
plt.scatter(xs, ys, marker='.') # 畫樣本點,隨機散點
plt.scatter(xs, ys_, marker='+') # 畫預測點,直線點
plt.show()
於是我們看到一條完美的黃色直線生成了
機器學習的目的是從輸入數據中習得一個模型,然後用這個模型去預測世界。在本例中,模型是一條直線以及直線的係數,LinearRegressionModel是該模型的一個封裝。模型有fit方法灌入輸入數據,進行複雜的數學計算後,模型就訓練出來了。然後我們就可以使用predict方法去預測世界。例子中我們通過輸入數據本身和模型對輸入數據的預測進行了圖形比對,直觀上就可以看出這是一個正確的直線擬合。
線性回歸的每條輸入是一個數據對(x,y),x在本例中是一個數值,在實際應用中x則是一個數組,它代表中輸入對象的多維屬性。比如顏色對象的RGB就有三個值。例子中擬合的是一條直線,實際應用中擬合的則是一個多維平面。所以代碼中我們對輸入xs做了轉換[[x] for x in xs]將輸入x轉換成多維形式,否則模型不接受輸入。
閱讀相關文章,關注公眾號【碼洞】