最近剛結束了在UCL一年的研究生學習課程,從本科學習計算機到研究生學習機器學習的課程,在學習的過程中走了很多彎路。最近在準備找工作,於是想將這一年所學習的機器學習的知識重新做一個總結,一方面希望大家能夠對我個人理解有錯誤的地方給予更正,一方面希望督促自己更快的進行學習總結。

在這一年的學習中我認為機器學習是統計學的一個分支,並且機器學習與計算機最大的不同在於計算機更注重功能的實現與演算法的應用,而機器學習更多的著重於機器學習統計學演算法的原理,代碼只是實現思想的一個工具。也就是說計算機更注重代碼,而機器學習更注重思想。在這個專題我會在找到工作前從基礎的線性回歸開始一直總結到強化學習,將我這一年所學的知識做一個整體的回顧與溫習。


  1. 概率論中的加法定則(Sum Rule)與乘法定則(Product Rule)的推導:

假設有兩個變數 xyx 可能取值為x=x_ii=1...m , y 可能取值為 y=y_j , j=1...n .

我們現在用如下符號表示:

  • N 表示所有可能得情況,即上圖所有小方塊的個數(即 N=mn
  • n_{ij}表示當x=x_i時y=y_j的情況
  • c_i表示x=x_i時,y可為任意值得情況
  • r_j表示y=y_j時,x可為任意值的情況

則我們有:(可根據上圖的求出概率值)

  • P(x=x_i,y=y_j)表示x=x_i且y=y_j的概率: P(x=x_i,y=y_j)=frac{n_{ij}}{N} (1.1)
  • P(x=x_i)表示x=x_i時, y為任意值的概率: P(x=x_i)=frac{c_i}{N} (1.2)

因為 c_i=sum_jn_{ij} 所以我們有: P(x=x_i)=frac{sum_jn_{ij}}{N}=sum_jfrac{n_{ij}}{N}=sum_jP(x=x_i,y=y_j)

所以 P(x=x_i)=sum_jP(x=x_i,y=y_j) (1.3)

  • P(y=y_j|x=x_i)表示已知x=x_i時, y=y_j的概率: P(y=y_j|x=x_i)=frac{n_{ij}}{c_i} (1.4)
  • 由公式 (1.1), (1.2), (1.4) 我們可以得到:

P(y=y_j|x=x_i)=frac{n_{ij}}{c_i}=frac{n_{ij}}{N}	imesfrac{N}{c_i}

Rightarrow P(y=y_j|x=x_i)=frac{P(x=x_i,y=y_j)}{P(x=x_i)}

Rightarrow P(x=x_i,y=y_j)=P(y=y_j|x=x_i)	imes P(x=x_i) (1.5)

  • 結合公式 (1.3) 與公式 (1.5) 我們得到了概率論中的加法定則與乘法定則:

加法定則(Sum Rule): P(x)=sum_{y}P(x,y)

乘法定則(Product Rule): P(x,y)=P(y|x)P(x)=P(x|y)P(y)


2. 貝葉斯公式(Bayes theorem):

由乘法定則: P(x,y)=P(y|x)P(x)=P(x|y)P(y) 我們可得:

Rightarrow P(y|x)=frac{P(x,y)}{P(x)}

Rightarrow P(y|x)=frac{P(x|y)P(y)}{P(x)}

因此我們的到貝葉斯公式(Bayes theorem)為:

P(y|x)=frac{P(x|y)P(y)}{P(x)} (在這篇文章 6. 似然函數 中會對這個公式做進一步解讀)


3. 應用實例(乘法定則,加法定則,貝葉斯公式):

假設:我們現在有兩個盒子,一個紅色的盒子和一個藍色的盒子,我們選擇紅色盒子的概率為40%, 選擇藍色盒子的概率為60%。同時已知選擇橘黃色的球與綠色的球的概率均等。(如上圖)

我們現在想知道:(1) 我們選擇綠色球的概率是多少? (2) 在我們已知會選擇黃球的情況下,我們從藍色的盒子里拿到黃球的概率是多少?

求解:

(1) P(ball=green)=sum_{b}P(ball=green, box=b) (由加法定則可得)

因為我們只有紅色的盒子和藍色的盒子可以選擇,則:

Rightarrow P(ball=green)=P(ball=green, box=red) + P(ball=green, box=blue)

=P(ball=green|box=red)P(box=red)+P(ball=green|box=blue)P(box=blue)

因為 {_{P(box=blue)=0.6}^{P(box=red)=0.4}{^{P(ball=green|box=red)=frac{2}{8}}_{P(ball=green|box=blue)=frac{3}{4}} . 因此:

P(ball=green) = frac{2}{8}	imes frac{4}{10} + frac{3}{4} 	imes frac{6}{10} = frac{11}{20}

(2) P(box=blue|ball=orange)=frac{P(ball=orange|box=blue)P(box=blue)}{P(ball=orange)}=frac{frac{1}{4}	imesfrac{6}{10}}{1-frac{11}{20}}=frac{1}{3}


4. 概率密度函數 (Probability Density Function PDF

(1) 定義:

連續性隨機變數的PDF用來描述這個變數的輸出值,在某個確定的取值點附近的可能性的函數。而隨機變數取值落在某個區域內的概率則為PDF在這個區域內的積分。因而對於連續值來說,我們有:

P(xin (a,b)) =  int^{b}_{a} P(x)d(x)

因為 P(x) 非負,且x的值在x軸為一條線,所以

  • P(x)geq 0 ;
  • int_{- infty}^{+ infty} P(x) dx=1 .

(2) 對於連續變數的加法定則與乘法定則:

  • 加法定則: P(x) = int_{y} P(x,y) dy
  • 乘法定則: P(x,y)=P(y|x)P(x)

5. 監督學習模型 (Supervised Learning Model):

給定一個訓練數據集 (training dataset):

S={(x_1,y_1),(x_2,y_2),...,(x_m,y_m)}

根據該數據集推導一個函數 f_s ,使得: f_s(x_i) approx y_i

對於未知數據集(非訓練數據): S^{}={(x_{m+1},y_{m+1}),(x_{m+2},y_{m+2}),...}

  • 分類問題 (classification): y in {-1,+1}
  • 回歸(regression): y in R
  • x為輸入空間(input space), y為輸出空間(output space)
  • 監督學習:計算一個函數可以最好的描述從輸入到輸出的關係。

6. 似然函數 (Likelihood function):

由貝葉斯公式可知: P(y|x)=frac{P(x|y)P(y)}{P(x)}

(1)概率 (Probability):

P(y|x) 表示已知參數 x 時,事件 y 的發生概率。

對於監督學習問題而言:我們要找到一個函數 f_s , 而對於線性回歸來說, f_s=w_0+w_1x_1+...+w_mx_m=w_0+sum_{i=1}^{m}w_ix_i , 在訓練數據集已知 xy 的情況下,我們 f_sw 決定,則我們的目的是擬合 w 從而求出最終的 f_s 。則對於監督學習問題,我們要求的是: P(x,w|y)y 已知的情況下 w 的概率。

(2) 似然函數(Likelihood function):

P(x|y) 表示假設已知事件 y 發生,參數 x 的發生可能性。即似然函數是通過貝葉斯公式將未知看作為已知,求本身已知的發生可能性的函數。對於監督學習問題而言: w 為未知, x,y 為已知,則似然函數為 P(y|w,x)

(3) 貝葉斯理論(Bayes theorem):

P(y|x)=frac{P(x|y)P(y)}{P(x)} , 其中:

  • P(y|x) : 已知 xy 的分布,即 y 的後驗分布(posterior distribution)
  • P(x|y): 已知 yx 的分布,即 y 的似然函數 (likelyihood function)
  • P(y): y 的先驗分布 (prior distribution)

因為貝葉斯公式中 x 已知,因而 P(x) 已知,則:

P(y|x)propto P(x|y)P(y)

Rightarrow posterior propto likelihood 	imes prior

對於監督學習問題來說:

  • posterior: P(x,w|y)
  • prior: P(x,w)
  • likelihood: P(y|x,w)

因此為了求解 f_s 使得 f_s(x_i)approx y_i ,我們在訓練數據集上求 w 可得 f_s , 為了使得求出的 w 使 wx_iapprox y_i , 我們可以使用最大化似然函數使得 w 假設已知下,讓 wxy 的可能性最大,或者我們可以最大化後驗分布,使得 y 已知的情況下,求出 w 更可能使得 wx_i approx y_i


7. 極大似然估計 (Maximum Likelihood Estimation):

對於監督學習問題來說,似然函數為: P(y|x,w)

因此極大似然估計就是求 w 使得 P(y|x,w) 最大,即為:

w^{*}=argmax_{w}P(y|x,w)

x=[x_1,x_2,...x_n]^{T} in R^{N	imes D}(N為數據個數,D為數據維數)

y=[y_1,y_2,...y_n]^{T} in R^{N}(N為數據個數)

為了求得 w^* 使得似然函數最大化,我們可以用梯度上升(或者用梯度下降求負的似然函數)

Rightarrow  w^{*} in argmin_{w}(-P(y|x,w))

=argmin_{w}(-prod_{i}^{n} P(y_i|x_i,w)) (因為每行數據為獨立事件,所以可拆成連乘)

propto argmin_{w}(-logprod_{i}^{n} P(y_i|x_i,w))

=argmin_{w}(-sum_{i}^{n} logP(y_i|x_i,w))

因為在現實生活中大部分的數據集都滿足高斯分布,所以我們假設似然函數服從高斯分布即: P(y|x,w) 	hicksim N(mu , sigma^{2} )

因為: N(mu , sigma^{2} )=frac{1}{sqrt{2pi} sigma}exp(-frac{(x-mu)^2}{2sigma^{2}})

所以 Rightarrow   P(y_i|x_i,w)=frac{1}{sqrt{2pi} sigma}exp(-frac{(y_i-x_i^Tw)^2}{2sigma^{2}})

Rightarrow   -logP(y_i|x_i,w)=-log[frac{1}{sqrt{2pi} sigma}exp(-frac{(y_i-x_i^Tw)^2}{2sigma^{2}})]

=-[logfrac{1}{sqrt{2pi} sigma}+logexp(-frac{(y_i-x_i^Tw)^2}{2sigma^{2}})]

=-[logfrac{1}{sqrt{2pi} sigma}+(-frac{(y_i-x_i^Tw)^2}{2sigma^{2}})]

因為 sigma 已知,所以 Rightarrow -logP(y_i|x_i,w)=frac{(y_i-x_i^Tw)^2}{2sigma^{2}}+const.

Rightarrow w^{*} in argmin_{w}(-sum_{i}^{n} logP(y_i|x_i,w))

=argmin_{w}(sum_{i}^{n} frac{(y_i-x_i^Tw)^2}{2sigma^{2}}+const.)

=argmin_{w}(sum_{i}^{n} frac{(y_i-x_i^Tw)^2}{2sigma^{2}})

=argmin_{w}(frac{1}{2sigma^{2}}sum_{i}^{n} (y_i-x_i^Tw)^2)

則我們在極小化負的似然函數後得到方程 argmin_{w}(frac{1}{2sigma^{2}}sum_{i}^{n} (y_i-x_i^Tw)^2) ,該方程就是最小二乘法的損失函數:

L(w,S)=frac{1}{2sigma^{2}}sum_{i}^{n} (y_i-x_i^Tw)^2=frac{1}{2sigma^{2}}(y-Xw)^T(y-Xw)

為了求得 argmin_{w}(L(w,S)) ,我們另該函數導數為 0 , 即 frac{partial}{partial w} L(w,S)=0 .

因為 frac{partial}{partial w} L(w,S)=frac{1}{sigma^2}(y-WX)(-X)

所以 Rightarrowfrac{1}{sigma^2}(y-WX)(-X)=0

Rightarrow(y-WX)(-X)=0

Rightarrow-X^Ty+X^TXw=0

Rightarrow X^TXw=X^Ty

Rightarrow w=(X^TX)^{-1}X^Ty

因此,極大似然估計: w^*in argmin_{w}P(y|w,x)

Rightarrow w^*=(X^TX)^{-1}X^Ty


8. 利用最小二乘作線性回歸 python

本例將用numpy產生100個一維隨機正太分布數據 x 作為數據feature,

並假設 y=20 	imes x,產生預測label:y , 將前80%個數據作為訓練數據,後20%作為測試數據。

  • 產生隨機數據:

import numpy as np
import matplotlib.pyplot as plt
sampleNo = 50
mu = 85
sigma = 5
x = np.array([np.random.normal(mu, sigma, sampleNo)]).T
y = x[:,0] * 20

  • 畫出 x 分布圖:

plt.hist( x[:,0], bins=30, normed=True)
plt.show()

  • 畫出數據分布圖:

plt.scatter(x[:,0], y,c=g)
plt.title(Dataset)
plt.xlabel(x, fontsize=14)
plt.ylabel(y, fontsize=14)
plt.show()

  • 將假數據分為前80%為訓練數據,後20%為測試數據:

train_num = int(sampleNo * 0.8)
x_train = x[0:train_num,:]
x_test = x[train_num:sampleNo,:]
y_train = y[0:train_num]
y_test = y[train_num:sampleNo]

  • 利用最小二乘法求出w:

w = (np.linalg.inv(x_train.T.dot(x_train))).dot(x_train.T).dot(y_train)

  • 在測試數據集上求出預測值:

y_pre =x_test.dot(w)

  • 求出測試集模型誤差

loss = np.sum((y_test-y_pre)**2)

  • 畫出擬合曲線(紅色)與數據點(綠色)

plt.scatter(x, y,c=g,marker=o)
plt.plot(x,x.dot(w),c=r)
plt.title(Dataset)
plt.xlabel(x, fontsize=14)
plt.ylabel(y, fontsize=14)
plt.show()


推薦閱讀:
相关文章