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

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

來自專欄 Pure Data入門教程2 人贊了文章

上個教程我們學習了貝葉斯分類器和樸素的貝葉斯模型,貝葉斯法則是用來計算類的後驗概率的,這次教程我們將實現類成員概率的直接估計,也就是邏輯回歸模型,同時這也將是本機器學習系列教程的最後一篇。

再研究概率的時候我們通常會引入這樣一個變數——優勢比(Odds ratio),也叫比值比,這個變數被用來衡量正反概率之間的差距。假如我們把得到正結果的概率設為π,那麼優勢比就是:

frac{pi}{1-pi} ,因為概率這東西都在0到1之間,所以優勢比的上下界在0到 infty 之間;因此我們可以對優勢比取對數來平滑這條曲線,並且可以讓取值範圍變成從 -infty+infty

而這個平滑得到的結果叫Logit Function:

 g^{-1}(pi_i) = logfrac{pi_i}{1-pi_i}

這個東西將被我用作鏈接函數,還記得我們之前說的標準回歸嗎:

f(mathbf{x}_i) = mathbf{w}^	op oldsymbol{phi}(mathbf{x}_i)

現在我們將這兩個東西鏈接起來:

g^{-1}(pi_i) = mathbf{w}^	op oldsymbol{phi}(mathbf{x}_i)

然後我們寫下鏈接函數的反函數(以π為因變數):

 pi(mathbf{x}_i) = gleft( mathbf{w}^	op oldsymbol{phi}(mathbf{x}_i) 
ight)

其中 pi_i uildrel	riangleover = pi(mathbf{x}_i) ,代表的是第i個數據點得到正結果的概率,因此對於一個數據集而言,就可以有如下表達:

pi(mathbf{x}) = gleft( mathbf{w}^	op oldsymbol{phi}(mathbf{x}) 
ight)

本文的核心是邏輯函數(Logistic Function),這種S函數是由韋呂勒在1845研究人口增長時用來模仿人口增長時用的曲線。他在機器學習中最大的作用就是將一條實線壓縮到0和1之間:

 g(f_i) = frac{1}{1+exp(-f_i)}

fig, ax = plt.subplots(figsize=(10,5))f = np.linspace(-8, 8, 100)g = 1/(1+np.exp(-f))ax.plot(f, g, r-, linewidth=3)ax.set_title(Logistic Function, fontsize=20)ax.set_xlabel($f_i$, fontsize=20)ax.set_ylabel($g_i$, fontsize=20)

這時我們把上面鏈接函數的反函數稍加修改,將 mathbf{π} 定義為一個包含輸入項量 mathbf{x} 和參數向量 mathbf{w} 的函數,然後把他扔到邏輯函數中去:

 pi(mathbf{x},mathbf{w}) = frac{1}{1 + expleft( -mathbf{w}^	op oldsymbol{phi}(mathbf{x}) 
ight)}

這一切就像我們當初為線性回歸做的那樣(計算標準線性基函數組合mathbf{w}^	op oldsymbol{phi}(mathbf{x})的輸出),我們將把這個這個值用到求伯努利分布的參數的似然函數中去。

我們可能還記得伯努利分布和伯努利似然函數是這樣的:

 p(y_i | mathbf{x}, mathbf{w}) = pi_i^{y_i} (1-pi_i)^{1-y_i}

 p(mathbf{y} | mathbf{x}, mathbf{w}) = prod_{i=1}^n P(y_i | mathbf{w}, mathbf{x}_i) = prod_{i=1}^n pi_i^{y_i} (1-pi_i)^{1-y_i}

對數似然函數是這樣的:

 log P(mathbf{y} | mathbf{x}, mathbf{w}) = sum_{i=1}^n y_i logpi_i + sum_{i=1}^n (1-y_i)log(1-pi_i)

這時我們把 pi_i = gleft( mathbf{w}^	op oldsymbol{phi}(mathbf{x}_i) 
ight) 帶進我們的誤差函數中去得到(對數似然函數取負):

 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)

因為邏輯函數: g(f_i) = frac{1}{1+exp(-f_i)}的梯度為:

 frac{partial g(f_i)}{partial f_i} = exp(-f_i)(1 + exp(-f_i))^{-2} = frac{1}{1 + exp(-f_i)} frac{exp(-f_i)}{1 + exp(-f_i)} = g(f_i)(1-g(f_i))

f_i = mathbf{w}^	op oldsymbol{phi}(mathbf{x}) ,梯度有:

egin{align*} frac{partial E(mathbf{w})}{partial mathbf{w}} & = -sum_{i=1}^n frac{y_i}{g(f_i)} frac{partial g(f_i)}{partial f_i} frac{partial f_i}{partial mathbf{w}} + sum_{i=1}^n frac{1-y_i}{1 - g(f_i)} frac{partial g(f_i)}{partial f_i} frac{partial f_i}{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) gleft( mathbf{w}^	op oldsymbol{phi}(mathbf{x}) 
ight) oldsymbol{phi}(mathbf{x}_i) end{align*}

這個方程沒有解析解,因此我們無法從梯度的偏導數找到目標函數的駐點。

既然不能通過分析方法得到解,優化就必須通過數值方法來進行,比如牛頓(環)方法。

實際上邏輯回歸只是廣義線性模型(GLMs)中的一種,此類模型假設實驗者梭測量的隨機變數的分布函數與實驗中系統性效應可經由一個鏈接函數建立起可資解釋的其相關性的函數,對於logictis模型來說,這個鏈接函數就是上面我們提到的logit function,這類模型通常都寫成這樣或通由以下形式得出:

 g^{-1}(f_i(x)) = mathbf{w}^	op oldsymbol{phi}(mathbf{x}_i)

類似函數還有泊松分布,泊松分布由於其分布特性和人類的神經網路中脈衝概率分布十分類似,因此被大量應用在計算神經學,人工智慧科學中

我們假設一個場景,假設我們現在在中國移動的電話客服中心,這個客服中心每分鐘接到的電話數量按照一個任意的隨機分布(任意的就是高斯的),那麼這個客務中心每小時一共會接到多少電話。

泊松分布一般被用來描述這個場景,你看一眼泊松分布的函數圖像就明白這個模型的精妙之處了。同樣的,在神經網路中,每個神經元接到來自上一層神經元的刺激強度是隨機的,因此過不過臨界點也是隨機的,以此來模擬神經脈衝和神經元的激活,比如IF模型(integrate-and-fire)。

泊松分布有如下表示:

 p(y) = frac{lambda^y}{y!}exp(-y)

其中 lambda 是泊松分布的參數,你可以把他理解為上述例子中每分鐘客服中心收到的電話。

from scipy.stats import poissonfig, ax = plt.subplots(figsize=(10,5))y = np.asarray(range(0, 16))p1 = poisson.pmf(y, mu=1.)p3 = poisson.pmf(y, mu=3.)p10 = poisson.pmf(y, mu=10.)ax.plot(y, p1, r.-, markersize=20, label=$lambda=1$)ax.plot(y, p3, g.-, markersize=20, label=$lambda=3$)ax.plot(y, p10, b.-, markersize=20, label=$lambda=10$)ax.set_title(Poisson Distribution, fontsize=20)ax.set_xlabel($y_i$, fontsize=20)ax.set_ylabel($p(y_i)$, fontsize=20)ax.legend(fontsize=20)

而泊松回歸自然也要和時間掛鉤而不是什麼別的:

 loglambda(mathbf{x},t) = mathbf{w}_x^	op oldsymbol{phi}_x(mathbf{x}) + mathbf{w}_t^	op oldsymbol{phi}_t(t)

泊松回歸以一個對數函數做鏈接函數,因此也被稱為對數加法模型。同樣的,我們可以根據參數將泊松回歸拆成如下兩部分:

log lambda(mathbf{x}, t) = f_x(mathbf{x}) + f_t(t)

實際上上式是可以將連加換成連乘的,那麼就等於:

lambda(mathbf{x}, t) = exp(f_x(mathbf{x}))exp(f_t(t))

以上就是神經網路和計算神經學中經常用到的泊松回歸,也是廣義線性回歸中的一員,大家在以後的學習中要靈活綜合地使用這些函數。

那麼我們的機器學習課程就到此結束了,之所以要寫這種基礎中的基礎教程,就是因為看到現在互聯網上的機器學習教程全都是各種空中樓閣,直接畫出一張大餅告訴你我們用機器學習實現了什麼什麼,然後扯幾句基本思路給你,毫無頭緒;要麼就是sklearning大法好,調參調庫調到死,然而在沒有對應的數學解釋前,你是萬萬沒可能明白該怎麼調參的,就像啞巴偽裝自己不是啞巴而說話一樣,這從邏輯上就不可能。

而其他所謂的基礎教程中:聊基礎數學的沒有對應代碼,聊基礎代碼的沒有對應的數學解釋,整個內容是割裂的,哪怕是那些頂級大學的機器學習教程,也全是理論性的東西,哪怕一行簡單的代碼都不會給你。我都是綜合著看了很久才把這些內容弄明白,並且想出了『道』『器』這樣的文章分類模式,代碼、公式以及講解相互交叉,其中還有一些我對於機器學習哲學上的思慮,應該能夠很好幫屏幕前的各位在機器學習領域打下一個非常非常堅實的基礎。本系列教程還有最後一個發表在景略集智上的『器』篇就到此,如果大家還有興趣的話請點擊關注K神的景略集智專欄和我自己的Pure Data入門教程專欄,或者關注我本人知乎用戶,我在未來應該還會持續發布『自然語言處理』,『語音處理與識別』,『國家宣傳手段』,『電音作曲編曲』相關的課程;回國之後可能還會做一些人工智慧相關的綜藝節目或者拍一些文藝紀錄片,到時希望大家繼續支持。

說書唱戲勸人方,三條大路走中央。

善惡到頭終有報,人間正道是滄桑。


推薦閱讀:

(一)通俗易懂理解——樸素貝葉斯
深度學習實踐 & 關鍵點定位演算法介紹(1)
入門教程 | 使用 Colab,玩轉谷歌深度學習全家桶!
吳恩達機器學習第十周課後感
Python實現線性回歸

TAG:機器學習 | 邏輯回歸 |