Patchouli的機器學習系列教程八:邏輯回歸——『器』

Patchouli的機器學習系列教程八:邏輯回歸——『器』

來自專欄景略集智6 人贊了文章

『道』篇在這裡:Patchouli的機器學習系列教程八:邏輯回歸——『道』

我們在教程七中學到的樸素貝葉斯分類器非常簡單易懂的原因主要是因為樸素貝葉斯做出的假設實在是太超現實了,他假設因變數之間全都條件獨立,就像隨後的『器』篇,假設題材和年份對屍體數量完全相互獨立,誰也不干擾誰。這就好像我們通過一個人的身高和體重去推斷一個人的性別時,卻假設人類的身高和體重毫無關係一樣。

顯然,這是十分扯淡的。

所以,樸素貝葉斯雖然簡單易懂易實現,但是面對關係複雜的事項時會捉襟見肘,無法達到很高的正確率,而邏輯回歸可以把所有參數都連結起來,求出所有因變數對判斷的影響,從而幫助分類器達到更高的精確度。

首先定義下我們的線性基函數:

import numpy as npimport pandas as pdimport scipy as spimport mathplotlib.pyplot as pltdef linear(x, **kwargs): return np.hstack([np.ones((X.shape[0], 1)), X])

然後定義預測函數

def predict(w, x, basis=linear, **kwargs): Phi = basis(x, **kwargs) f = np.dot(Phi, w) return 1./(1+np.exp(-f)), Phi

在『道』篇中,我們定義了誤差函數:

 E(mathbf{w}) = -sum_{i=1}^n y_i log gleft( mathbf{w}^	op oldsymbol{phi}(mathbf{x}_i) 
ight) - sum_{i=1}^n (1-y_i) logleft( 1 - gleft( mathbf{w}^	op oldsymbol{phi}(mathbf{x}_i) 
ight) 
ight)

def objective(g, y): return np.log(g[y.values, :]).sum() + np.log(1-g[~y.values, :]).sum()

梯度函數為:

 frac{partial E(mathbf{w})}{partial mathbf{w}} = -sum_{i=1}^n y_i left( 1 - gleft( mathbf{w}^	op oldsymbol{phi}(mathbf{x}) 
ight) 
ight) oldsymbol{phi(mathbf{x}_i)} + sum_{i=1}^n (1-y_i) left( gleft( mathbf{w}^	op oldsymbol{phi}(mathbf{x}) 
ight) 
ight) oldsymbol{phi(mathbf{x}_i)}

由於沒有解析解只有數值解所以非常適合計算機來計算:

def gradient(g, Phi, y): dw = -(Phi[y.values, :]*(1-g[y.values, :])).sum(0) dw += (Phi[~y.values, :]*g[~y.values, :]).sum(0) return dw[:, None]

導入數據:

movie_bodycount_x.csv?

pan.baidu.com

movie_bodycount_y.csv?

pan.baidu.com

X=pd.read_csv("movie_bodycount_x.csv")Y=pd.read_csv("movie_bodycount_y.csv")w = np.random.normal(size=(X.shape[1]+1, 1), scale = 0.001)eta = 1e-9iters = 10000for i in range(iters): g, Phi = predict(w, X, linear) w -= eta*gradient(g, Phi, y) if not i % 100: print ("Iter", i, "Objective", objective(g, y))

最後輸出各個電影類型對於電影中屍體數量的影響:

pd.Series(w.flatten()*10000, index=[Eins] + list(X.columns))

得到如下結果:

我們發現年份與死人數量確實呈正相關,也發現像什麼恐怖片、冒險片、奇幻片里出現的死人最多,而喜劇片、傳記片、喜劇片和死亡人數呈負相關。

結果比較符合我們的預期,其中很有意思像是驚悚片反而不是死亡的主要貢獻者,想來可能是驚悚片就是把主角團從頭嚇到尾,最後嚇死一個最蠢的。

而更有趣的音樂片居然表現出了和屍體巨大的正相關,想來可能是因為音樂片表現的故事都比較古樸,比如《巴黎聖母院》中聖母院前警民對抗那一幕屍橫遍野,可能也是導致音樂片當了反動急先鋒的主要原因。

當然,最有可能的還是我們的數據不夠充足,我在教程二中給出過一份包含10萬部電影的數據,我手上還有份70萬的,假如大家有興趣,電腦又足夠好,不妨用我們上面講的方法認真研究一下種種因素和死屍數量的相關性,看看到底誰才是真正的反動派。

以上就是Patchouli的機器學習教程的全部內容,十分基礎,卻也無比紮實,手把手的教你寫那些既有的庫里包括的機器學習方法,為各位以後的AI之路保駕護航。

可以確定的是,看我這個教程的觀眾們大約都是精緻的利己主義者,知乎上對於每個人的瀏覽是有記錄的,精確到秒。我所知道的確實有許多的人在看我的教程,而且是很認真地在看。他們打開我這篇文章的時間點,和他們的閱讀前進到下一篇文章的時間點之間的間隔——很長。

以至於我因為這個系列教程增加的關注者比我這一套教程得到的贊同整整多出一個數量級!

不過這也無所謂,有利己主義的人偷偷看教程不願分享給別人,自然也有我這樣傻了吧唧的利他主義的人在寫教程。

也許這就是普通人和天選之子之間的差別吧,天選之子總是最蠢的那個。(笑)

最後一首定場詩送給各位看教程的朋友,希望你們能在這條康莊大路上走下去,為人類文明的進步貢獻出你們的力量。

道德三皇五帝,功名夏後商周,英雄五伯鬧春秋,秦漢興亡過手。

青史幾行名姓,北邙無數荒丘。前人田地後人收,說甚龍爭虎鬥。

以上


推薦閱讀:

人工智慧技術終結「耳聾工廠」:85分貝雜訊下仍可識別語音
學習深度學習的四個步驟
免費送:吳恩達新書《Machine Learning Yearning》
CapsNet入門系列番外:基於TensorFlow實現膠囊網路
吳恩達神經網路和深度學習心得總結(三):深層神經網路

TAG:機器學習 | 數據分析 | 邏輯回歸 |