線性回歸的概念
1、線性回歸的原理
2、線性回歸損失函數、代價函數、目标函數
3、優化方法(梯度下降法、牛頓法、拟牛頓法等)
4、線性回歸的評估名額
5、sklearn參數詳解
1、線性回歸的原理
進入一家房産網,可以看到房價、面積、廳室呈現以下資料:
面積($x_1$) | 廳室數量($x_2)$ | 價格(萬元)(y) |
---|---|---|
64 | 3 | 225 |
59 | 3 | 185 |
65 | 3 | 208 |
116 | 4 | 508 |
…… | …… | …… |
我們可以将價格和面積、廳室數量的關系習得為 f ( x ) = θ 0 + θ 1 x 1 + θ 2 x 2 f(x)=\theta_0+\theta_1x_1+\theta_2x_2 f(x)=θ0+θ1x1+θ2x2,使得 f ( x ) ≈ y f(x)\approx y f(x)≈y,這就是一個直覺的線性回歸的樣式。
小練習:這是國内一個房産網站上任意搜的資料,有興趣可以找個網站觀察一下,還可以獲得哪些可能影響到房價的因素?可能會如何影響到實際房價呢?
線性回歸的一般形式:
有資料集 { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x n , y n ) } \{(x_1,y_1),(x_2,y_2),...,(x_n,y_n)\} {(x1,y1),(x2,y2),...,(xn,yn)},其中, x i = ( x i 1 ; x i 2 ; x i 3 ; . . . ; x i d ) , y i ∈ R x_i = (x_{i1};x_{i2};x_{i3};...;x_{id}),y_i\in R xi=(xi1;xi2;xi3;...;xid),yi∈R
其中n表示變量的數量,d表示每個變量的次元。
可以用以下函數來描述y和x之間的關系:
f ( x ) = θ 0 + θ 1 x 1 + θ 2 x 2 + . . . + θ d x d = ∑ i = 0 d θ i x i f(x) = \theta_0 + \theta_1x_1 + \theta_2x_2 +... + \theta_dx_d = \sum_{i=0}^{d}\theta_ix_i f(x)=θ0+θ1x1+θ2x2+...+θdxd=i=0∑dθixi
如何來确定 θ \theta θ的值,使得 f ( x ) f(x) f(x)盡可能接近y的值呢?均方誤差是回歸中常用的性能度量,即:
J ( θ ) = 1 2 ∑ j = 1 n ( h θ ( x ( i ) ) − y ( i ) ) 2 J(\theta)=\frac{1}{2}\sum_{j=1}^{n}(h_{\theta}(x^{(i)})-y^{(i)})^2 J(θ)=21j=1∑n(hθ(x(i))−y(i))2
我們可以選擇 θ \theta θ,試圖讓均方誤差最小化:
極大似然估計(機率角度的诠釋)
下面我們用極大似然估計,來解釋為什麼要用均方誤差作為性能度量
我們可以把目标值和變量寫成如下等式:
y ( i ) = θ T x ( i ) + ϵ ( i ) y^{(i)} = \theta^T x^{(i)}+\epsilon^{(i)} y(i)=θTx(i)+ϵ(i)
ϵ \epsilon ϵ表示我們未觀測到的變量的印象,即随機噪音。我們假定 ϵ \epsilon ϵ是獨立同分布,服從高斯分布(就是正态分布)。(根據中心極限定理)
p ( ϵ ( i ) ) = 1 2 π σ e x p ( − ( ϵ ( i ) ) 2 2 σ 2 ) p(\epsilon^{(i)}) = \frac{1}{\sqrt{2\pi}\sigma}exp\left(-\frac{(\epsilon^{(i)})^2}{2\sigma^2}\right) p(ϵ(i))=2π
σ1exp(−2σ2(ϵ(i))2)
是以,( y ( i ) = θ T x ( i ) + ϵ ( i ) y^{(i)} = \theta^T x^{(i)}+\epsilon^{(i)} y(i)=θTx(i)+ϵ(i),移項得 ϵ ( i ) = y ( i ) − θ T x ( i ) \epsilon^{(i)} = y^{(i)}-\theta^T x^{(i)} ϵ(i)=y(i)−θTx(i))
p ( y ( i ) ∣ x ( i ) ; θ ) = 1 2 π σ e x p ( − ( y ( i ) − θ T x ( i ) ) 2 2 σ 2 ) p(y^{(i)}|x^{(i)};\theta) = \frac{1}{\sqrt{2\pi}\sigma}exp\left(-\frac{(y^{(i)}-\theta^T x^{(i)})^2}{2\sigma^2}\right) p(y(i)∣x(i);θ)=2π
σ1exp(−2σ2(y(i)−θTx(i))2)
- Notice:這個 p ( y ( i ) ∣ x ( i ) ; θ ) p(y^{(i)}|x^{(i)};\theta) p(y(i)∣x(i);θ)的意思是,在參數為 θ \theta θ時候, x ( i ) x^{(i)} x(i)屬于 y ( i ) y^{(i)} y(i)的機率
- 極大似然估計:離散型和連續性,即 L ( θ ) = { ∏ i = 1 n p ( X i , θ ) ∏ i = 1 n f ( X i , θ ) L(\theta)=\begin{cases}\prod\limits_{i=1}^n p(X_i,\theta)\\\prod\limits_{i=1}^n f(X_i,\theta)\end{cases} L(θ)=⎩⎪⎨⎪⎧i=1∏np(Xi,θ)i=1∏nf(Xi,θ),當 θ \theta θ取多少時,機率最大
- 舉例:運動員射箭,運動員分1和2級運動員,射箭成績為 ( 10 , 9 , 10 , 10 ) (10,9,10,10) (10,9,10,10),是以我們可以推測這個是1級運動員,換句話說,在他為1級運動員時,射出 ( 10 , 9 , 10 , 10 ) (10,9,10,10) (10,9,10,10)的成績的機率最大,即 p ( 10 , 9 , 10 , 10 ∣ 1 ) = max p(10,9,10,10 | 1)=\max p(10,9,10,10∣1)=max,就是參數為多少時,觀測值出現的機率最大, p ( 10 , 9 , 10 , 10 ∣ ? ) = max p(10,9,10,10 | ?)=\max p(10,9,10,10∣?)=max, ? ? ?處就是我們要算的 θ \theta θ.
- 計算步驟,一般取對數,令 d log L ( θ ) d θ = 0 \frac{d\log L(\theta)}{d\theta}=0 dθdlogL(θ)=0,得出 θ ^ \hat\theta θ^,此處 log \log log就是 ln \ln ln,取對數為什麼可以求出 θ ^ \hat\theta θ^,是因為對數函數嚴格單調增;也可以不取對數,直接求導;如果 L ( θ ) L(\theta) L(θ)關于 θ \theta θ單調,直接定義法,取兩端,一般是樣本的 max \max max或者 m i n min min。Notice:對于連續性的,要根據分布函數先求出機率密度, X X X ~ F ( x , θ ) F(x,\theta) F(x,θ)求導得 X X X ~ f ( x , θ ) f(x,\theta) f(x,θ)
我們建立極大似然函數,即描述資料遵從目前樣本分布的機率分布函數。由于樣本的資料集獨立同分布,是以可以寫成
L ( θ ) = p ( y ⃗ ∣ X ; θ ) = ∏ i = 1 n 1 2 π σ e x p ( − ( y ( i ) − θ T x ( i ) ) 2 2 σ 2 ) L(\theta) = p(\vec y | X;\theta) = \prod^n_{i=1}\frac{1}{\sqrt{2\pi}\sigma}exp\left(-\frac{(y^{(i)}-\theta^T x^{(i)})^2}{2\sigma^2}\right) L(θ)=p(y
∣X;θ)=i=1∏n2π
σ1exp(−2σ2(y(i)−θTx(i))2)
選擇 θ \theta θ,使得似然函數最大化,這就是極大似然估計的思想。
為了友善計算,我們計算時通常對對數似然函數求最大值:
l ( θ ) = l o g L ( θ ) = l o g ∏ i = 1 n 1 2 π σ e x p ( − ( y ( i ) − θ T x ( i ) ) 2 2 σ 2 ) = ∑ i = 1 n l o g 1 2 π σ e x p ( − ( y ( i ) − θ T x ( i ) ) 2 2 σ 2 ) = n l o g 1 2 π σ − 1 σ 2 ⋅ 1 2 ∑ i = 1 n ( ( y ( i ) − θ T x ( i ) ) 2 l(\theta) = log L(\theta) = log \prod^n_{i=1}\frac{1}{\sqrt{2\pi}\sigma}exp\left(-\frac{(y^{(i)}-\theta^T x^{(i)})^2} {2\sigma^2}\right) \\ = \sum^n_{i=1}log\frac{1}{\sqrt{2\pi}\sigma}exp\left(-\frac{(y^{(i)}-\theta^T x^{(i)})^2}{2\sigma^2}\right) \\ = nlog\frac{1}{{\sqrt{2\pi}\sigma}} - \frac{1}{\sigma^2} \cdot \frac{1}{2}\sum^n_{i=1}((y^{(i)}-\theta^T x^{(i)})^2 l(θ)=logL(θ)=logi=1∏n2π
σ1exp(−2σ2(y(i)−θTx(i))2)=i=1∑nlog2π
σ1exp(−2σ2(y(i)−θTx(i))2)=nlog2π
σ1−σ21⋅21i=1∑n((y(i)−θTx(i))2
顯然,最大化 l ( θ ) l(\theta) l(θ)即最小化 1 2 ∑ i = 1 n ( ( y ( i ) − θ T x ( i ) ) 2 \frac{1}{2}\sum\limits^n_{i=1}((y^{(i)}-\theta^T x^{(i)})^2 21i=1∑n((y(i)−θTx(i))2。(這部分對 θ \theta θ求導)
這一結果即均方誤差,是以用這個值作為代價函數來優化模型在統計學的角度是合理的。
- 補充:
-
正态分布:随機誤差都随了正态分布, X ∼ f ( x ) = 1 2 π σ e x p ( − ( x − μ ) 2 2 σ 2 ) X \sim{f(x)}=\frac{1}{\sqrt{2\pi}\sigma}exp\left(-\frac{(x-\mu)^2}{2\sigma^2}\right) X∼f(x)=2π
σ1exp(−2σ2(x−μ)2)( − ∞ < x < + ∞ -\infty< x<+\infty −∞<x<+∞, x = μ x=\mu x=μ為對稱軸, max = 1 2 π σ \max=\frac{1}{\sqrt{2\pi}\sigma} max=2π
σ1, μ \mu μ為均值(期望), σ \sigma σ為标準差, σ 2 \sigma^2 σ2為方差), ∼ \sim ∼表示服從,即可以寫作 X ∼ N ( μ , σ 2 ) X\sim N(\mu,\sigma^2) X∼N(μ,σ2)
-
Notice:若 μ = 0 , σ 2 = 1 \mu=0,\sigma^2=1 μ=0,σ2=1,則 X ∼ N ( 0 , 1 ) X\sim N(0,1) X∼N(0,1),則 X ∼ φ ( x ) = 1 2 π e x p ( − x 2 2 ) X\sim \varphi(x)=\frac{1}{\sqrt{2\pi}}exp\left(-\frac{x^2}{2}\right) X∼φ(x)=2π
1exp(−2x2)關于 y y y軸對稱, φ ( x ) \varphi(x) φ(x)為标準正态的機率密度(機率密度在全區間積分=1,歸一性), X ∼ Φ ( x ) = ∫ − ∞ x 1 2 π e x p ( − t 2 2 ) d t X\sim \Phi(x)=\int_{-\infty}^{x} \frac{1}{\sqrt{2\pi}}exp\left(-\frac{t^2}{2}\right)\, dt X∼Φ(x)=∫−∞x2π
1exp(−2t2)dt, Φ ( x ) \Phi(x) Φ(x)為标準正态分布函數
TASK1 線性回歸-Linear_regression線性回歸的概念 -
中心極限定理是說:
樣本的平均值約等于總體的平均值。
不管總體是什麼分布,任意一個總體的樣本平均值都會圍繞在總體的整體平均值周圍,并且呈正态分布。(原來的标準差公式是除以 n n n,為了用樣本估計總體标準差,現在是除以 n − 1 n-1 n−1。這樣就是的标準略大。一般用 s s s表示用樣本估計出的總體标準差。)
-
2、線性回歸損失函數、代價函數、目标函數
- 損失函數(Loss Function):度量單樣本預測的錯誤程度,損失函數值越小,模型就越好。
- 代價函數(Cost Function):度量全部樣本集的平均誤差。
- 目标函數(Object Function):代價函數和正則化函數,最終要優化的函數。
- 補充:
- 損失函數和代價函數是同一個東西,目标函數是一個與他們相關但更廣的概念,對于目标函數來說在有限制條件下的最小化就是損失函數(loss function)。
- 舉個例子解釋一下:(圖檔來自Andrew Ng Machine Learning公開課視訊)
TASK1 線性回歸-Linear_regression線性回歸的概念 - 上面三個圖的函數依次為 f 1 ( x ) , f 2 ( x ) , f 3 ( x ) f_1(x),f_2(x),f_3(x) f1(x),f2(x),f3(x)。我們是想用這三個函數分别來拟合Price,而Price的真實值記為 Y Y Y。
- 我們給定 x x x,這三個函數都會輸出一個 f ( X ) f(X) f(X),這個輸出的 f ( X ) f(X) f(X)與真實值 Y Y Y可能是相同的,也可能是不同的,為了表示我們拟合的好壞,我們就用一個函數來度量拟合的程度,比如: L ( Y , f ( X ) ) = ( Y − f ( X ) ) 2 L(Y, f(X))=(Y-f(X))^2 L(Y,f(X))=(Y−f(X))2,這個函數就稱為損失函數(loss function),或者叫代價函數(cost function)。損失函數越小,就代表模型拟合的越好。
-
那是不是我們的目标就隻是讓loss function越小越好呢?還不是。
這個時候還有一個概念叫風險函數(risk function)。風險函數是損失函數的期望,這是由于我們輸入輸出的 ( X , Y ) (X,Y) (X,Y)遵循一個聯合分布,但是這個聯合分布是未知的,是以無法計算。但是我們是有曆史資料的,就是我們的訓練集, f ( X ) f(X) f(X)關于訓練集的平均損失稱作經驗風險(empirical risk),即 1 N ∑ i = 1 N L ( y i , f ( x i ) ) \frac{1}{N}\sum\limits_{i=1}^NL(y_i,f(x_i)) N1i=1∑NL(yi,f(xi)),是以我們的目标就是最小化 1 N ∑ i = 1 N L ( y i , f ( x i ) ) \frac{1}{N}\sum\limits_{i=1}^NL(y_i,f(x_i)) N1i=1∑NL(yi,f(xi)),稱為經驗風險最小化。
- 到這裡完了嗎?還沒有。
- 如果到這一步就完了的話,那我們看上面的圖,那肯定是最右面的 f 3 ( x ) f_3(x) f3(x)的經驗風險函數最小了,因為它對曆史的資料拟合的最好嘛。但是我們從圖上來看 f 3 ( x ) f_3(x) f3(x)肯定不是最好的,因為它過度學習曆史資料,導緻它在真正預測時效果會很不好,這種情況稱為過拟合(over-fitting)。
- 為什麼會造成這種結果?
- 大白話說就是它的函數太複雜了,都有四次方了,這就引出了下面的概念,我們不僅要讓經驗風險最小化,還要讓結構風險最小化。這個時候就定義了一個函數 j ( f ) j(f) j(f),這個函數專門用來度量模型的複雜度,在機器學習中也叫正則化(regularization)。常用的有 L 1 , L 2 L_1,L_2 L1,L2範數。
- 到這一步我們就可以說我們最終的優化函數是: min 1 N ∑ i = 1 N L ( y i , f ( x i ) ) + λ J ( f ) \min \frac{1}{N}\sum\limits_{i=1}^N L(y_i,f(x_i))+\lambda J(f) minN1i=1∑NL(yi,f(xi))+λJ(f),即最優化經驗風險和結構風險,而這個函數就被稱為目标函數。
- 結合上面的例子來分析:最左面的 f 1 ( x ) f_1(x) f1(x)結構風險最小(模型結構最簡單),但是經驗風險最大(對曆史資料拟合的最差);最右面的 f 3 ( x ) f_3(x) f3(x)經驗風險最小(對曆史資料拟合的最好),但是結構風險最大(模型結構最複雜);而 f 2 ( x ) f_2(x) f2(x)達到了二者的良好平衡,最适合用來預測未知資料集。
- 來自:https://www.zhihu.com/question/52398145/answer/209358209
常用的損失函數包括:0-1損失函數、平方損失函數、絕對損失函數、對數損失函數等;常用的代價函數包括均方誤差、均方根誤差、平均絕對誤差等。
思考題:既然代價函數已經可以度量樣本集的平均誤差,為什麼還要設定目标函數?
回答:
當模型複雜度增加時,有可能對訓練集可以模拟的很好,但是預測測試集的效果不好,出現過拟合現象,這就出現了所謂的“結構化風險”。結構風險最小化即為了防止過拟合而提出來的政策,定義模型複雜度為 J ( F ) J(F) J(F),目标函數可表示為:
m i n f ∈ F 1 n ∑ i = 1 n L ( y i , f ( x i ) ) + λ J ( F ) \underset{f\in F}{min}\, \frac{1}{n}\sum^{n}_{i=1}L(y_i,f(x_i))+\lambda J(F) f∈Fminn1i=1∑nL(yi,f(xi))+λJ(F)
例如有以上6個房價和面積關系的資料點,可以看到,當設定 f ( x ) = ∑ j = 0 5 θ j x j f(x)=\sum\limits_{j=0}^{5}\theta_jx^j f(x)=j=0∑5θjxj時,可以完美拟合訓練集資料,但是,真實情況下房價和面積不可能是這樣的關系,出現了過拟合現象。當訓練集本身存在噪聲時,拟合曲線對未知影響因素的拟合往往不是最好的。
通常,随着模型複雜度的增加,訓練誤差會減少;但測試誤差會先增加後減小。我們的最終目的時試測試誤差達到最小,這就是我們為什麼需要選取适合的目标函數的原因。
3、線性回歸的優化方法
1、梯度下降法
- 方向導數與梯度:
- 背景:以二進制舉例
TASK1 線性回歸-Linear_regression線性回歸的概念 -
∂ u ∂ l ∣ P 0 \left.\dfrac{\partial u}{\partial l}\right|_{P_0} ∂l∂u∣∣∣∣P0
= u x ′ ( P 0 ) cos α + u y ′ ( P 0 ) cos β + u z ′ ( P 0 ) cos γ =u_x^{'}(P_0)\cos\alpha+u_y^{'}(P_0)\cos\beta+u_z^{'}(P_0)\cos\gamma =ux′(P0)cosα+uy′(P0)cosβ+uz′(P0)cosγ
= ( u x ′ ( P 0 ) , u y ′ ( P 0 ) , u z ′ ( P 0 ) ) ⋅ ( cos α , cos β , cos γ ) =(u_x^{'}(P_0),u_y^{'}(P_0),u_z^{'}(P_0))\cdot(\cos\alpha,\cos\beta,\cos\gamma) =(ux′(P0),uy′(P0),uz′(P0))⋅(cosα,cosβ,cosγ)
= ∣ ( u x ′ ( P 0 ) , u y ′ ( P 0 ) , u z ′ ( P 0 ) ) ∣ ∣ ( cos α , cos β , cos γ ) ∣ cos θ =|(u_x^{'}(P_0),u_y^{'}(P_0),u_z^{'}(P_0))||(\cos\alpha,\cos\beta,\cos\gamma)|\cos \theta =∣(ux′(P0),uy′(P0),uz′(P0))∣∣(cosα,cosβ,cosγ)∣cosθ
= ∣ ( u x ′ ( P 0 ) , u y ′ ( P 0 ) , u z ′ ( P 0 ) ) ∣ cos θ =|(u_x^{'}(P_0),u_y^{'}(P_0),u_z^{'}(P_0))|\cos \theta =∣(ux′(P0),uy′(P0),uz′(P0))∣cosθ
- 其中第二步中的第一項 ( u x ′ ( P 0 ) , u y ′ ( P 0 ) , u z ′ ( P 0 ) ) (u_x^{'}(P_0),u_y^{'}(P_0),u_z^{'}(P_0)) (ux′(P0),uy′(P0),uz′(P0))是固定向量,與 l l l的方向無關;第二項 ( cos α , cos β , cos γ ) (\cos\alpha,\cos\beta,\cos\gamma) (cosα,cosβ,cosγ)為機關向量,方向與 l l l相同;
- 第二步的第一項記為梯度:記 g r a d u ∣ P 0 \left.grad\ u\right|_{P_0} grad u∣P0,即梯度為固定向量,與 l l l無關
- θ \theta θ為 g r a d u ∣ P 0 \left.grad\ u\right|_{P_0} grad u∣P0與 l l l的夾角,方向導數是小于等于梯度的
- 當 θ = 0 \theta=0 θ=0時, ∂ u ∂ l ∘ ∣ P 0 \left.\dfrac{\partial u}{\partial l^{\circ}}\right|_{P_0} ∂l∘∂u∣∣∣∣P0有最大值,即當 l l l的方向與梯度方向一緻,此時方向導數為最大或者函數增長最快,換句話說:從一點出發,沿各個方向的變化率,哪個方向的變化率最大呢哪個方向最快呢,我們稱其為梯度。
TASK1 線性回歸-Linear_regression線性回歸的概念 - 梯度下降就是讓梯度中所有偏導函數(梯度的分量)都下降到最低點的過程,都下降到最低點了,那每個未知數(或者叫次元)的最優解就得到了,是以他是解決函數最優化問題的算法,梯度下降,下降的是 θ \theta θ,梯度下降中的下降,意思是讓函數的未知數随着梯度的方向運動,什麼是梯度的方向呢?把這一點帶入到梯度函數中,結果為正,那就把這一點的值變小一些,同時就是讓梯度變小些;當這一點帶入梯度函數中的結果為負的時候,就給這一點的值增大一些.
- 背景:以二進制舉例
設定初始參數 θ \theta θ,不斷疊代,使得 J ( θ ) J(\theta) J(θ)最小化( J ( θ ) J(\theta) J(θ)為最小二乘函數):
θ j : = θ j − α ∂ J ( θ ) ∂ θ \theta_j:=\theta_j-\alpha\frac{\partial{J(\theta)}}{\partial\theta} θj:=θj−α∂θ∂J(θ)
∂ J ( θ ) ∂ θ = ∂ ∂ θ j 1 2 ∑ i = 1 n ( f θ ( x ) ( i ) − y ( i ) ) 2 = 2 ∗ 1 2 ∑ i = 1 n ( f θ ( x ) ( i ) − y ( i ) ) ∗ ∂ ∂ θ j ( f θ ( x ) ( i ) − y ( i ) ) = ∑ i = 1 n ( f θ ( x ) ( i ) − y ( i ) ) ∗ ∂ ∂ θ j ( ∑ j = 0 d θ j x j ( i ) − y ( i ) ) ) = ∑ i = 1 n ( f θ ( x ) ( i ) − y ( i ) ) x j ( i ) \frac{\partial{J(\theta)}}{\partial\theta} = \frac{\partial}{\partial\theta_j}\frac{1}{2}\sum_{i=1}^{n}(f_\theta(x)^{(i)}-y^{(i)})^2 \\ = 2*\frac{1}{2}\sum_{i=1}^{n}(f_\theta(x)^{(i)}-y^{(i)})*\frac{\partial}{\partial\theta_j}(f_\theta(x)^{(i)}-y^{(i)}) \\ = \sum_{i=1}^{n}(f_\theta(x)^{(i)}-y^{(i)})*\frac{\partial}{\partial\theta_j}(\sum_{j=0}^{d}\theta_jx_j^{(i)}-y^{(i)}))\\ = \sum_{i=1}^{n}(f_\theta(x)^{(i)}-y^{(i)})x_j^{(i)} ∂θ∂J(θ)=∂θj∂21i=1∑n(fθ(x)(i)−y(i))2=2∗21i=1∑n(fθ(x)(i)−y(i))∗∂θj∂(fθ(x)(i)−y(i))=i=1∑n(fθ(x)(i)−y(i))∗∂θj∂(j=0∑dθjxj(i)−y(i)))=i=1∑n(fθ(x)(i)−y(i))xj(i)
即:
θ j = θ j + α ∑ i = 1 n ( y ( i ) − f θ ( x ) ( i ) ) x j ( i ) \theta_j = \theta_j + \alpha\sum_{i=1}^{n}(y^{(i)}-f_\theta(x)^{(i)})x_j^{(i)} θj=θj+αi=1∑n(y(i)−fθ(x)(i))xj(i)
注:下标j表示第j個參數,上标i表示第i個資料點。
将所有的參數以向量形式表示,可得:
θ = θ + α ∑ i = 1 n ( y ( i ) − f θ ( x ) ( i ) ) x ( i ) \theta = \theta + \alpha\sum_{i=1}^{n}(y^{(i)}-f_\theta(x)^{(i)})x^{(i)} θ=θ+αi=1∑n(y(i)−fθ(x)(i))x(i)
由于這個方法中,參數在每一個資料點上同時進行了移動,是以稱為批梯度下降法(對所有樣本進行計算處理)。
- 優點:
- 1.一次疊代是對所有樣本進行計算,此時利用矩陣進行操作,實作了并行。
- 2.由全資料集确定的方向能夠更好地代表樣本總體,進而更準确地朝向極值所在的方向,且疊代次數少。當目标函數為凸函數時,BGD一定能夠得到全局最優。
- 缺點:
- 1.當樣本數目 m m m很大時,每疊代一步都需要對所有樣本計算,訓練過程會很慢。
對應的,我們可以每一次讓參數隻針對一個資料點(樣本)進行移動,即:
θ = θ + α ( y ( i ) − f θ ( x ) ( i ) ) x ( i ) \theta = \theta + \alpha(y^{(i)}-f_\theta(x)^{(i)})x^{(i)} θ=θ+α(y(i)−fθ(x)(i))x(i)
這個算法成為随機梯度下降法,随機梯度下降法的好處是,當資料點很多時,運作效率更高;缺點是,因為每次隻針對一個樣本更新參數,未必找到最快路徑達到最優值,甚至有時候會出現參數在最小值附近徘徊而不是立即收斂。但當資料量很大的時候,随機梯度下降法經常優于批梯度下降法。
mini-bach-GD:随機抽取小批量資料來做下降
當J為凸函數時,梯度下降法相當于讓參數 θ \theta θ不斷向J的最小值位置移動
梯度下降法的缺陷:如果函數為非凸函數,有可能找到的并非全局最優值,而是局部最優值。
學習率 α \alpha α:讓點沿着梯度方向下降慢慢求得最優解的過程我們叫做學習,學習率就是用來限制他每次學習别太過"用功"的,因為機器學習也存在書呆子:
左圖是我們所期望的,一個點按照梯度方向下降,慢慢逼近最低點,右圖中展示的就是那個書呆子.模型每次下降都是減去梯度的值,當這個梯度值過大的時候,點下降的step就過大了,一次性邁過了最低點,導緻函數無法找到最優解.
α \alpha α就是來限制這種情況的.我們讓梯度乘以一個很小的數,雖然增加了它到達最低點的step數,但是可以讓右圖這種情況發生機率降低.
2、最小二乘法矩陣求解(正規方程)
令
X = [ ( x ( 1 ) ) T ( x ( 2 ) ) T … ( x ( n ) ) T ] X = \left[ \begin{array} {cccc} (x^{(1)})^T\\ (x^{(2)})^T\\ \ldots \\ (x^{(n)})^T \end{array} \right] X=⎣⎢⎢⎡(x(1))T(x(2))T…(x(n))T⎦⎥⎥⎤
其中,
x ( i ) = [ x 1 ( i ) x 2 ( i ) … x d ( i ) ] x^{(i)} = \left[ \begin{array} {cccc} x_1^{(i)}\\ x_2^{(i)}\\ \ldots \\ x_d^{(i)} \end{array} \right] x(i)=⎣⎢⎢⎢⎡x1(i)x2(i)…xd(i)⎦⎥⎥⎥⎤
由于
Y = [ y ( 1 ) y ( 2 ) … y ( n ) ] Y = \left[ \begin{array} {cccc} y^{(1)}\\ y^{(2)}\\ \ldots \\ y^{(n)} \end{array} \right] Y=⎣⎢⎢⎡y(1)y(2)…y(n)⎦⎥⎥⎤
h θ ( x ) h_\theta(x) hθ(x)可以寫作
h θ ( x ) = X θ h_\theta(x)=X\theta hθ(x)=Xθ
對于向量來說,有
z T z = ∑ i z i 2 z^Tz = \sum_i z_i^2 zTz=i∑zi2
是以可以把損失函數寫作
J ( θ ) = 1 2 ( X θ − Y ) T ( X θ − Y ) J(\theta)=\frac{1}{2}(X\theta-Y)^T(X\theta-Y) J(θ)=21(Xθ−Y)T(Xθ−Y)
為最小化 J ( θ ) J(\theta) J(θ),對 θ \theta θ求導可得:
∂ J ( θ ) ∂ θ = ∂ ∂ θ 1 2 ( X θ − Y ) T ( X θ − Y ) = 1 2 ∂ ∂ θ ( θ T X T X θ − Y T X θ − θ T X T Y − Y T Y ) \frac{\partial{J(\theta)}}{\partial\theta} = \frac{\partial}{\partial\theta} \frac{1}{2}(X\theta-Y)^T(X\theta-Y) \\ = \frac{1}{2}\frac{\partial}{\partial\theta} (\theta^TX^TX\theta - Y^TX\theta-\theta^T X^TY - Y^TY) ∂θ∂J(θ)=∂θ∂21(Xθ−Y)T(Xθ−Y)=21∂θ∂(θTXTXθ−YTXθ−θTXTY−YTY)
中間兩項互為轉置,由于求得的值是個标量,矩陣與轉置相同,是以可以寫成
∂ J ( θ ) ∂ θ = 1 2 ∂ ∂ θ ( θ T X T X θ − 2 θ T X T Y − Y T Y ) \frac{\partial{J(\theta)}}{\partial\theta} = \frac{1}{2}\frac{\partial}{\partial\theta} (\theta^TX^TX\theta - 2\theta^T X^TY - Y^TY) ∂θ∂J(θ)=21∂θ∂(θTXTXθ−2θTXTY−YTY)
令偏導數等于零,由于最後一項和 θ \theta θ無關,偏導數為0。
是以,
∂ J ( θ ) ∂ θ = 1 2 ∂ ∂ θ θ T X T X θ − ∂ ∂ θ θ T X T Y \frac{\partial{J(\theta)}}{\partial\theta} = \frac{1}{2}\frac{\partial}{\partial\theta} \theta^TX^TX\theta - \frac{\partial}{\partial\theta} \theta^T X^TY ∂θ∂J(θ)=21∂θ∂θTXTXθ−∂θ∂θTXTY
利用矩陣求導性質(這裡主要用到标量對向量求導,一般是分母布局,因為損失函數是一個實值函數),
∂ x ⃗ T α ∂ x ⃗ = α \frac{\partial \vec x^T\alpha}{\partial \vec x} =\alpha ∂x
∂x
Tα=α
和 和 和
∂ A T B ∂ x ⃗ = ∂ A T ∂ x ⃗ B + ∂ B T ∂ x ⃗ A \frac{\partial A^TB}{\partial \vec x} = \frac{\partial A^T}{\partial \vec x}B + \frac{\partial B^T}{\partial \vec x}A ∂x
∂ATB=∂x
∂ATB+∂x
∂BTA
∂ ∂ θ θ T X T X θ = ∂ ∂ θ ( X θ ) T X θ = ∂ ( X θ ) T ∂ θ X θ + ∂ ( X θ ) T ∂ θ X θ = 2 X T X θ \frac{\partial}{\partial\theta} \theta^TX^TX\theta = \frac{\partial}{\partial\theta}{(X\theta)^TX\theta}\\ = \frac{\partial (X\theta)^T}{\partial\theta}X\theta + \frac{\partial (X\theta)^T}{\partial\theta}X\theta \\ = 2X^TX\theta ∂θ∂θTXTXθ=∂θ∂(Xθ)TXθ=∂θ∂(Xθ)TXθ+∂θ∂(Xθ)TXθ=2XTXθ
此步求導用微分法: d ( t r ( θ T X T X θ ) ) = t r ( d ( θ T ) X T X θ + θ T X T X d ( θ ) ) = t r ( d ( θ T ) X T X θ ) + t r ( θ T X T X d ( θ ) ) = t r ( ( d θ ) T X T X θ ) + t r ( θ T X T X d θ ) = t r ( θ T X X T d θ ) + t r ( θ T X T X d θ ) = t r ( 2 θ T X X T d θ ) d(tr(\theta^TX^TX\theta)) = tr(d(\theta^T)X^TX\theta+\theta^TX^TXd(\theta))=tr(d(\theta^T)X^TX\theta)+tr(\theta^TX^TXd(\theta))=tr((d\theta)^TX^TX\theta)+tr(\theta^TX^TXd\theta)=tr(\theta^TXX^Td\theta)+tr(\theta^TX^TXd\theta)=tr(2\theta^TXX^Td\theta) d(tr(θTXTXθ))=tr(d(θT)XTXθ+θTXTXd(θ))=tr(d(θT)XTXθ)+tr(θTXTXd(θ))=tr((dθ)TXTXθ)+tr(θTXTXdθ)=tr(θTXXTdθ)+tr(θTXTXdθ)=tr(2θTXXTdθ),即 ∂ ∂ θ ( θ T X T X θ ) = ( 2 θ T X X T ) T = 2 X T X θ \frac{\partial}{\partial\theta} (\theta^TX^TX\theta)=(2\theta^TXX^T)^T=2X^TX\theta ∂θ∂(θTXTXθ)=(2θTXXT)T=2XTXθ
第二個等于用到了微分轉置 d ( X T ) = ( d X ) T d(X^T)=(dX)^T d(XT)=(dX)T,第三個等于用到了迹的轉置不變 t r ( A T ) = t r ( A ) tr(A^T)=tr(A) tr(AT)=tr(A)
向量,矩陣之間求導可以參考:https://www.cnblogs.com/pinard/p/10750718.html
∂ J ( θ ) ∂ θ = X T X θ − X T Y \frac{\partial{J(\theta)}}{\partial\theta} = X^TX\theta - X^TY ∂θ∂J(θ)=XTXθ−XTY
令導數等于零,
X T X θ = X T Y X^TX\theta = X^TY XTXθ=XTY
θ = ( X T X ) ( − 1 ) X T Y \theta = (X^TX)^{(-1)}X^TY θ=(XTX)(−1)XTY
注:CS229視訊中吳恩達的推導利用了矩陣迹的性質,可自行參考學習。
3、牛頓法
通過圖例可知(參考吳恩達CS229),
f ( θ ) ′ = f ( θ ) Δ , Δ = θ 0 − θ 1 f(\theta)' = \frac{f(\theta)}{\Delta},\Delta = \theta_0 - \theta_1 f(θ)′=Δf(θ),Δ=θ0−θ1
可 求 得 , θ 1 = θ 0 − f ( θ 0 ) f ( θ 0 ) ′ 可求得,\theta_1 = \theta_0 - \frac {f(\theta_0)}{f(\theta_0)'} 可求得,θ1=θ0−f(θ0)′f(θ0)
重複疊代,可以讓逼近取到 f ( θ ) f(\theta) f(θ)的最小值
當我們對損失函數 l ( θ ) l(\theta) l(θ)進行優化的時候,實際上是想要取到 l ′ ( θ ) l'(\theta) l′(θ)的最小值,是以疊代公式為:
θ : = θ − l ′ ( θ ) l ′ ′ ( θ ) \theta :=\theta-\frac{l'(\theta)}{l''(\theta)} θ:=θ−l′′(θ)l′(θ)
當 θ 是 向 量 值 的 時 候 , θ : = θ − H − 1 Δ θ l ( θ ) 當\theta是向量值的時候,\theta :=\theta - H^{-1}\Delta_{\theta}l(\theta) 當θ是向量值的時候,θ:=θ−H−1Δθl(θ)
其中, Δ θ l ( θ ) \Delta_{\theta}l(\theta) Δθl(θ)是 l ( θ ) l(\theta) l(θ)對 θ i \theta_i θi的偏導數, H H H是 J ( θ ) J(\theta) J(θ)的海森矩陣,
H i j = ∂ 2 l ( θ ) ∂ θ i ∂ θ j H_{ij} = \frac{\partial ^2l(\theta)}{\partial\theta_i\partial\theta_j} Hij=∂θi∂θj∂2l(θ)
問題:請用泰勒展開法推導牛頓法公式。
Answer:将 f ( x ) f(x) f(x)用泰勒公式在 x 0 x_0 x0處展開到第二階,
f ( x ) = f ( x 0 ) + f ′ ( x 0 ) ( x − x 0 ) + 1 2 f ′ ′ ( x 0 ) ( x − x 0 ) 2 f(x) = f(x_0) + f'(x_0)(x - x_0)+\frac{1}{2}f''(x_0)(x - x_0)^2 f(x)=f(x0)+f′(x0)(x−x0)+21f′′(x0)(x−x0)2
寫成定義中的形式就是: f ( x ) = f ( x ( k ) ) + g k T ( x − x ( k ) ) + 1 2 ( x − x ( k ) ) T H ( x ( x ) ) ( x − x ( k ) ) f(x)=f(x^{(k)})+g_k^T(x-x^{(k)})+\frac{1}{2}(x-x^{(k)})^TH(x^{(x)})(x-x^{(k)}) f(x)=f(x(k))+gkT(x−x(k))+21(x−x(k))TH(x(x))(x−x(k)),其中 g k T g_k^T gkT就是 f ( x ) f(x) f(x)梯度向量在 x ( k ) x^{(k)} x(k)處的值, H ( x ( x ) ) H(x^{(x)}) H(x(x))就是海森矩陣,要想讓 f ( x ) f(x) f(x)有極小值的必要條件就是:1.有使得一階導數等于0的點,2.二階導數在該點大于0(極小值的原因,微積分中判定方法之一),重點就在于解第一個條件:使 f ( x ) f(x) f(x)梯度為0的點,即 ∇ f ( x ) = g k + H ( x ( k ) ) ( x − x ( k ) ) = 0 \nabla f(x)=g_k+H(x^{(k)})(x-x^{(k)})=0 ∇f(x)=gk+H(x(k))(x−x(k))=0,各項次元為 n ∗ 1 , n ∗ n , n ∗ 1 n*1 , n*n , n*1 n∗1,n∗n,n∗1,得 x = x ( k ) − H k − 1 g k = x ( k ) + p k x=x^{(k)}-H_k^{-1}g_k=x^{(k)}+p_k x=x(k)−Hk−1gk=x(k)+pk,即可以寫成 x ( k + 1 ) = x ( k ) − H k − 1 g k = x ( k ) + p k x^{(k+1)}=x^{(k)}-H_k^{-1}g_k=x^{(k)}+p_k x(k+1)=x(k)−Hk−1gk=x(k)+pk,這裡的 x ( k + 1 ) x^{(k+1)} x(k+1)就是 x x x
對上式求導,并令導數等于0,求得x值
f ′ ( x ) = f ′ ( x 0 ) + f ′ ′ ( x 0 ) x − f ′ ′ ( x 0 ) x 0 = 0 f'(x) = f'(x_0) + f''(x_0)x -f''(x_0)x_0 = 0 f′(x)=f′(x0)+f′′(x0)x−f′′(x0)x0=0
可以求得,
x = x 0 − f ′ ( x 0 ) f ′ ′ ( x 0 ) x = x_0 - \frac{f'(x_0)}{f''(x_0)} x=x0−f′′(x0)f′(x0)
牛頓法的收斂速度非常快,但海森矩陣的計算較為複雜,尤其當參數的次元很多時,會耗費大量計算成本。我們可以用其他矩陣替代海森矩陣,用拟牛頓法進行估計,
牛頓法算法步驟:
輸入:目标函數 f ( x ) f(x) f(x),梯度 g ( x ) = ∇ f ( x ) g(x)=\nabla f(x) g(x)=∇f(x),海森矩陣 H ( x ) H(x) H(x),精度要求 ϵ \epsilon ϵ
輸出: f ( x ) f(x) f(x)的極小點 x ∘ x^{\circ} x∘
1.取初始點 x ( 0 ) x^{(0)} x(0),置 k = 0 k=0 k=0
2.計算 g k = g ( x ( k ) ) g_k=g(x^{(k)}) gk=g(x(k)),(直接算,代入到梯度中,不是到那個推導極小值點的式子裡)
3.若 ∣ ∣ g k ∣ ∣ < ϵ ||g_k||<\epsilon ∣∣gk∣∣<ϵ,則停止計算,得近似解 x ∘ = x ( k ) x^{\circ}=x^{(k)} x∘=x(k)
4.計算 H k = H ( x ( k ) ) H_k=H(x^{(k)}) Hk=H(x(k)),并求 p k p_k pk, H k p k = − g k H_kp_k=-g_k Hkpk=−gk
5.置 x ( k + 1 ) = x ( k ) + p k x^{(k+1)}=x^{(k)}+p_k x(k+1)=x(k)+pk
6.置 k = k + 1 k=k+1 k=k+1,轉2
4、拟牛頓法
拟牛頓法的思路是用一個矩陣替代計算複雜的海森矩陣H,是以要找到符合H性質的矩陣。
要求得海森矩陣符合的條件,同樣對泰勒公式求導 f ′ ( x ) = f ′ ( x 0 ) + f ′ ′ ( x 0 ) x − f ′ ′ ( x 0 ) x 0 f'(x) = f'(x_0) + f''(x_0)x -f''(x_0)x_0 f′(x)=f′(x0)+f′′(x0)x−f′′(x0)x0
令 x = x 1 x = x_1 x=x1,即疊代後的值,代入可得:
f ′ ( x 1 ) = f ′ ( x 0 ) + f ′ ′ ( x 0 ) x 1 − f ′ ′ ( x 0 ) x 0 f'(x_1) = f'(x_0) + f''(x_0)x_1 - f''(x_0)x_0 f′(x1)=f′(x0)+f′′(x0)x1−f′′(x0)x0
更一般的,
f ′ ( x k + 1 ) = f ′ ( x k ) + f ′ ′ ( x k ) x k + 1 − f ′ ′ ( x k ) x k f'(x_{k+1}) = f'(x_k) + f''(x_k)x_{k+1} - f''(x_k)x_k f′(xk+1)=f′(xk)+f′′(xk)xk+1−f′′(xk)xk
f ′ ( x k + 1 ) − f ′ ( x k ) = f ′ ′ ( x k ) ( x k + 1 − x k ) = H ( x k + 1 − x k ) f'(x_{k+1}) - f'(x_k) = f''(x_k)(x_{k+1}- x_k)= H(x_{k+1}- x_k) f′(xk+1)−f′(xk)=f′′(xk)(xk+1−xk)=H(xk+1−xk)
x k x_k xk為第k個疊代值
即找到矩陣G,使得它符合上式。
常用的拟牛頓法的算法包括DFP,BFGS等,作為選學内容,有興趣者可自行查詢材料學習。
DFP:用 G k G_k Gk代替 H − 1 H^-1 H−1
BFGS:用 G k G_k Gk代替 H H H
DFP
∇ f ( x ) = g k + H ( x ( k ) ) ( x − x ( k ) ) \nabla f(x)=g_k+H(x^{(k)})(x-x^{(k)}) ∇f(x)=gk+H(x(k))(x−x(k))
當 x = x ( k + 1 ) x=x^{(k+1)} x=x(k+1),即 g k + 1 = g k + H k ( x ( k + 1 ) − x ( k ) ) g_{k+1}=g_k+H_k(x^{(k+1)}-x^{(k)}) gk+1=gk+Hk(x(k+1)−x(k))
記: y k = g k + 1 − g k y_k = g_{k+1}-g_k yk=gk+1−gk
σ k = x ( k + 1 ) − x ( k ) \sigma_k=x^{(k+1)}-x^{(k)} σk=x(k+1)−x(k)
得: y k = H k σ k y_k=H_k\sigma_k yk=Hkσk
H k − 1 y k = σ k H_k^{-1}y_k=\sigma_k Hk−1yk=σk,則稱其為拟牛頓條件, G k G_k Gk代替 H k H_k Hk還需要滿足一個條件就是正定
是以,就是要找一個 G k G_k Gk滿足正定和拟牛頓法的兩個條件,每次疊代代入就可以了
設 G k + 1 = G k + p k + Q k G_{k+1}=G_k+p_k+Q_k Gk+1=Gk+pk+Qk
兩邊同乘 y k y_k yk得: G k + 1 y k = G k y k + p k y k + Q k y k G_{k+1}y_k=G_ky_k+p_ky_k+Q_ky_k Gk+1yk=Gkyk+pkyk+Qkyk
令: p k y k = σ k , Q k y k = − G k y k p_ky_k=\sigma_k,Q_ky_k=-G_ky_k pkyk=σk,Qkyk=−Gkyk
得: p k = σ k σ k t σ k T y k , Q k = − G k y k y k T G k y k T G k y k p_k=\frac{\sigma_k \sigma_k^t}{\sigma_k^T y_k},Q_k=-\frac{G_k y_ky_k^TG_k}{y_k^TG_ky_k} pk=σkTykσkσkt,Qk=−ykTGkykGkykykTGk
即: G k + 1 = G k + σ k σ k t σ k T y k − G k y k y k T G k y k T G k y k G_{k+1}=G_k+\frac{\sigma_k \sigma_k^t}{\sigma_k^T y_k}-\frac{G_k y_ky_k^TG_k}{y_k^TG_ky_k} Gk+1=Gk+σkTykσkσkt−ykTGkykGkykykTGk
若初始矩陣 G 0 G_0 G0是正定,可得 G k G_k Gk都是正定的
算法流程:
輸入:目标函數 f ( x ) f(x) f(x),梯度 g ( x ) = ∇ f ( x ) g(x)=\nabla f(x) g(x)=∇f(x),海森矩陣 H ( x ) H(x) H(x),精度要求 ϵ \epsilon ϵ
輸出: f ( x ) f(x) f(x)的極小點 x ∘ x^{\circ} x∘
1.初始點 x ( 0 ) x^{(0)} x(0), G 0 G_0 G0為正定矩陣, k = 0 k=0 k=0
2.計算 g k g_k gk
3.若 ∣ ∣ g k ∣ ∣ < ϵ ||g_k||<\epsilon ∣∣gk∣∣<ϵ,則停止計算,得近似解 x ∘ = x ( k ) x^{\circ}=x^{(k)} x∘=x(k)
4.計算 p k = − G k g k p_k=-G_kg_k pk=−Gkgk,一維搜尋: f ( x ( k ) + λ k p k ) = min λ ≥ 0 f ( x ( k ) + λ k p k ) f(x^{(k)}+\lambda_kp_k)=\min\limits_{\lambda \geq 0}f(x^{(k)}+\lambda_kp_k) f(x(k)+λkpk)=λ≥0minf(x(k)+λkpk),用正定對稱矩陣近似海森矩陣時,隻知道下降方向是對的,但是不知道下降多少,是以進行一維搜尋,雖然帶來時間複雜度,但也比遠遠小于直接求逆
5.置 x ( k + 1 ) = x ( k ) + λ k p k x^{(k+1)}=x^{(k)}+\lambda_kp_k x(k+1)=x(k)+λkpk
6.置 k = k + 1 k=k+1 k=k+1,轉2
BFGS:
用 B k → H B_k \rightarrow H Bk→H,拟牛頓條件就是 B k + 1 σ k = y k B_{k+1}\sigma_k=y_k Bk+1σk=yk
B k + 1 = B k + p k σ k + Q k σ k B_{k+1}={B_k}+p_k\sigma_k+Q_k\sigma_k Bk+1=Bk+pkσk+Qkσk
p k σ k = y k , Q k σ k = − B k σ k p_k\sigma_k=y_k,Q_k\sigma_k=-B_k\sigma_k pkσk=yk,Qkσk=−Bkσk代入上面式子
B k + 1 = B k + y k y k T y k T σ k − B k σ k σ k T B k σ k T b k σ k B_{k+1}=B_k+\frac{y_k y_k^T}{y_k^T\sigma_k}-\frac{B_k \sigma_k\sigma_k^TB_k}{\sigma_k^Tb_k\sigma_k} Bk+1=Bk+ykTσkykykT−σkTbkσkBkσkσkTBk
若 B 0 B_0 B0正定, B k B_k Bk都是正定的
4、線性回歸的評價名額
均方誤差(MSE): 1 m ∑ i = 1 m ( y ( i ) − y ^ ( i ) ) 2 \frac{1}{m}\sum^{m}_{i=1}(y^{(i)} - \hat y^{(i)})^2 m1∑i=1m(y(i)−y^(i))2
均方根誤差(RMSE): M S E = 1 m ∑ i = 1 m ( y ( i ) − y ^ ( i ) ) 2 \sqrt{MSE} = \sqrt{\frac{1}{m}\sum^{m}_{i=1}(y^{(i)} - \hat y^{(i)})^2} MSE
=m1∑i=1m(y(i)−y^(i))2
平均絕對誤差(MAE):$\frac{1}{m}\sum^{m}_{i=1} | (y^{(i)} - \hat y^{(i)} | $
但以上評價名額都無法消除量綱不一緻而導緻的誤內插補點差别大的問題,最常用的名額是 R 2 R^2 R2,可以避免量綱不一緻問題
R 2 : = 1 − ∑ i = 1 m ( y ( i ) − y ^ ( i ) ) 2 ∑ i = 1 m ( y ˉ − y ^ ( i ) ) 2 = 1 − 1 m ∑ i = 1 m ( y ( i ) − y ^ ( i ) ) 2 1 m ∑ i = 1 m ( y ˉ − y ^ ( i ) ) 2 = 1 − M S E V A R R^2: = 1-\frac{\sum^{m}_{i=1}(y^{(i)} - \hat y^{(i)})^2}{\sum^{m}_{i=1}(\bar y - \hat y^{(i)})^2} =1-\frac{\frac{1}{m}\sum^{m}_{i=1}(y^{(i)} - \hat y^{(i)})^2}{\frac{1}{m}\sum^{m}_{i=1}(\bar y - \hat y^{(i)})^2} = 1-\frac{MSE}{VAR} R2:=1−∑i=1m(yˉ−y^(i))2∑i=1m(y(i)−y^(i))2=1−m1∑i=1m(yˉ−y^(i))2m1∑i=1m(y(i)−y^(i))2=1−VARMSE
我們可以把 R 2 R^2 R2了解為,回歸模型可以成功解釋的資料方差部分在資料固有方差中所占的比例, R 2 R^2 R2越接近1,表示可解釋力度越大,模型拟合的效果越好。
5、sklearn.linear_model參數詳解:
fit_intercept : 預設為True,是否計算該模型的截距。如果使用中心化的資料,可以考慮設定為False,不考慮截距。注意這裡是考慮,一般還是要考慮截距
normalize: 預設為false. 當fit_intercept設定為false的時候,這個參數會被自動忽略。如果為True,回歸器會标準化輸入參數:減去平均值,并且除以相應的二範數。當然啦,在這裡還是建議将标準化的工作放在訓練模型之前。通過設定sklearn.preprocessing.StandardScaler來實作,而在此處設定為false
copy_X : 預設為True, 否則X會被改寫
n_jobs: int 預設為1. 當-1時預設使用全部CPUs ??(這個參數有待嘗試)
可用屬性:
coef_:訓練後的輸入端模型系數,如果label有兩個,即y值有兩列。那麼是一個2D的array
intercept_: 截距
可用的methods:
fit(X,y,sample_weight=None):
X: array, 稀疏矩陣 [n_samples,n_features]
y: array [n_samples, n_targets]
sample_weight: 權重 array [n_samples]
在版本0.17後添加了sample_weight
get_params(deep=True): 傳回對regressor 的設定值
predict(X): 預測 基于 R^2值
score: 評估
參考https://blog.csdn.net/weixin_39175124/article/details/79465558
生成資料
#生成資料
import numpy as np
#生成随機數
np.random.seed(1234)
x = np.random.rand(500,2) # 生成500*3的每個元素不超過1的正小數
# 建構映射關系,模拟真實的資料待預測值,映射關系為y = 4.2 + 5.7*x1 + 10.8*x2,可自行設定值進行嘗試
# 原檔案這裡有錯誤
y = x.dot(np.array([5.7,10.8])) + 4.2
x.shape, y.shape
((500, 2), (500,))
np中矩陣乘法
# 一維向量和一維向量
e = np.array([1, 2, 3])
f = np.array([4, 5, 6])
print(e * f) # 對應位置相乘但不相加求和
print(np.inner(e, f)) # 算内積為32 對應位置的元素相乘相加求和
# 對于兩個一維向量相當于求内積
print(np.dot(e, f)) # 32
print(np.dot(e, f.T)) # 32
print(np.dot(e.T, f)) # 32
print(np.dot(e.T, f.T)) # 32
# 對于兩個一維向量相當于求内積
print(e @ f) # 32
print(e @ f.T) # 32
print(e.T @ f) # 32
print(e.T @ f.T) # 32
# 下面來解釋一下為什麼.T和沒有都是一樣,是因為直接用.T并沒有将行向量轉為列向量
print(e.T) # 沒變
print(np.array([e]).T) # 先變二維,再轉置,ok
print(e.reshape(1, -1).T) # ok
[ 4 10 18]
32
32
32
32
32
32
32
32
32
[1 2 3]
[[1]
[2]
[3]]
[[1]
[2]
[3]]
二維矩陣和一維向量
m = np.array([[1, 2], [3, 4]])
n = np.array([1, 2])
# 每一行對應的元素與向量相乘求和,作為結果各元素,組成行向量
print(np.inner(m, n)) # [ 5 11] 其實就是将n轉置,然後m乘以n的轉置,最後再轉置為行
# dot()相當于inner()
print(m.dot(n)) # [ 5 11] 相當于把向量轉置變成2*1,按矩陣乘法規則,最後再轉置變成1*2
# 相當于inner()
print(m @ n) # [ 5 11] 同上
# 每一行對應的元素與向量相乘求但不求和,分别作為結果各元素,組成行向量
print(m * n) # [[1, 4], [3, 8]]
# 反過來
print(np.inner(n, m)) # 還是求内積 将m轉置,和之前一樣,結果為行,就不需要轉置
print(n.dot(m)) # 矢量乘法,此時是 1*2的向量和2*2的矩陣相乘,是以結果為1*2,[ 7 10]
print(n @ m) # 矢量乘法,同上
print(n * m) # 這個還是數量積 [[1, 4], [3, 8]]
[ 5 11]
[ 5 11]
[ 5 11]
[[1 4]
[3 8]]
[ 5 11]
[ 7 10]
[ 7 10]
[[1 4]
[3 8]]
二維矩陣和二維矩陣
a = np.array([[1, 2], [3, 4]])
b = np.array([[4, 3], [2, 1]])
# array
print(a * b) # 各位置相乘 數量積(即對應位置元素相乘)
print(np.multiply(a, b)) # 數量積
print(a @ b) # 按矩陣規則乘 矢量乘法
print(a.dot(b)) # 按矩陣規則乘 矢量乘法
print(np.inner(a, b)) # [[10 4], [24 10]] 将b轉置,得到的結果
# matrix
c = np.matrix([[1,2],[3,4]])
d = np.matrix([[4,3],[2,1]])
print(np.multiply(c, d)) # 各位置相乘 數量積(即對應位置元素相乘後的積相加)
print(c * d) # 矢量乘法
print(c @ d) # 按矩陣規則乘
print(c.dot(d)) # 按矩陣規則乘 矢量乘法
print(np.inner(c, d)) # [[10 4], [24 10]] 将d轉置,得到的結果
g = np.matrix([1, 2, 3])
h = np.matrix([4, 5, 6])
print(g @ h.T) # 傳回的是矩陣 [[32]]
[[4 6]
[6 4]]
[[4 6]
[6 4]]
[[ 8 5]
[20 13]]
[[ 8 5]
[20 13]]
[[10 4]
[24 10]]
[[4 6]
[6 4]]
[[ 8 5]
[20 13]]
[[ 8 5]
[20 13]]
[[ 8 5]
[20 13]]
[[10 4]
[24 10]]
[[32]]
1、先嘗試調用sklearn的線性回歸模型訓練資料
import numpy as np
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt
%matplotlib inline
# 調用模型
lr = LinearRegression(fit_intercept=True)
# 訓練模型
lr.fit(x, y)
print("估計的參數值為:%s" %(lr.coef_))
# 計算R平方
print('R2:%s' %(lr.score(x,y)))
# 任意設定變量,預測目标值
x_test = np.array([4,5]).reshape(1,-1)
y_hat = lr.predict(x_test)
print("預測值為: %s" %(y_hat))
估計的參數值為:[ 5.7 10.8]
R2:1.0
預測值為: [81.]
2、最小二乘法的矩陣求解(正規方程)
class LR_LS():
def __init__(self):
self.w = None
def fit(self, X, y):
# 最小二乘法矩陣求解
#============================= show me your code =======================
self.w = np.linalg.inv(X.T.dot(X)).dot(X.T).dot(y)
#============================= show me your code =======================
def predict(self, X):
# 用已經拟合的參數值預測新自變量
#============================= show me your code =======================
y_pred = X.dot(self.w)
#============================= show me your code =======================
return y_pred
if __name__ == "__main__":
lr_ls = LR_LS()
lr_ls.fit(x,y)
print("估計的參數值:%s" %(lr_ls.w))
x_test = np.array([4,5]).reshape(1,-1)
print("預測值為: %s" %(lr_ls.predict(x_test)))
估計的參數值:[ 9.09571334 14.41433265]
預測值為: [108.45451663]
3、梯度下降法(BGD)
class LR_GD():
def __init__(self):
self.w = None
def fit(self, X, y, alpha=0.02, loss=1e-10): # 設定步長為0.002,判斷是否收斂的條件為1e-10
y = y.reshape(-1,1) #重塑y值的次元以便矩陣運算
[m, d] = np.shape(X) #自變量的次元
self.w = np.zeros((d)) #将參數的初始值定為0
tol = 1e5
#============================= show me your code =======================
while tol > loss:
h_f = X.dot(self.w).reshape(-1,1)
theta = self.w + alpha * np.mean(X * (y - h_f),axis=0) #計算疊代的參數值
# axis=0 ,每行
tol = np.sum(np.abs(theta - self.w))
self.w = theta # 同時更新
#============================= show me your code =======================
def predict(self, X):
# 用已經拟合的參數值預測新自變量
y_pred = X.dot(self.w)
return y_pred
if __name__ == "__main__":
lr_gd = LR_GD()
lr_gd.fit(x,y)
print("估計的參數值為:%s" %(lr_gd.w))
x_test = np.array([4,5]).reshape(1,-1)
print("預測值為:%s" %(lr_gd.predict(x_test)))
估計的參數值為:[ 9.09571337 14.41433262]
預測值為:[108.4545166]
4.mini-batch
class LR_GD_M():
def __init__(self):
self.w = None # 參數
self.k = 0 # m的下标
def fit(self, X, y, alpha=0.02, loss=1e-10):
y = y.reshape(-1, 1) # 變成列向量
[m, d] = np.shape(X)
self.w = np.zeros((d))
tol = 1e5
while tol > loss:
if self.k < len(y):
# 抽10個
# 抽取小批量的資料
train_size = x.shape[0]
batch_size = 10 # 抽10個
batch_mask = np.random.choice(train_size, batch_size) # 從6000個資料中随機抽取10個 獲得其索引
x_batch = x[batch_mask] # 通過索引取出該值
y_batch = y[batch_mask] # 通過索引去除該監督值
h_f = x_batch.dot(self.w).reshape(-1, 1)
theta = self.w + alpha * np.sum(x_batch * (y_batch - h_f), axis=0)
# h_f = X[self.k:self.k+100,:].dot(self.w).reshape(-1, 1)
# theta = self.w + alpha * np.sum(X[self.k:self.k+100] * (y[self.k:self.k+100] - h_f), axis=0)
tol = np.sum(np.abs(theta - self.w))
self.w = theta
self.k += 10
else:
break
def predict(self, X):
# 用已經拟合的參數值預測新自變量
y_pred = X.dot(self.w)
return y_pred
if __name__ == "__main__":
lr_gd_m = LR_GD_M()
lr_gd_m.fit(x,y)
print("估計的參數值為:%s" %(lr_gd_m.w))
x_test = np.array([4,5]).reshape(1,-1)
print("預測值為:%s" %(lr_gd_m.predict(x_test)))
估計的參數值為:[10.42892327 13.28206545]
預測值為:[108.1260203]
最後針對極大似然估計,再來補充一下經典貝葉斯公式:
p ( ω ∣ x ) = p ( x ∣ ω ) p ( ω ) p ( x ) p(\omega|x)=\frac{p(x|\omega)p(\omega)}{p(x)} p(ω∣x)=p(x)p(x∣ω)p(ω)
其中:
p ( ω ) p(\omega) p(ω):為先驗機率,表示每種類别分布的機率;
p ( x ∣ ω ) p(x|\omega) p(x∣ω):為類條件機率,表示在某種類别前提下,某事發生的機率;
p ( ω ∣ x ) p(\omega|x) p(ω∣x):為後驗機率,表示某事發生了,并且它屬于某一類别的機率,有了這個後驗機率,我們就可以對樣本進行分類。後驗機率越大,說明某事物屬于這個類别的可能性越大,我們越有理由把它歸到這個類别下。
舉例:
**已知:**在夏季,某公園男性穿涼鞋的機率為 1 / 2 1/2 1/2,女性穿涼鞋的機率為 2 / 3 2/3 2/3,并且該公園中男女比例通常為2:1,**問題:**若你在公園中随機遇到一個穿涼鞋的人,請問他的性别為男性或女性的機率分别為多少?
從問題看,就是上面講的,某事發生了,它屬于某一類别的機率是多少?即後驗機率。
設: ω 1 = \omega_1= ω1=男性, ω 2 = \omega_2= ω2=女性, x = x= x=穿涼鞋
由已知可知:
先驗機率 p ( ω 1 ) = 2 / 3 , p ( ω 2 ) = 1 / 3 p(\omega_1)=2/3,p(\omega_2)=1/3 p(ω1)=2/3,p(ω2)=1/3
類條件機率 p ( x ∣ ω 1 ) = 1 / 2 , p ( x ∣ ω 2 ) = 2 / 3 p(x|\omega_1)=1/2,p(x|\omega_2)=2/3 p(x∣ω1)=1/2,p(x∣ω2)=2/3
男性和女性穿涼鞋互相獨立,是以
p ( x ) = p ( x ∣ ω 1 ) p ( ω 1 ) + p ( x ∣ ω 2 ) p ( ω 2 ) = 5 / 9 p(x)=p(x|\omega_1)p(\omega_1)+p(x|\omega_2)p(\omega_2)=5/9 p(x)=p(x∣ω1)p(ω1)+p(x∣ω2)p(ω2)=5/9
p ( ω 1 ∣ x ) = p ( x ∣ ω 1 ) p ( ω 1 ) p ( x ) = 3 / 5 p(\omega_1|x)=\frac{p(x|\omega_1)p(\omega_1)}{p(x)}=3/5 p(ω1∣x)=p(x)p(x∣ω1)p(ω1)=3/5
p ( ω 2 ∣ x ) = p ( x ∣ ω 2 ) p ( ω 2 ) p ( x ) = 2 / 5 p(\omega_2|x)=\frac{p(x|\omega_2)p(\omega_2)}{p(x)}=2/5 p(ω2∣x)=p(x)p(x∣ω2)p(ω2)=2/5
參考
吳恩達 CS229課程
周志華 《機器學習》
李航 《統計學習方法》
https://hangzhou.anjuke.com/
https://www.jianshu.com/p/e0eb4f4ccf3e
https://blog.csdn.net/qq_28448117/article/details/79199835
https://blog.csdn.net/weixin_39175124/article/details/79465558
https://blog.csdn.net/zengxiantao1994/article/details/72787849