第三周筆記:邏輯回歸及正則化

這周學的是「邏輯回歸演算法」(分類演算法)

在這個演算法里,我們的假設函數h(x)長這樣:h(x)=frac{1}{1+e^{-theta^T*X} }

簡化一下,把theta^T*X叫做Z,那麼原函數就變成了g(z)=frac{1}{1+e^{-z} }

圖示如下:

是不是感覺長得很像累計分布函數啊……

(第二個圖是累計分布函數的)

嗯。反正差不多,所以高數的知識可以直接拿過來用了。

邏輯回歸演算法,計算目的是為了分類。按照圖中所示,當z>0的時候,g(z)大於0.5,那麼假如你要分類,1為在某類,0為不在某類,那g(z)四捨五入就是1個1……。同理,z<0時,g(z)<0.5,四捨五入到0……(當然實際不是這麼做的,實際做法是用數學方法使z的絕對值超過一個界限,使得g(z)和1或者0很近。)

我們可以把g(z)=0.5,也就是z=0的時候,稱為決策邊界。假設y為結果,y的值是1或者0。

那麼,z=0,也就是theta^T*X=0的時候為邊界。theta^T*Xgeq 0時y=1。theta^T*X< 0時y=0。分類就靠這個……

然後繼續,機器學習嘛,根據前兩周的經驗,肯定有那個J,代價函數。邏輯回歸演算法的代價函數如下:

J=1/m*sum_{i=1}^{m}({h(x_i)-y_i} )^2(m是y總數,嫌麻煩的話,和第二周一樣,如果你把那個加和符號去掉,那麼這裡x和y就變成向量了也就是:J=1/m*({h(x)-y} ).^2。)

然後因為y只有0和1兩個取值,這裡就可以分兩種情況討論,讓y從函數中去掉:

y=0:J=1/m*sum_{1}^{m}({h(x)-0} )^2

y=1:J=1/m*sum_{1}^{m}({h(x)-1} )^2

然而我們發現,這樣拿出來的函數,因為y一會兒是1,一會兒是0,得到的圖像如下(左邊的)然而左邊的凹凸不平(非凸),不方便梯度下降,我們想要的是右邊那種滑溜溜(凸)的圖像。:

所以我們假設有個函數cost,cost=(h(x),y)

原函數J變成了J=1/m*sum_{1}^{m}(cost(h(x),y)

反正我們要的是cost=(h(x),y)符合決策邊界的條件就可以了,反正都把結果四捨五入成1或者0了,也沒必要非得是某個函數對吧?

所以它是什麼函數無所謂。只要(它的函數處理了x以後,得到的y)符合決策邊界的條件即可。而現在我們希望得到一個滑溜溜的凸函數。那麼我們就假設(注意,這是假設出來的,符合條件的函數之一,沒說非得這樣。然而這是已有的函數中最好的。):

y=1的時候,cost=(h(x),y)=-log(h(x))

y=0的時候,cost=(h(x),y)=-log(1-h(x))

它們的圖像如下:

符合條件。那麼這時候還有一個問題,大家都很懶對吧,懶得分情況討論,那麼如何做呢?

你看,由於y只有1和0兩個值,所以我們就直接把兩種情況的cost函數相加,然後分別乘以y和y-1即可:

cost=(h(x),y)=-y*log(h(x))+(y-1)log(1-h(x))

看,是不是很方便呢?

於是原來的那個代價函數J就變成了:

J=1/m*sum_{1}^{m}(-y*log(h(x))+(y-1)log(1-h(x)))

然後照舊,我們目的是拿x和y訓練樣本得到theta嘛!所以對這玩意求導,然後取個α,然後不斷重複梯度下降……以得到theta,就是下面這個玩意:

(repeat:)theta_j=theta_j-alpha *frac{d}{dtheta_j}J(theta)

這坨玩意里,我們需要計算frac{d}{dtheta_j}J(theta) ,直接照搬之前筆記里的,frac{d}{dtheta_j}J(theta) =1/m*sum_{i=1}^{m}{(h(x_i)-y_i)} *x_{i,j}即可。只不過這裡的h(x)=frac{1}{1+e^{-theta^T*X} }

於是我們最終得到的

(repeat:)theta_j=theta_j-alpha /m*sum_{i=1}^{m}{(h(x_i)-y_i)} *x_{i,j}

邏輯回歸函數就是這樣了。

然後是擬合問題,下面是3種情況:

第一種是欠擬合,通常是因為特徵量選少了。第二種是我們想要的,第三個是過擬合,通常是因為特徵量選多了。

欠擬合的解決方法是增加特徵量。

過擬合的解決方法是減少特徵量或者正則化。

比如我們的邏輯回歸函數,不選個自定義的函數,就用我們那個類似泰勒展開式的函數來做的畫,這貨長得凹凸不平的

,一點都不光滑。那麼,按照這貨擬合回來的函數,十有八九也是過擬合了。於是我們就會得到一個類似這樣的決策邊界(藍色線)顯然,這條決策邊界很……不實用。

我們想要的,是一根滑溜溜的凸函數,但是我們又不能確定哪些特徵量該去掉,所以我們就選擇正則化的方式解決過擬合。

正則化的方法,就是給代價函數後面加個「懲罰項」……來降低它對數據的擬合能力。

於是我們的J=1/2m*sum_{1}^{m}(-y*log(h(x))+(y-1)log(1-h(x)))

就變成了:J=1/2m*(sum_{1}^{m}(-y*log(h(x))+(y-1)log(1-h(x)))+lambda sum_{j=1}^{n}{theta_j^2} )(這裡n表示特徵量的總數,意思就是讓所有的n個正義的theta為了解決過擬合問題,大喊一聲「合體!」然後一起來懲罰那個過度擬合了的函數……lambda 是正規化參數,決定了你懲罰得有多狠。你要懲罰狠點,你就把lambda 提高一點,lambda 過高會變得欠擬合,lambda 過小無法解決過擬合。)

那麼我們的theta_j=theta_j-alpha /m*sum_{i=1}^{m}{(h(x_i)-y_i)} *x_{i,j}就順利變成了:

theta_j=theta_j(1-alpha *lambda /m)-alpha /m*sum_{i=1}^{m}({(h(x_i)-y_i)} *x_{i,j}) ~→

theta_j=theta_j-alpha /m*(sum_{i=1}^{m}{(h(x_i)-y_i)} *x_{i,j}+lambda /m*theta_j)

注意,當theta_0的時候,由於x_0=1,所以這一項不會欠擬合也不會過擬合,所以不懲罰它。

然後,如果你用的不是線性回歸,而是正規方程的話,同理,給

theta=(X^T*X)^{-1} *X^T*y加個懲罰項就好了。這裡加的懲罰項為varsigma ,varsigma 是一個n+1階的單位矩陣把第一項變成0(因為第一項不懲罰),我們把varsigma 寫作varsigma,代碼差不多就是下面這個:

varsigma =ones(n+1,n+1); #沒有ones方法的自己寫個循環給列表賦值,非常簡單。nvarsigma [0,0]=0 #python,c,php等編程的話,等這裡是0,0nvarsigma [1,1]=0 #matlab等這裡是1,1,因為一個從0開始計數,一個從1開始計數。真是……就不能統一一下么,老因為這個引起一群嘴強王者的唇戰。n寫出來差不多就是這樣一個矩陣:n[n0,0,0,0,0,0,0,0,...,0,0n0,1,0,0,0,0,0,0,...,0,0n0,0,1,0,0,0,0,0,...,0,0n0,0,0,1,0,0,0,0,...,0,0n0,0,0,0,1,0,0,0,...,0,0n0,0,0,0,0,1,0,0,...,0,0n0,0,0,0,0,0,1,0,...,0,0n0,0,0,0,0,0,0,1,...,0,0n. .n. .n. .n0,0,0,0,0,0,0,0,...,0,1n]n

得到的正規化後的公式為theta=(X^T*X+lambda *varsigma )^{-1} *X^T*y

第三周筆記結束。


推薦閱讀:

如果用因果解構世界,是否無所謂選擇了?
這是我第一次主持
專訪創勢資本 · 湯旭東:投了10年大數據,我的邏輯還是看人
學了辯證法 馬哲毛概 現在看什麼都雙重思想 求怎麼跳出這個坑?
直覺主義邏輯

TAG:机器学习 | 逻辑 | 分类 |