看 Andrew Ng 的機器學習課企垦,聽得懵懵懂懂,想著自己跑一把吧晒来。沒曾想跑出這么多道道來??
思想很簡單:有一坨便便钞诡,看起來像便便,聞起來像便便湃崩,我們就姑且當它便便吧荧降。
這有 10 個點,看起來挺像在一條直線上的攒读,我們就想知道到底該選哪一條誊抛。
選擇標準是什么呢?要不就拿「數(shù)據(jù)點到直線的距離之和」來評判吧:
要是我們能找到這個判別函數(shù)J(theta_0, theta_1)
[1]的最小值點整陌,那個點的坐標(theta_0, theta_1)
就是所求直線的待求參數(shù)拗窃。
接下來的問題是怎么找到它的最小值瞎领?我們先把這函數(shù)畫出來看看吧:
這個函數(shù)會在點(-4.96154, 0.134615)
處取得最小值16.4973
[2]。
看起來還不錯随夸。但……
但九默,數(shù)學家們不喜歡絕對值函數(shù)??他們喜歡這款^maximum likelihood:
這函數(shù)長這樣:
這個 2.0 版函數(shù)會在點(-8.64507, 0.161234)
處取得最小值22.3703
。
你能看出哪條直線更好嗎宾毒?反正我是不能??
等等驼修,我們是不是該回到正題——怎么求到判別函數(shù)的最小值點——了?诈铛!
很簡單乙各,我們找到「下山的方向」,跟著走就行了幢竹。直到「原地打轉(zhuǎn)」(就是前后腳距離不超過某個預設的值ε
)為止耳峦。
至于 α 是什么,Andrew Ng 把它叫做 learning rate焕毫,也有的叫它「步長」蹲坷。其實它還蠻重要的,因為它控制著下山的步子邑飒。步子大了循签,一不小心邁過最小值點了;步子小了疙咸,走太慢县匠。
接下來,我們來驗證一下這個算法好使不撒轮。拿x^2+y^2
來試試聚唐,因為它簡單,夠清楚腔召。
目前看一切挺好,但是當我們把步長調(diào)到 1 的時候臀蛛,它就開始原地打轉(zhuǎn)了亲桦,調(diào)到 1.1 的時候,開始蹦跶出去了??
好吧抡柿,我終于鍥而不舍地畫出來了??
遇到特別陡峭的變態(tài)函數(shù)怎么辦舔琅?
首先想到的是:要是新點的判別函數(shù)值比前一點的還高,那就調(diào)小步長洲劣,并且回退。試了下,效果不錯买羞。一旦跑反了费韭,還知道回來谴返。
下面的問題是如何讓步長自適應變化。不過涉及到優(yōu)化的問題就有點煩人了,先就這樣吧扎即。
最后做個有意思的吧:看看能不能用 linear regression 做個手寫識別。
首先是去下一個「手寫數(shù)字庫」况凉;
預處理下照片:縮小谚鄙,壓扁(拍成一個數(shù)組);
丟給現(xiàn)成的「線性回歸庫」做刁绒;
直接上代碼吧:
毛都跑不出來N萌佟3跽!