1. 程式人生 > >cs229 斯坦福機器學習筆記(一)-- 入門與LR模型

cs229 斯坦福機器學習筆記(一)-- 入門與LR模型

房價 com 還要 實現 最大 title pid 分布 fcm

版權聲明:本文為博主原創文章,轉載請註明出處。

https://blog.csdn.net/Dinosoft/article/details/34960693

前言

說到機器學習,非常多人推薦的學習資料就是斯坦福Andrew Ng的cs229。有相關的視頻和講義。只是好的資料 != 好入門的資料,Andrew Ng在coursera有另外一個機器學習課程,更適合入門。

課程有video,review questions和programing exercises,視頻盡管沒有中文字幕,只是看演示的講義還是非常好理解的(假設當初大學裏的課有這麽好。我也不至於畢業後成為文盲。。)。最重要的就是裏面的programing exercises,得理解透才完畢得來的,畢竟不是簡單點點鼠標的選擇題。

只是coursera的課程屏蔽非常一些比較難的內容,假設認為課程不夠過癮。能夠再看看cs229的。這篇筆記主要是參照cs229的課程。但也會穿插coursera的一些內容。

接觸完機器學習,會發現有兩門課非常重要,一個是概率統計。另外一個是線性代數。由於機器學習使用的數據,能夠看成概率統計裏的樣本,而機器學習建模之後,你會發現剩下的就是線性代數求解問題。

至於學習資料,周誌華最新的《機器學習》西瓜書已經出了,肯定是首選!曾經的話我推薦《機器學習實戰》,能解決你對機器學習怎麽落地的困惑。李航的《統計學習方法》能夠當提綱參考。cs229除了lecture notes。還有session notes(簡直是雪中送炭。夏天送風扇,lecture notes裏那些讓你認為有必要再深入了解的點這裏能夠找到),和problem sets。假設細致讀。資料也夠多了。


線性回歸 linear regression

? 通過現實生活中的樣例。能夠幫助理解和體會線性回歸。比方某日,某屌絲同事說買了房子,那一般大家關心的就是房子在哪。哪個小區,多少錢一平方這些信息,由於我們知道。這些信息是"關鍵信息”(機器學習裏的黑話叫“feature”)。

那假設如今要你來評估一套二手房的價格(或者更直接點。你就是一個賣房子的黑中介,嘿嘿),假設你對房價一無所知(比方說房子是在非洲),那你肯定估算不準。最好就能提供同小區其它房子的報價。沒有的話。旁邊小區也行;再沒有的話,所在區的房子均價也行;還是沒有的話,所在城市房子均價也行(在北京有套房和在余杭有套房能一樣麽),由於你知道,這些信息是有“參考價值”的。其次,估算的時候我們肯定希望提供的信息能盡量詳細,由於我們知道房子的朝向。裝修好壞,位置(靠近馬路還是小區中心)是會影響房子價格的。 ? ? 事實上我們人腦在估算的過程,就相似一個“機器學習”的過程。 a)首先我們須要“訓練數據”,也就是相關的房價數據,當然。數據太少肯定不行,要盡量豐富。

有了這些數據。人腦能夠“學習”出房價的一個大體情況。由於我們知道同一小區的同一戶型,一般價格是幾乎相同的(特征相近。目標值-房價也是相近的。不然就沒法預測了);房價我們一般按平方算,平方數和房價有“近似”線性的關系。 b)而“訓練數據”裏面要有啥信息?僅僅給你房子照片肯定不行。肯定是要小區地點。房子大小等等這些關鍵“特征” c)一般我們人肉估算的時候,比較任意,也就估個大概。不會算到小數點後幾位;而估算的時候,我們會參照現有數據,不會讓估算跟“訓練數據”差得離譜(也就是以下要講的讓損失函數盡量小),不然還要“訓練數據”幹嘛。 計算機擅好處理數值計算。把房價估算問題全然能夠用數學方法來做。把這裏的“人肉估算”數學形式化,也就是“線性回歸”。
1.我們定義線性回歸函數(linear regression)為:? 技術分享圖片

然後用h(x) 來預測y
最簡單的樣例,一個特征size,y是Price,把訓練數據畫在圖上,例如以下圖。(舉最簡單的樣例僅僅是幫助理解,當特征僅僅有一維的時候。畫出來是一條直線。多維的時候就是超平面了) 技術分享圖片
這裏有一個問題,假設真實模型不是線性的怎麽辦?所以套用線性回歸的時候是須要預判的。不然訓練出來的效果肯定不行。這裏不必過於深究,後面也會介紹怎麽通過預處理數據處理非線性的情況。

2.目標就是畫一條直線盡量靠近這些點。用數學語言來描寫敘述就是cost function盡量小。 技術分享圖片
為什麽是平方和? 直接相減取一下絕對值不行麽, | h(x)-y | ???(後面的Probabilistic interpretation會解釋。這樣求出來的是likelihood最大。另外一個問題。 | h(x)-y |大的時候 (?h(x)-y )^2 不也是一樣增大,看上去好像也一樣?!

除了後者是凸函數,好求解,所以就用平方和? 不是的,單獨一個樣本縱向比較確實一樣,但別漏了式子前面另一個求和符號,這兩者的差異體如今樣本橫向比較的時候,比方如今有兩組差值,每組兩個樣本,第一組絕對值差是1,3,第二組是2,2,絕對值差求和是一樣,4=4。 算平方差就不一樣了,10 > 8。事實上,x^2求導是2x,這裏的意思就是懲處隨偏差值線性增大,終於的效果從圖上看就是盡可能讓直線靠近全部點)
3 然後就是怎麽求解了。假設h(x)=y那就是初中時候的多元一次方程組了,如今不是。所以要用高端一點的方法。

曾經初中、高中課本也有提到怎麽求解回歸方程,都是按計算器。難怪我一點印象都沒有。囧。

還以為失憶了 notes 1裏面介紹3種方法

1.gradient descent (梯度下降)
a.batch?gradient descent b.stochastic gradient descent (上面的變形)
2.the normal equations 3.Newton method(Fisher scoring)

1.gradient descent?algorithm

技術分享圖片 α is called the learning rate.
僅僅有一個訓練數據的樣例:
技術分享圖片
技術分享圖片 這個式子直觀上也非常好理解,假設xj是正數。y比預測值h(x)大的話,我們要加大θ,所以α前面是+號(當xj是負數同理)
舉一個數據的樣例僅僅是幫助我們理解,實際中是會有多個數據的,你會體會到矩陣的便利性的。
上面的式子在詳細更新的時候有小的不同 方法 a.batch?gradient descent 註意,要同一時候進行更新。由於更新θ(j+1)的時候要用hθ(x),這裏的hθ(x)用的還是老的θ1 到 θj。
技術分享圖片

技術分享圖片 直觀上看,等高線代表cost function的值,橫縱坐標是θ1 θ2兩個參數。梯度下降就是每次一小步沿著垂直等高線的方向往等高線低(圖的中心)的地方走。

顯然步子不能太大,不然easy扯著蛋(跨一大步之後反而到了更高的點)
方法 b.stochastic gradient descent (also incremental?gradient descent)? 技術分享圖片 這兩種方法看公式可能不好理解。看後面的代碼實現就easy區分。


2.the normal equations。

剛開始學習的人能夠先跳過推導過程(不是鼓舞不看。),直接先記住結論技術分享圖片

(在線性代數的復習課件cs229-linalg會說明。這個式子事實上是把y投影到X)

3.牛頓法

Another algorithm for maximizing ?(θ) Returning to logistic regression with g(z) being the sigmoid function, lets?now talk about a different algorithm for minimizing -?(θ)。(感覺notes1裏面少了個負號) 牛頓法求函數0點。即 f (Θ) = 0 技術分享圖片

技術分享圖片這樣叠代即可,f′(θ)是斜率,從圖上看,就是“用三角形去擬合曲線。找0點”

由於我們是要求導數等於0。把上面的式子替換一下f(θ) = ?′(θ) 技術分享圖片 θ是多維的。有 技術分享圖片
where?技術分享圖片 When Newton’s method is applied to maximize the logistic regression log likelihood function ?(θ), the resulting method is also called?Fisher?scoring.
coursera的課件提到其它方法,預計剛開始學習的人沒空深究,了解一下有這些東西就好。

技術分享圖片

邏輯回歸logistic regression

如今假設有一個0和1的2分類問題的。套進去線性回歸去解,例如以下圖
技術分享圖片 離群點會對結果影響非常大,比方上圖(我們以h(x)>0.5時預測y=1。一個離群點讓直線大旋轉。一下子把不少點誤分類了)(coursera的課程僅僅提到這個原因,但貌似不止),並且另一個問題,Intuitively, it also doesn’t make sense for h(x) to take values larger than 1 or smaller than 0 when we know that y ∈ {0, 1}. (那h(x)在[0,1]又代表什麽呢?呵呵) 技術分享圖片 換成這個曲線就好多了,這個函數是sigmoid function 技術分享圖片g(z) 值域 (0,1)
把線性回歸套進去g(z)就是 技術分享圖片

為什麽是sigmoid函數?換個形狀相似的函數不行麽?這個後面一樣有概率解釋的。

註意,這個函數輸出值代表“y為1的概率”,再回過頭看看,前面y用1和0來表示正反也是有講究的(講svn的時候又換成+1。-1),直觀上看sigmoid越接近1表示1的概率大,接近0表示0的概率大,另一個好處就是以下算likelihood的時候用式子好表示。


建模好,還缺一個cost function,是不是跟linear regression一樣求平方差即可? 技術分享圖片呵呵。不是。coursera課程給出的原因是套入sigmoid後,這個函數不是凸函數。不好求解了。但事實上h(x) -y 算出來是一個概率。多個訓練數據的概率相加是沒意義的。得相乘。

p(x,y) = p(x)* p(y)。


先講一個useful property 技術分享圖片推導公式時能夠用,習題也會用到的

把兩個概率公式合到一起 技術分享圖片=>?技術分享圖片 likelihood of the parameters: 技術分享圖片 log likelihood: ?技術分享圖片 一個訓練數據的時候(代入前面的結論技術分享圖片) 技術分享圖片 註意,前面linear regression,我們求cost function的最小值。所以是減號技術分享圖片 對於logistic regression。我們要求的是likelihood最大(附錄提到,是等價的),所以要換成加號。這樣θ終於的叠代式子才跟前面linear regression一樣,這是巧合麽?隱隱約約感覺這當中有一腿。 技術分享圖片

machine learning in practice

我總認為計算機科學動手實踐非常重要,紙上談兵不接地氣。coursera有programing exercise,必須完畢下。octave用起來挺爽的。

這裏記錄一下關鍵點。

1.coursera的cost function多除了一個m

事實上起到一個歸一化的作用,讓叠代步長α與訓練樣本數無關(你能夠當作α=α‘/m) 技術分享圖片

2.batch?gradient descent和stochastic gradient descent的區別

batch?gradient descent
for iter = 1:num_iters
 A = ( X * theta - y )‘;
 theta = theta - 1/m * alpha * ( A * X )‘;
end

stochastic gradient descent
for iter = 1:num_iters
 A = ( X * theta - y )‘;
 for j = 1:m
   theta = theta - alpha * ( A(1, j) * X(j, :) )‘;    
 end
end

用ex1_multi.m改改,生成兩個cost下降圖。能夠發現stochastic gradient descent挺犀利的。


技術分享圖片 技術分享圖片

3.feature scaling的作用是啥?

(詳細模型詳細分析,這裏僅僅針對LR模型,不要把結論任意推廣)coursera提到的作用是加速收斂。那會影響結果麽?直覺上,把一個feature擴大10倍,那算cost function的時候豈不是非常占廉價。算出來的權重會偏向這個feature麽? 對這樣的問題,數學家會理論證明,project師做實驗驗證,我習慣粗略證明,然後實驗驗證自己對不正確。 (以下都是粗略的想法,不是嚴謹證明。!

)假設每一個樣本的feature j 乘以10,那算出來的θj除以10不就結果跟原來一樣了?我猜不會影響。看一下我們叠代時候的式子 技術分享圖片
xj變大,h(x) 也變大,粗略叠代步長要擴大10倍(那就起到抑制θ的作用)但終於的θ要變為1/10。想想略蛋疼,比方如今100每次降低1,減99次後變為1,如今每次要降低10。卻要讓終於的結果到0.1,得改α才行啊。看來feature scaling能起到歸一化α的作用。 把ex1.m改一下。做做實驗。

會發現縮放一個feature後,收斂非常困難啊,我僅僅乘以2,原來的代碼就輸出NaN了。

。我把alpha平方一下 alpha^2。 技術分享圖片 技術分享圖片
能夠發現等高線變密集了,橢圓形變得非常扁,所以步長不能非常大,收斂非常困難。一直在一個相似直線的橢圓跳來跳去慢慢挪。至於結果會不會變。用normal equation來驗證,由於梯度下降有困難。

改下ex1_muliti.m

X2 = X;
X2(:,2) = X2(:, 2)* 2;
theta2 = pinv(X2‘ * X2) * X2‘ * y;
theta2
theta

theta2(2)就是奇妙地變1/2了。。

theta2 =
  8.9598e+004
  6.9605e+001
  -8.7380e+003
theta =
  8.9598e+004
  1.3921e+002
  -8.7380e+003

前面是linear regression,對logistic regression能夠改ex2.m也驗證下
X2(:,2)= X2(:,2)*2;
[theta2, cost] = fminunc(@(t)(costFunction(t, X2, y)), initial_theta, options);
theta2
theta:
 -25.161272
 0.206233
 0.201470
theta2 =
  -25.16127
    0.10312
    0.20147

附錄

cost function的概率解釋

我們知道h(x)和真實的y是有偏差的,設偏差是ε
技術分享圖片 假設ε是iid(獨立同分布)的。符合高斯分布(通常高斯分布是合理的,詳細不解釋),聯想到高斯分布的式子。有平方就不奇怪了。
?技術分享圖片 得到 技術分享圖片 likelihood function:
技術分享圖片 技術分享圖片

求解技巧,轉成 log likelihood ?(θ)(這個是個非常基礎的技巧,後面會大量用到):
技術分享圖片 技術分享圖片

? To summarize: Under the previous probabilistic assumptions on the data, least-squares regression?corresponds to finding the?maximum likelihood estimate of θ.
Next《cs229 斯坦福機器學習筆記(二)-- LR回想與svm算法idea理解》


cs229 斯坦福機器學習筆記(一)-- 入門與LR模型