一贿堰、概述
1、背景
最近幾十年啡彬,人工智能經(jīng)歷了一輪又一輪的高潮和低谷羹与;今天,機(jī)器學(xué)習(xí)庶灿、深度學(xué)習(xí)再一次被賦予強(qiáng)人工智能的歷史使命纵搁;
機(jī)器學(xué)習(xí)作為人工智能中最重要的一環(huán),天生就帶有數(shù)學(xué)家和工程師的基因往踢,了解機(jī)器學(xué)習(xí)的常見模型和算法還是很有意義的腾誉。
本文結(jié)合自己的學(xué)習(xí)情況介紹對線性回歸模型的認(rèn)識(如文章有不妥之處,望不吝賜教)
2峻呕、介紹
機(jī)器學(xué)習(xí)根據(jù)訓(xùn)練數(shù)據(jù)方法的不同妄辩,可以分為監(jiān)督學(xué)習(xí)、半監(jiān)督學(xué)習(xí)山上、無監(jiān)督學(xué)習(xí)和強(qiáng)化學(xué)習(xí)。其中監(jiān)督學(xué)習(xí)的主要任務(wù)是分類和回歸
分類和回歸問題都需要根據(jù)訓(xùn)練樣本找到一個實(shí)數(shù)值函數(shù)g(x)英支;然后回歸根據(jù)g(x)佩憾,可以推導(dǎo)出給定新樣本的輸出值,而分類是根據(jù)g(x)干花,推導(dǎo)出新樣本的類別(如0或1)妄帘。
在現(xiàn)實(shí)世界中普遍存在變量之間的關(guān)系,關(guān)系大概分兩種:確定的函數(shù)關(guān)系 或 統(tǒng)計相關(guān)關(guān)系(非確定但又相互依賴的關(guān)系)池凄;回歸分析就是研究變量之間統(tǒng)計相關(guān)關(guān)系的方法抡驼。
唯物辯證法中認(rèn)為:事物之間的聯(lián)系是普遍存在的、相互影響肿仑、相互作用和相互制約的致盟;佛家認(rèn)為:前世因,今世果尤慰;數(shù)學(xué)家認(rèn)為: y = a_1x_1 + a_2x_2 + a_3x_3 + {\cdots}+ b
在回歸問題中馏锡,按照自變量和變量之間的關(guān)系類型,分為線性回歸分析和非線性回歸分析(如對數(shù)模型:f(x) = \frac{1}{1+ e^{-x}})伟端,本文介紹對象是線性回歸(Linear Regression)模型杯道。
3、線性回歸模型
主要介紹:回歸方程责蝠、損失函數(shù)党巾、損失函數(shù)求解方法萎庭、過擬合和欠擬合、多項(xiàng)式
二齿拂、回歸方程
1驳规、概述
在回歸分析中,只包括一個自變量和一個因變量创肥,且兩種的關(guān)系可以使用一條直線近似表示达舒,稱為一元線性回歸分析。如果有兩個及以上的自變量叹侄,且自變量和因變量是線性關(guān)系巩搏,稱為多元線性回歸分析。
一元線性回歸方程: y = ax + b
多元線性回歸方程: y = a_1x_1 + a_2x_2 + a_3x_3 + {\cdots} + b
2趾代、建立回歸方程
h_θ(x) = θ_0 + θ_1x_1+θ_2x_2+{\cdots}+θ_nx_n = \vec{θ}^T\vec{X}
其中贯底,\vec{θ} = \begin{bmatrix} θ_0 \\ θ_1 \\ θ_2 \\ {\cdots} \\ θ_n \end{bmatrix} \,\,\,\,\,\,\vec{X} = \begin{bmatrix} 1 \\ x_1 \\ x_2 \\ {\cdots} \\ x_n \end{bmatrix}
說明:θ_0 , θ_1,θ_2,{\cdots}θ_n 是回歸系數(shù),我們的目標(biāo)是求解出它們撒强,然后代入回歸方程禽捆,來預(yù)測新數(shù)據(jù)的輸出值。
二飘哨、損失函數(shù) (Loss Function)
1胚想、公式
確立了回歸方程后,我們使用均方誤差(Mean Square Error,MSE)來評估真實(shí)值 與預(yù)測值之間的差異芽隆,公式如下:
J(θ) = \frac {1}{2n} \sum_{i=1}^n(h_θ(x^i) - y^i)^2,\,\,\text{n為樣本數(shù)}
其矩陣表達(dá)式為:
J(θ) = \frac {1}{2n}(Xθ - Y)^T(Xθ - Y) ,\,\,\text{n為樣本數(shù)}
說明:以上就是線性回歸的損失函數(shù)浊服。下面介紹公式的推導(dǎo)。
2胚吁、解釋
- 假設(shè)特征的預(yù)測值和真實(shí)值的誤差是\xi^{(i)} ,那么預(yù)測值θ^T x^{(i)}和真實(shí)值y^{(i)}滿足如下公式:
y^{(i)} = θ^T x^{(i)} + \xi^{(i)}\,\,\,\,\,\,\,(1)
- 假設(shè)誤差是獨(dú)立的牙躺,隨機(jī)的,無窮大的腕扶,根據(jù)中心極限定理孽拷,誤差服從均值為\mu,方差為\sigma^2的正態(tài)分布半抱,其概率分布如下:
p(\xi^{(i)}) = \frac {1}{\sqrt{2\pi\sigma}} exp(-\frac{{\xi^{(i)}}^2}{2\sigma^2})\,\,\,\,\,\,\,(2)
- 由公式(1)可知:\xi^{(i)} = y^{(i)} - θ^T x^{(i)}脓恕,代入公式(2),得到一個y^{(i)}的概率公式如下:
p(y^{(i)} |x^{(i)};θ) = \frac {1}{\sqrt{2\pi} \sigma} exp(- \frac{(y^{(i)} - θ^T x^{(i)})^2}{2\sigma^2})\,\,\,\,\,\,\,(3)
- 對應(yīng)的極大似然函數(shù)是:
L(θ) = \prod_{i=1}^np(y^{(i)} |x^{(i)};θ) = \prod_{i=1}^n\frac {1}{\sqrt{2\pi} \sigma} exp(- \frac{(y^{(i)} - θ^T x^{(i)})^2}{2\sigma^2})|x^{(i)};θ) \,\,\,\,\,\,\,(4)
- 極大似然函數(shù)取對數(shù)窿侈,求導(dǎo)后得到θ的極大似然估計如下
\hat{θ} = \frac {1}{2} \sum_{i=1}^n(h_θ(x^i) - y^i)^2 \,\,\,\,\,\,\,(5)
說明:極大似然函數(shù)估計知道进肯,在\hat{θ} = \frac {1}{2} \sum_{i=1}^n(h_θ(x^i) - y^i)^2時,誤差最忻弈ァ江掩;為了后面計算推導(dǎo),引入歸一化的系數(shù)n, 最終得到的損失函數(shù)為:
J(θ) = \frac {1}{2n} \sum_{i=1}^n(h_θ(x^i) - y^i)^2,\,\,\text{n為樣本數(shù)}
三、損失函數(shù)求解法1:普通最小二乘法(OLS)
1环形、求解
- 當(dāng)矩陣X可逆時策泣,可以用普通最小二乘法(OLS) ,求解出回歸系數(shù)抬吟,公式如下(使用矩陣形式):
\hat{θ} = (X^TX)^{-1}X^TY
- 對應(yīng)的代碼實(shí)現(xiàn)如下:
def standRegre(xMat, yMat):
'''
:param xMat: X矩陣
:param yMat: y矩陣
:return: 回歸系數(shù)矩陣
'''
xTx = xMat.T * xMat
# linalg.det(xTx)計算行列式,行列式值為0.矩陣不可逆
if linalg.det(xTx) == 0.0:
print("This matrix is singular,cannot do inverse")
return
# .I用作求矩陣的逆矩陣
ws = xTx.I * dot(xMat.T,yMat)
return ws
- 回歸方程對數(shù)據(jù)點(diǎn)的擬合情況如下:
說明:要求矩陣X必須滿足可逆條件萨咕,否則是不可以解的。
2火本、解釋
我們知道危队,損失函數(shù)的矩陣表達(dá)式為
J(θ) = \frac {1}{2n}(Xθ - Y)^T(Xθ - Y)
擴(kuò)展后得到:
J(θ) = \frac {1}{2n}(θ^TX^TXθ - 2θ^TX^TY + YY )
對θ求偏導(dǎo),令導(dǎo)數(shù)為0钙畔,得:
\frac{\partial J(θ)}{\partial θ} = \frac {1}{2n}(2θ^TX^TX - 2X^TY) = 0
最后求解得到:
θ^T = (X^TX)^{-1}(X^TY)
四茫陆、損失函數(shù)求解法2:梯度下降(Gradient Descent)算法
1、 簡介
梯度下降算法是一種求局部最優(yōu)解的方法擎析;在數(shù)學(xué)上簿盅,函數(shù)的梯度(導(dǎo)數(shù))方向是函數(shù)值增長最快的方向,其相反方向就是下降最快的方向揍魂。
首先對\vec{θ}賦值桨醋,這個值可以是隨機(jī)的,也可以是一個全零的向量现斋。
改變\vec{θ}的值喜最,使得J(θ)按梯度下降的方向進(jìn)行減少。
θ = θ - \alpha \frac{\partial J(θ)}{\partial θ}, \,\,\, \alpha\text{是學(xué)習(xí)率庄蹋,步長}
???具體對θ的每個分量的求導(dǎo)公式如下:
\frac{\partial J(θ)}{\partial θ_j} = \frac{1}{n}\sum_{i=1}^n(h_θ(x^i) - y^i)x^i_j
說明:梯度下降(GD)是最小化損失函數(shù)的一種常用方法返顺,主要有批量梯度下降和隨機(jī)梯度下降兩種迭代求解思路。
2蔓肯、 批量梯度下降 (Batch Gradient Descent)
repeat until convergence {
\,\,\,\,\,\,\,\,\,θ_j:= θ_j - \alpha \frac{1}{n}\sum_{i=1}^n(h_θ(x^i) - y^i)x^i_j
}
說明:每更新一個θ_j ,都要遍歷一次樣本集振乏;如果樣本的數(shù)量n很大蔗包,開銷比較大;BGD可以得到一個全局最優(yōu)解慧邮,使得損失函數(shù)的風(fēng)險最小
代碼實(shí)現(xiàn):
def bgd(rate, maxLoop, epsilon, X, Y):
'''
批量梯度下降法
:param rate: 學(xué)習(xí)率
:param maxLoop:
:param epsilon: 收斂精度
:param X: 樣本特征矩陣
:param Y: 標(biāo)簽矩陣
:return: (theta, errors, thetas), timeConsumed
'''
# m是樣本數(shù)调限,n是特征個數(shù)
m, n = X.shape
# 初始化theta,n*1維的零向量
theta = np.zeros((n, 1))
count = 0
# 是否收斂
converged = False
error = float('inf')
errors = []
thetas = {}
for j in range(n):
thetas[j] = [theta[j, 0]]
while count <= maxLoop:
if (converged):
break
count = count + 1
# sum = 0
for j in range(n):
# deriv = (X * theta - y).T * X[:, j] / m
# print(deriv)
deriv = np.float128(0)
for i in range(m):
deriv += ((X[i] * theta - Y[i]) * X[i,j])[0,0]/ m
theta[j, 0] = theta[j, 0] - rate * deriv
thetas[j].append(theta[j, 0])
#誤差
error = loss_function(theta, X, y)
errors.append(error[0, 0])
# 如果已經(jīng)收斂
if (error < epsilon):
converged = True
return theta, errors, thetas
3、隨機(jī)梯度下降 (Stochastic Gradient Descent)
repeat until convergence {
?? for i=1 to n {
\,\,\,\,\,\,\,\,θ_j:= θ_j - \alpha (h_θ(x^i) - y^i)x^i_j
???}
}
說明1:在隨機(jī)梯度下降法中误澳,每更新θ_j 只需要一個樣本 (x^i,y^i)耻矮;在樣本數(shù)量巨大時,SGD的性能比較好忆谓,但是最終結(jié)果未必是全局最優(yōu)解裆装。
代碼實(shí)現(xiàn)
def sgd(rate, maxLoop, epsilon, dataMat, labelMat):
'''
隨機(jī)梯度下降法
:param rate: 學(xué)習(xí)率
:param maxLoop:
:param epsilon: 收斂精度
:param dataMat: 樣本特征矩陣
:param labelMat: 標(biāo)簽矩陣
'''
sampleCount, featureCount = dataMat.shape
#初始化theta,featureCount * 1維的0向量
theta = np.zeros((featureCount,1))
count = 0
converged = False
error = float('inf')
errors = []
thetas = {} #字典
for j in range(featureCount):
thetas[j] = [theta[j,0]]
# 迭代到最大次數(shù)結(jié)束
while count <= maxLoop:
if (converged):
break
count = count + 1
errors.append(float('inf'))
# 獲取樣本
for i in range(sampleCount):
if (converged):
break
#計算實(shí)際和預(yù)測的誤差
diff = labelMat[i,0] - regression_function(theta,dataMat[i].T)
# 通過第i個樣本來優(yōu)化theta
for j in range(featureCount):
theta[j, 0] = theta[j, 0] + rate * diff * dataMat[i,j]
thetas[j].append(theta[j, 0])
error = loss_function(theta, dataMat, labelMat)
errors[-1] = error[0, 0]
# 如果已經(jīng)收斂
if (error < epsilon):
converged = True
return theta, errors, thetas
4、其他
隨機(jī)梯度下降法在還能夠應(yīng)用到一些更加復(fù)雜的算法中,如邏輯回歸(Logic Regression)算法(雖有回歸兩字哨免,但實(shí)際上是分類算法)等茎活;
在回歸模型的損失函數(shù)求解中,還有正規(guī)方程的方式琢唾,它不需要調(diào)節(jié)學(xué)習(xí)率\alpha载荔,但是要求矩陣可逆,數(shù)據(jù)維度不能太大采桃。
五懒熙、特征縮放
當(dāng)樣本的特征的數(shù)值之間差異比較大時,梯度下降的過程不僅曲折普办,而且耗時工扎;這時候需要將各個特征歸一化到統(tǒng)一的區(qū)間。常見的做法如下:
1泌豆、0均值標(biāo)準(zhǔn)化(Z-score normalization)
- 將原始數(shù)據(jù)集歸一化為均值為0定庵、方差為1的數(shù)據(jù)集,歸一化后的特征將分布在 [?1,1] 區(qū)間踪危,轉(zhuǎn)化函數(shù)如下:
z=\frac {x - μ}{δ}
????其中蔬浙,μ、σ分別為原始數(shù)據(jù)集的均值和標(biāo)準(zhǔn)差贞远。
????說明:該種歸一化方式要求原始數(shù)據(jù)的分布可以近似為高斯分布畴博,否則歸一化的效果會變得很糟糕。
- 代碼實(shí)現(xiàn)如下:
def standardize(xArr):
'''
特征標(biāo)準(zhǔn)化處理
:param xArr: 樣本特征集
:return: 標(biāo)準(zhǔn)化后的樣本特征集
'''
m, n = xArr.shape
# 歸一化每一個特征
for j in range(n):
meanVal = xArr[:, j].mean(axis=0)
std = xArr[:, j].std(axis=0)
if std != 0:
xArr[:, j] = (xArr[:, j] - meanVal) / pow(std,2)
else:
xArr[:, j] = 0
return xArr
2蓝仲、線性函數(shù)歸一化(Min-Max Scaling)
- 實(shí)現(xiàn)對原始數(shù)據(jù)的等比例縮放俱病,將原始數(shù)據(jù)線性化的方法轉(zhuǎn)換到[0,1]的范圍,公式如下:
X_{normal} = \frac {X - X_{min}}{ X_{max} - X_{min}}
????其中X_{norm}為歸一化后的數(shù)據(jù)袱结,X為原始數(shù)據(jù)亮隙,X_{max} 、X_{min}分別為原始數(shù)據(jù)集的最大值和最小值垢夹。
- 代碼實(shí)現(xiàn)如下:
def normalize(xArr):
"""特征歸一化處理
Args:
X: 樣本特征集
Returns:
歸一化后的樣本特征集矩陣
"""
m, n = xArr.shape
# 歸一化每一個特征
for j in range(n):
minVal = xArr[:, j].min(axis=0)
maxVal = xArr[:, j].max(axis=0)
diff = maxVal - minVal
if diff != 0:
xArr[:, j] = (xArr[:, j] - minVal) / diff
else:
xArr[:, j] = 0
return xArr
3溢吻、總結(jié)
在分類、聚類算法中果元,需要使用距離來度量相似性的時候促王、或者使用PCA技術(shù)進(jìn)行降維的時候,Z-score standardization表現(xiàn)更好而晒。
在不涉及距離度量蝇狼、協(xié)方差計算、數(shù)據(jù)不符合正太分布的時候倡怎,可以使用Min-Max Scaling或其他歸一化方法迅耘。比如圖像處理中贱枣,將RGB圖像轉(zhuǎn)換為灰度圖像后將其值限定在[0 255]的范圍。
六豹障、多項(xiàng)式回歸
1冯事、多項(xiàng)式
多項(xiàng)式由稱為不定元的變量和常數(shù)系數(shù)通過有限次加減法、乘法以及自然數(shù)冪次的乘方運(yùn)算得到的代數(shù)表達(dá)式血公,可以分為一次一元多項(xiàng)式和多元多項(xiàng)式昵仅。我們主要討論一元多項(xiàng)式,其形式如下:
y = a_0 + a_1 * x + a_2 * (x^2) + ... + a_n * (x^n) + e
2累魔、多項(xiàng)式回歸
當(dāng)回歸函數(shù)不能用直線來描述時摔笤,要考慮用非線性回歸函數(shù)。 多項(xiàng)式回歸屬于非線性回歸的一種垦写。這里主要介紹一元多項(xiàng)式回歸吕世。
一般非線性回歸函數(shù)是未知的,或即使已知也未必可以用一個簡單的函數(shù)變換轉(zhuǎn)化為線性模型梯投。常用的做法是用因子的多項(xiàng)式命辖。
從散點(diǎn)圖觀察到回歸函數(shù)有一個“彎”,則可考慮用二次多項(xiàng)式分蓖;有兩個彎則考慮用三次多項(xiàng)式尔艇;有三個彎則考慮用四次多項(xiàng)式,等等么鹤。
真實(shí)的回歸函數(shù)未必就是某個次數(shù)的多項(xiàng)式终娃,但只要擬合得好,用適當(dāng)?shù)亩囗?xiàng)式來近似真實(shí)的回歸函數(shù)是可行的蒸甜。
七棠耕、擬合的問題
1、概念
- 擬合:把平面上一系列的點(diǎn)柠新,用一條光滑的曲線連接起來窍荧,擬合的曲線一般可以用函數(shù)表示,擬合曲線不是唯一的恨憎;在實(shí)踐中蕊退,常常會出現(xiàn)過擬合和欠擬合問題;
最左邊的直線沒有很好擬合數(shù)據(jù),這類情況是欠擬合(underfitting)痢甘;最右邊的曲線似乎對數(shù)據(jù)點(diǎn)做了很好的擬合(曲線通過了所有的點(diǎn))喇嘱,但是它無法泛化到新的數(shù)據(jù)樣本中,是一個差的模型塞栅,這種情況是過擬合的者铜,只有中間的曲線才是理想的擬合曲線。
泛化指的是一個假設(shè)模型能夠應(yīng)用到新樣本的能力。新樣本數(shù)據(jù)是指沒有出現(xiàn)在訓(xùn)練集中的數(shù)據(jù)作烟。
特征過多 或者 樣本量少的情況都容易發(fā)生過擬合的情況愉粤。解決的方法有兩種:1)減少特征個數(shù),選擇最重要的特征拿撩,拋棄一部分特征衣厘;2)正則化,保留所有的特征压恒,但是會減小特征變量的數(shù)量級影暴。