機器學習常見算法個人總結(面試用)


By Kubi Code

朴素貝葉斯

參考[1]

事件AB同時發生的概率為在A發生的情況下發生B或者在B發生的情況下發生A
P(AB)=P(A)P(B|A)=P(B)P(A|B)
所以有:
P(A|B)=P(B|A)P(A)P(B)

對於給出的待分類項,求解在此項出現的條件下各個目標類別出現的概率,哪個最大,就認為此待分類項屬於哪個類別

工作原理

  1. 假設現在有樣本x=(a1,a2,a3,an)這個待分類項(並認為x里面的特征獨立)
  2. 再假設現在有分類目標Y={y1,y2,y3,y4..yn}
  3. 那么max(P(y1|x),P(y2|x),P(y3|x)..P(yn|x))就是最終的分類類別
  4. P(yi|x)=p(x|yi)P(yi)P(x)
  5. 因為x對於每個分類目標來說都一樣,所以就是求max(P(x|yi)p(yi))
  6. P(x|yi)p(yi)=p(yi)i(P(ai|yi))
  7. 而具體的p(ai|yi)和p(yi)都是能從訓練樣本中統計出來
    p(ai|yi)表示該類別下該特征出現的概率
    p(yi)表示全部類別中這個這個類別出現的概率
  8. 好的,就是這么工作的^_^

工作流程

  1. 准備階段
    確定特征屬性,並對每個特征屬性進行適當划分,然后由人工對一部分待分類項進行分類,形成訓練樣本。
  2. 訓練階段
    計算每個類別在訓練樣本中的出現頻率及每個特征屬性划分對每個類別的條件概率估計
  3. 應用階段
    使用分類器進行分類,輸入是分類器和待分類樣本,輸出是樣本屬於的分類類別

屬性特征

  1. 特征為離散值時直接統計即可(表示統計概率)
  2. 特征為連續值的時候假定特征符合高斯分布:g(x,n,u)
    那么p(ak|yi)=g(xk,ni,ui)

Laplace校准(拉普拉斯校驗)

當某個類別下某個特征划分沒有出現時,會有P(a|y)=0,就是導致分類器質量降低,所以此時引入Laplace校驗,就是對沒類別下所有划分的計數加1。

遇到特征之間不獨立問題

參考改進的貝葉斯網絡,使用DAG來進行概率圖的描述

優缺點

朴素貝葉斯的優點:

    1. 對小規模的數據表現很好,適合多分類任務,適合增量式訓練。
      缺點:
    2. 對輸入數據的表達形式很敏感(離散、連續,值極大極小之類的)。

 

邏輯回歸和線性回歸

參考[2,3,4]

LR回歸是一個線性的二分類模型,主要是計算在某個樣本特征下事件發生的概率,比如根據用戶的瀏覽購買情況作為特征來計算它是否會購買這個商品,抑或是它是否會點擊這個商品。然后LR的最終值是根據一個線性和函數再通過一個sigmoid函數來求得,這個線性和函數權重與特征值的累加以及加上偏置求出來的,所以在訓練LR時也就是在訓練線性和函數的各個權重值w

hw(x)=11+e(wTx+b)

關於這個權重值w一般使用最大似然法來估計,假設現在有樣本{xi,yi},其中xi表示樣本的特征,yi{0,1}表示樣本的分類真實值,yi=1的概率是pi,則yi=0的概率是1pi,那么觀測概率為:
p(yi)=pyii(1pi)1yi
則最大似然函數為:
(hw(xi)yi(1hw(xi))1yi)

對這個似然函數取對數之后就會得到的表達式
L(w)=i(yiloghw(xi)+(1yi)log(1hw(xi)))=i(yi(wTxi)+log(1+ewTxi))
估計這個L(w)的極大值就可以得到w的估計值。

實際操作中一般會加個負號 改為求最小

所以求解問題就變成了這個最大似然函數的最優化問題,這里通常會采樣隨機梯度下降法和擬牛頓迭代法來進行優化

梯度下降法

LR的損失函數為:
J(w)=1NNi=1(yilog(hw(xi))+(1yi)log(1hw(xi)))
這樣就變成了求min(J(w))
其更新w的過程為

w:=wαJ(w)w:=wα1NNi=1((hw(xi)yi)xi)
其中α,直到J(w)不能再小時停止

梯度下降法的最大問題就是會陷入局部最優,並且每次在對當前樣本計算cost的時候都需要去遍歷全部樣本才能得到cost值,這樣計算速度就會慢很多(雖然在計算的時候可以轉為矩陣乘法去更新整個w值)
所以現在好多框架(mahout)中一般使用隨機梯度下降法,它在計算cost的時候只計算當前的代價,最終cost是在全部樣本迭代一遍之求和得出,還有他在更新當前的參數w的時候並不是依次遍歷樣本,而是從所有的樣本中隨機選擇一條進行計算,它方法收斂速度快(一般是使用最大迭代次數),並且還可以避免局部最優,並且還很容易並行(使用參數服務器的方式進行並行)
w:=wα((hw(xj)yj)xi);j1 Nandrandomly

這里SGD可以改進的地方就是使用動態的步長
α=0.04(1.0+n+i)+r

其他優化方法

  • 擬牛頓法(記得是需要使用Hessian矩陣和cholesky分解)
  • BFGS
  • L-BFGS

優缺點:無需選擇學習率α,更快,但是更復雜

關於LR的過擬合問題:

如果我們有很多的特性,在訓練集上擬合得很好,但是在預測集上卻達不到這種效果

  1. 減少feature個數(人工定義留多少個feature、算法選取這些feature)
  2. 正則化(為了方便求解,L2使用較多)
    添加正則化之后的損失函數為: J(w)=1NNi=1(yilog(hw(xi))+(1yi)log(1hw(xi)))+λ||w||2
    同時w的更新變為w:=wα(hw(xj)yj)xi)2αwj
    注意:這里的w0不受正則化影響

p范數的求解:
||X||p={Count(xi0)ifp=0(ni|xi|p)1pifp0

關於LR的多分類:softmax

假設離散型隨機變量Y的取值集合是{1,2,..,k},則多分類的LR為
P(Y=a|x)=exp(wax)(ki=1(wix));1<a<k
這里會輸出當前樣本下屬於哪一類的概率,並且滿足全部概率加起來=1

關於softmax和k個LR的選擇

如果類別之間是否互斥(比如音樂只能屬於古典音樂、鄉村音樂、搖滾月的一種)就用softmax
否則類別之前有聯系(比如一首歌曲可能有影視原聲,也可能包含人聲,或者是舞曲),這個時候使用k個LR更為合適

優缺點:
Logistic回歸優點:

  1. 實現簡單;
  2. 分類時計算量非常小,速度很快,存儲資源低;

缺點:

  1. 容易欠擬合,一般准確度不太高
  2. 只能處理兩分類問題(在此基礎上衍生出來的softmax可以用於多分類),且必須線性可分;

ps 另外LR還可以參考這篇以及多分類可以看這篇,softmax可以看這篇

KNN算法

給一個訓練數據集和一個新的實例,在訓練數據集中找出與這個新實例最近的k個訓練實例,然后統計最近的k個訓練實例中所屬類別計數最多的那個類,就是新實例的類

三要素:

  1. k值的選擇
  2. 距離的度量(常見的距離度量有歐式距離,馬氏距離等)
  3. 分類決策規則 (多數表決規則)

k值的選擇

  1. k值越小表明模型越復雜,更加容易過擬合
  2. 但是k值越大,模型越簡單,如果k=N的時候就表明無論什么點都是訓練集中類別最多的那個類

所以一般k會取一個較小的值,然后用過交叉驗證來確定
這里所謂的交叉驗證就是將樣本划分一部分出來為預測樣本,比如95%訓練,5%預測,然后k分別取1,2,3,4,5之類的,進行預測,計算最后的分類誤差,選擇誤差最小的k

KNN的回歸

在找到最近的k個實例之后,可以計算這k個實例的平均值作為預測值。或者還可以給這k個實例添加一個權重再求平均值,這個權重與度量距離成反比(越近權重越大)。

優缺點:

KNN算法的優點:

  1. 思想簡單,理論成熟,既可以用來做分類也可以用來做回歸;
  2. 可用於非線性分類;
  3. 訓練時間復雜度為O(n);
  4. 准確度高,對數據沒有假設,對outlier不敏感;

缺點:

  1. 計算量大;
  2. 樣本不平衡問題(即有些類別的樣本數量很多,而其它樣本的數量很少);
  3. 需要大量的內存;

KD樹

KD樹是一個二叉樹,表示對K維空間的一個划分,可以進行快速檢索(那KNN計算的時候不需要對全樣本進行距離的計算了)

構造KD樹

在k維的空間上循環找子區域的中位數進行划分的過程。
假設現在有K維空間的數據集T={x1,x2,x3,xn},xi={a1,a2,a3..ak}

  1. 首先構造根節點,以坐標a1的中位數b為切分點,將根結點對應的矩形局域划分為兩個區域,區域1中a1<b,區域2中a1>b
  2. 構造葉子節點,分別以上面兩個區域中a2的中位數作為切分點,再次將他們兩兩划分,作為深度1的葉子節點,(如果a2=中位數,則a2的實例落在切分面)
  3. 不斷重復2的操作,深度為j的葉子節點划分的時候,索取的aii=j%k+1,直到兩個子區域沒有實例時停止

KD樹的搜索

  1. 首先從根節點開始遞歸往下找到包含x的葉子節點,每一層都是找對應的xi
  2. 將這個葉子節點認為是當前的“近似最近點”
  3. 遞歸向上回退,如果以x圓心,以“近似最近點”為半徑的球與根節點的另一半子區域邊界相交,則說明另一半子區域中存在與x更近的點,則進入另一個子區域中查找該點並且更新”近似最近點“
  4. 重復3的步驟,直到另一子區域與球體不相交或者退回根節點
  5. 最后更新的”近似最近點“與x真正的最近點

KD樹進行KNN查找

通過KD樹的搜索找到與搜索目標最近的點,這樣KNN的搜索就可以被限制在空間的局部區域上了,可以大大增加效率。

KD樹搜索的復雜度

當實例隨機分布的時候,搜索的復雜度為log(N),N為實例的個數,KD樹更加適用於實例數量遠大於空間維度的KNN搜索,如果實例的空間維度與實例個數差不多時,它的效率基於等於線性掃描。

后來自己有實現過KD樹,可以看KNN算法中KD樹的應用

SVM、SMO

對於樣本點(xi,yi)以及svm的超平面:wTxi+b=0

  • 函數間隔:yi(wTxi+b)
  • 幾何間隔:yi(wTxi+b)||w||,其中||w||w的L2范數,幾何間隔不會因為參數比例的改變而改變

svm的基本想法就是求解能正確划分訓練樣本並且其幾何間隔最大化的超平面。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM