應(yīng)該說這是在看完《統(tǒng)計(jì)學(xué)習(xí)方法》這本書后有的想法豆励,也算是讀書筆記烟央⊥撑担《統(tǒng)計(jì)學(xué)習(xí)方法》是李航寫的,重點(diǎn)偏向于基于統(tǒng)計(jì)的監(jiān)督學(xué)習(xí)疑俭,個(gè)人覺得這本書好的地方是在敘述完理論之后粮呢,通常會(huì)有一個(gè)比較形象的小例子,在紙上演算一下具體的過程。這就讓本來很抽象的數(shù)學(xué)公式變得相當(dāng)直觀啄寡,而且對(duì)于用代碼實(shí)現(xiàn)也會(huì)有比較大的幫助豪硅。
對(duì)于程序員來說,特別是很少見數(shù)學(xué)公式的來說挺物,要讀一本這樣滿是公式的書其實(shí)是比較有挑戰(zhàn)的懒浮。我試著從程序員能理解的角度去闡述這些概念。嚴(yán)格意義上來說我只是寫了一年多程序的不合格程序員识藤,所以很多時(shí)候還是得上公式嵌溢,因?yàn)楣皆诤芏鄷r(shí)候是最精簡(jiǎn)的,就像很多優(yōu)美的代碼一樣蹋岩,他是無可替代的赖草。
簡(jiǎn)單的例子
假如有下面這個(gè)問題:
一小面店在過去半年的盈利分別為:10, 12, 9, 13, 11, 12.3 單位為千。然后問題是預(yù)測(cè)下個(gè)月的收入是多少剪个?
我估計(jì)絕大部分做過機(jī)器學(xué)習(xí)的人都會(huì)跟你說秧骑,這是最簡(jiǎn)單的一元線性回歸就能解決的。然后不求甚解的家伙可能會(huì)給你一段代碼扣囊,畢竟在Python 里做機(jī)器學(xué)習(xí)scikit-learn 就像是個(gè)大寶箱乎折,基本上所有人都能用。
from sklearn import linear_model
clf = linear_model.LinearRegression()
X = [[1], [2], [3], [4], [5], [6]]
Y = [10.0, 12.0, 9.0, 13.0, 11.0, 12.3]
clf.fit(X, Y)
print clf.predict(7)
然后看到預(yù)測(cè)的結(jié)果是: 12.46666667
好像還不是很離譜的樣子侵歇。為什么為第一時(shí)間選擇這樣的方法骂澄,這個(gè)過程到底涉及到哪些知識(shí)。所有基于統(tǒng)計(jì)的方法惕虑,甚至是大部分機(jī)器學(xué)習(xí)方法都是基于一個(gè)框架坟冲。下面我 們用這個(gè)例子來拆解它。
統(tǒng)計(jì)學(xué)習(xí)三要素
統(tǒng)計(jì)學(xué)習(xí)溃蔫,甚至我覺得所有機(jī)器學(xué)習(xí)都是建立在歷史數(shù)據(jù)之上健提,學(xué)習(xí)的目標(biāo)是讓計(jì)算機(jī)能預(yù)測(cè)。要抄書的話伟叛,你會(huì)看到這里面有很多分類私痹,比如監(jiān)督學(xué)習(xí),非監(jiān)督统刮,半監(jiān)督紊遵,強(qiáng)化學(xué)習(xí)之類的東西。其實(shí)我想真正可以好好理解下的是統(tǒng)計(jì)學(xué)習(xí)三要素:模型(model)侥蒙、策略(strategy)暗膜、算法(algorithm)。理解這個(gè)過程辉哥,基本能了解機(jī)器學(xué)習(xí)的大部分真相桦山。
model
模型是對(duì)現(xiàn)實(shí)世界的抽象,這些抽象為了能夠比較簡(jiǎn)單都有一些假設(shè)作為前提醋旦。對(duì)上面那個(gè)例子來說模型就是:每月的收入是時(shí)間的線性函數(shù)恒水。這樣一來所有的一元線性函數(shù)都有可能,這些所有可能的一元線性函數(shù)的集合被稱作模型的假設(shè)空間(hypothesis space). 統(tǒng)計(jì)學(xué)習(xí)就是要根據(jù)歷史數(shù)據(jù)饲齐,從模型的假設(shè)空間中找到一個(gè)確定钉凌,也就是上面那段代碼干的事情。
還有另外一種類型的假設(shè)空間捂人,不是函數(shù)組成御雕,是條件概率集合,比如說貝葉斯分類器的假設(shè)空間滥搭。具體什么是貝葉斯分類器酸纲,如果你不懂,后面的文章會(huì)有介紹瑟匆。
strategy
strategy 可以說是學(xué)習(xí)的標(biāo)準(zhǔn)闽坡,有了這個(gè)才會(huì)有后面的算法。還是上面那個(gè)例子愁溜,模型的假設(shè)空間是所有一元線性函數(shù)疾嗅,但是如何從這無數(shù)的函數(shù)中選擇一個(gè)最好的呢?問題如果用數(shù)學(xué)的方式來說就是求一元線性函數(shù)的兩個(gè)參數(shù)冕象,一個(gè)是x的系數(shù)代承,一個(gè)是常數(shù)項(xiàng)。然后就有人提出了幾種方法渐扮。我知道的就有兩種:
- 最小二乘法
- 極大似然估計(jì)
看著這些名詞很嚇人的樣子论悴,其實(shí)他們的直觀邏輯都是及其簡(jiǎn)單的,雖然背后確實(shí)有復(fù)雜的假設(shè)墓律,和數(shù)學(xué)證明意荤。
最小二乘法的思路是:找到一個(gè)函數(shù)使得其在樣本上預(yù)測(cè)值和真實(shí)值之間的誤差平方和最小。
極大似然的想法也是相當(dāng)?shù)闹庇^只锻,我們都在不知不覺的使用這種思想:舉個(gè)例子, 假如你是女生玖像,你讀書時(shí)候,后面坐著兩個(gè)男生A,B.每天男生A,都在后面動(dòng)你頭發(fā)齐饮。突然有天B動(dòng)了下你的頭發(fā)捐寥,我想你轉(zhuǎn)過頭肯定還是會(huì)罵A. 極大似然估計(jì)還是大名頂頂?shù)母咚固岢龅摹?shù)學(xué)點(diǎn)兒的描述就是樣本出現(xiàn)的概率最大化祖驱。
最終的目標(biāo)是要預(yù)測(cè)握恳,所以策略在做的事情就是讓風(fēng)險(xiǎn)最小,然后將問題轉(zhuǎn)化成可求解的函數(shù)極值的問題捺僻。極大似然思想就是一種經(jīng)驗(yàn)風(fēng)險(xiǎn)最小的例子:上面那女生罵A正確的概率肯定要比罵B正確的概率大乡洼。
上面兩種strategy 的最終結(jié)果是把一個(gè)模型求解的過程轉(zhuǎn)化為函數(shù)極值崇裁。如果這個(gè)函數(shù)極值有解析解,那后面的算法基本就沒有必要了束昵。通常是這個(gè)函數(shù)的極值比較復(fù)雜拔稳,很難求解或者根本就不存在解析解,那后面的算法就要派上用處了锹雏。
algorithm
這個(gè)算法和計(jì)算機(jī)里那個(gè)排序之類的還是有些區(qū)別巴比,這個(gè)主要是說的數(shù)值計(jì)算。常見的梯度下降礁遵,牛頓法轻绞,EM ...... 他們通常都是通過迭代擬合來實(shí)現(xiàn)對(duì)一個(gè)函數(shù)求極值。EM 算法的原理也是求函數(shù)下界函數(shù)的極值來逼近真實(shí)函數(shù)的極值佣耐,我見過的都是在求極值政勃。
上面講了這么多機(jī)器學(xué)習(xí),機(jī)器在這個(gè)過程中干什么呢兼砖?我們都沒見機(jī)器出場(chǎng)稼病。其實(shí)機(jī)器的核心任務(wù)就是實(shí)現(xiàn)algorithm 的工具,因?yàn)樗惴ㄍǔP枰芏嗟蛧L試掖鱼,靠人來做肯定是不行的然走,但是機(jī)器很在行這個(gè)。所以到這里我想應(yīng)該理解寫程序和機(jī)器學(xué)習(xí)到底是個(gè)什么關(guān)系戏挡。如果你不是為了創(chuàng)建一個(gè)新的算法芍瑞,只是想解決一個(gè)數(shù)據(jù)上的問題,其實(shí)你能寫程序就夠了褐墅,前提是能看懂?dāng)?shù)學(xué)上的邏輯拆檬。如果看不懂,就像寫程序的時(shí)候不知道產(chǎn)品需求一樣妥凳,后果如何寫 程序的都知道竟贯。
總結(jié)
當(dāng)然機(jī)器學(xué)習(xí)比我說的要復(fù)雜的多,這里面也還會(huì)有其他問題逝钥。比如數(shù)據(jù)預(yù)處理屑那、特征工程、模型評(píng)估艘款、選擇持际,而且這個(gè)過程中有很多細(xì)節(jié)的問題。但是從上面的描述你應(yīng)該能看到寫程序和數(shù)學(xué)是如何結(jié)合的哗咆,機(jī)器學(xué)習(xí)到底是個(gè)什么東西蜘欲,至少在傳統(tǒng)的基于統(tǒng)計(jì)的方法上是這樣,其實(shí)我想深度學(xué)習(xí)也是在求函數(shù)極值晌柬。大部分的數(shù)據(jù)科學(xué)家姥份,都是在利用少部分人發(fā)明出來的東西郭脂,來解決他們自己的問題,在這個(gè)過程中我認(rèn)為真正重要的還是想象力澈歉,和動(dòng)手能力展鸡,當(dāng)然你得看得懂?dāng)?shù)學(xué)公式,至少能理解其中的邏輯闷祥,還是那句話寫程序之前好好理解需求這是每個(gè)程序員圈子里廣泛傳播的經(jīng)驗(yàn),做機(jī)器學(xué)習(xí)你可能還要看懂公式傲诵,這就像是需求的一部分凯砍。
你可以在我的博客查看原文 或者搜索微信公眾號(hào):正午不早了