機器學習常見的演算法面試題總結
樸素貝葉斯
P(A∩B)=P(A)*P(B|A)=P(B)*P(A|B)
所以有:P(A|B)=P(B|A)*P(A)/P(B)
對於給出的待分類項,求解在此項出現的條件下各個目標類別出現的概率,哪個最大,就認為此待分類項屬於哪個類別
工作原理
- 假設現在有樣本x=(a1,a2,a3,…an)這個待分類項(並認為x裡面的特徵獨立)
- 再假設現在有分類目標Y={y1,y2,y3,y4..yn}
- 那麼max(P(y1|x),P(y2|x),P(y3|x)..P(yn|x))中的最大者就是最終的分類類別
- 而P(yi|x)=p(x|yi)*P(yi)/P(x)
- 因為x對於每個分類目標來說都一樣,所以就是求max(P(x|yi)*p(yi))
- P(x|yi)*p(yi)=p(yi)*PI(P(ai|yi)) (PI表示連乘)
- 而具體的p(ai|yi)和p(yi)都是能從訓練樣本中統計出來
p(ai|yi)表示該類別下該特徵出現的概率
p(yi)表示全部類別中這個這個類別出現的概率 - 好的,就是這麼工作的^_^
工作流程
- 準備階段
確定特徵屬性,並對每個特徵屬性進行適當劃分,然後由人工對一部分待分類項進行分類,形成訓練樣本。 - 訓練階段
計算每個類別在訓練樣本中的出現頻率及每個特徵屬性劃分對每個類別的條件概率估計 - 應用階段
使用分類器進行分類,輸入是分類器和待分類樣本,輸出是樣本屬於的分類類別
屬性特徵
- 特徵為離散值時直接統計即可(表示統計概率)
- 特徵為連續值的時候假定特徵符合高斯分佈:g(x,n,u)
那麼p(ak|yi)=g(xk,ni,ui)
Laplace校準(拉普拉斯校驗)
當某個類別下某個特徵劃分沒有出現時,會有P(a|y)=0,就是導致分類器質量降低,所以此時引入Laplace校驗,就是對沒類別下所有劃分的計數加1。
遇到特徵之間不獨立問題
參考改進的貝葉斯網路,使用DAG來進行概率圖的描述
優缺點
樸素貝葉斯的優點:
- 對小規模的資料表現很好,適合多分類任務,適合增量式訓練。
缺點: - 對輸入資料的表達形式很敏感(離散、連續,值極大極小之類的)。
http://www.cnblogs.com/leoo2sk/archive/2010/09/17/naive-bayesian-classifier.html
邏輯迴歸和線性迴歸
LR迴歸是一個線性的二分類模型,主要是計算在某個樣本特徵下事件發生的概率,比如根據使用者的瀏覽購買情況作為特徵來計算它是否會購買這個商品,抑或是它是否會點選這個商品。然後LR的最終值是根據一個線性和函式再通過一個sigmod函式來求得,這個線性和函式權重與特徵值的累加以及加上偏置求出來的,所以在訓練LR時也就是在訓練線性和函式的各個權重值w。
關於這個權重值w一般使用最大似然法來估計,比如yi=1的概率是pi,則yi=0的概率是1-pi,那麼觀測概率為p(yi)=pi^yi*(1-pi)^(1-yi)這個這個最大似然函式為(hw(xi)^yi*(1-hw(xi))^(1-yi))連乘,對這個似然函式取對數之後就會得到的表示式L(w)=sigma(yi*log(hw(xi))-(1-yi)log(1-hw(xi)))=sigma(yi*(w*xi)-log(1+exp(w*xi))),估計這個L(w)的極大值就可以得到w的估計值。
所以求解問題就變成了這個最大似然函式的最優化問題,這裡通常會取樣隨機梯度下降法和擬牛頓迭代法來進行優化
梯度下降法
如果hw(x)=1/(1-e^(-wx)),
則cost function=-1/m* sigma(yi*log(hw(xi)+(1-yi)*log(1-hw(xi)))=j(w)
這裡就成了就min(j(w))
所以更新w的過程為
w:=w-lamea*j(w)’ (求導)
w:=w-lamea* 1/m\*sigma[m](hw(xi)-yi)*xi)
直到j(w)不能再的時候停止
梯度下降法的最大問題就是會陷入區域性最優,並且每次在對當前樣本計算cost的時候都需要去遍歷全部樣本才能得到cost值,這樣計算速度就會慢很多(雖然在計算的時候可以轉為矩陣乘法去更新整個w值)
所以現在好多框架(mahout)中一般使用隨機梯度下降法,它在計算cost的時候只計算當前的代價,最終cost是在全部樣本迭代一遍之求和得出,還有他在更新當前的引數w的時候並不是依次遍歷樣本,而是從所有的樣本中隨機選擇一條進行計算,它方法收斂速度快(一般是使用最大迭代次數),並且還可以避免區域性最優,並且還很容易並行(使用引數伺服器的方式進行並行)
這裡SGD可以改進的地方就是使用動態的梯度值alpha=0.04*(1.0+n+i)+Rate
其他優化方法
- 擬牛頓法(記得是需要使用Hessian矩陣和cholesky分解)
- BFGS
- L-BFGS
優缺點:無需選擇學習率α,更快,但是更復雜
關於LR的過擬合問題:
如果我們有很多的特性,在訓練集上擬合得很好,但是在預測集上卻達不到這種效果
- 1. 減少feature個數(人工定義留多少個feature、演算法選取這些feature)
- 2. 正則化(留下所有的feature,但對於部分feature定義其parameter非常小),在cost上加 lamea(sigma(w^2)),同時w的更新變為w:=w-rate* 1/m\*sigma[m](hw(xi)-yi)*xi+ (lamea/m)*w。注意:這裡的w0不受正則化影響
關於LR的多分類:softmax
softmax:假設離散型隨機變數Y的取值集合是{1,2,..,k},則多分類的LR為
P(Y=a|x)=exp(wa*x)/(1-1到k求和(wk*x)) 1<a<k
這裡會輸出當前樣本下屬於哪一類的概率,並且滿足全部概率加起來=1
關於softmax和k個LR的選擇
如果類別之間是否互斥(比如音樂只能屬於古典音樂、鄉村音樂、搖滾月的一種)就用softmax
否則類別之前有聯絡(比如一首歌曲可能有影視原聲,也可能包含人聲,或者是舞曲),這個時候使用k個LR更為合適
優缺點:
Logistic迴歸優點:
- 實現簡單;
- 分類時計算量非常小,速度很快,儲存資源低;
缺點:
- 容易欠擬合,一般準確度不太高
- 只能處理兩分類問題(在此基礎上衍生出來的softmax可以用於多分類),且必須線性可分;
http://www.cnblogs.com/biyeymyhjob/archive/2012/07/18/2595410.html
http://blog.csdn.net/abcjennifer/article/details/7716281
http://ufldl.stanford.edu/wiki/index.php/Softmax%E5%9B%9E%E5%BD%92
KNN演算法
給一個訓練資料集和一個新的例項,在訓練資料集中找出與這個新例項最近的k個訓練例項,然後統計最近的k個訓練例項中所屬類別計數最多的那個類,就是新例項的類
三要素:
- k值的選擇
- 距離的度量(常見的距離度量有歐式距離,馬氏距離等)
- 分類決策規則 (多數表決規則)
k值的選擇
- k值越小表明模型越複雜,更加容易過擬合
- 但是k值越大,模型越簡單,如果k=N的時候就表明無論什麼點都是訓練集中類別最多的那個類
所以一般k會取一個較小的值,然後用過交叉驗證來確定
這裡所謂的交叉驗證就是將樣本劃分一部分出來為預測樣本,比如95%訓練,5%預測,然後k分別取1,2,3,4,5之類的,進行預測,計算最後的分類誤差,選擇誤差最小的k
KNN的迴歸
在找到最近的k個例項之後,可以計算這k個例項的平均值作為預測值。或者還可以給這k個例項新增一個權重再求平均值,這個權重與度量距離成反比(越近權重越大)。
優缺點:
KNN演算法的優點:
- 思想簡單,理論成熟,既可以用來做分類也可以用來做迴歸;
- 可用於非線性分類;
- 訓練時間複雜度為O(n);
- 準確度高,對資料沒有假設,對outlier不敏感;
缺點:
- 計算量大;
- 樣本不平衡問題(即有些類別的樣本數量很多,而其它樣本的數量很少);
- 需要大量的記憶體;
KD樹
KD樹是一個二叉樹,表示對K維空間的一個劃分,可以進行快速檢索(那KNN計算的時候不需要對全樣本進行距離的計算了)
構造KD樹
在k維的空間上迴圈找子區域的中位數進行劃分的過程。
假設現在有K維空間的資料集T={x1,x2,x3,…xn},xi={a1,a2,a3..ak}
- 首先構造根節點,以座標a1的中位數b為切分點,將根結點對應的矩形局域劃分為兩個區域,區域1中a1b
- 構造葉子節點,分別以上面兩個區域中a2的中位數作為切分點,再次將他們兩兩劃分,作為深度1的葉子節點,(如果a2=中位數,則a2的例項落在切分面)
- 不斷重複2的操作,深度為j的葉子節點劃分的時候,索取的ai 的i=j%k+1,直到兩個子區域沒有例項時停止
KD樹的搜尋
- 首先從根節點開始遞迴往下找到包含x的葉子節點,每一層都是找對應的xi
- 將這個葉子節點認為是當前的“近似最近點”
- 遞迴向上回退,如果以x圓心,以“近似最近點”為半徑的球與根節點的另一半子區域邊界相交,則說明另一半子區域中存在與x更近的點,則進入另一個子區域中查詢該點並且更新”近似最近點“
- 重複3的步驟,直到另一子區域與球體不相交或者退回根節點
- 最後更新的”近似最近點“與x真正的最近點
KD樹進行KNN查詢
通過KD樹的搜尋找到與搜尋目標最近的點,這樣KNN的搜尋就可以被限制在空間的區域性區域上了,可以大大增加效率。
KD樹搜尋的複雜度
當例項隨機分佈的時候,搜尋的複雜度為log(N),N為例項的個數,KD樹更加適用於例項數量遠大於空間維度的KNN搜尋,如果例項的空間維度與例項個數差不多時,它的效率基於等於線性掃描。
SVM、SMO
對於樣本點(xi,yi)以及svm的超平面:wix+b=0
- 函式間隔:yi(wxi+b)
- 幾何間隔:yi(wxi+b)/||w||,其中||w||為w的L2範數,幾何間隔不會因為引數比例的改變而改變
svm的基本想法就是求解能正確劃分訓練樣本並且其幾何間隔最大化的超平面。
線性SVM問題
yi(wxi+b)/||w||>=d (使用幾何間隔)
求max(d)
那麼假設d’=d||w||
則將問題轉為:yi(wxi+b)>=1,max(d’/||w||)
由於d’的成比例增減不會影響實際間距,所以這裡的取d’=1,又因為max(1/||w||)=min(1/2\||w||^2)
所以最終的問題就變為了
yi(wxi+b)>=1,min(1/2*||w||^2)
這樣就變成了一個凸的二次規劃化,可以將其轉換為拉格朗日函式,然後使用對偶演算法來求解
對偶求解
L(w,b,a)=1/2*||w||^2-sigma(ai*yi(wxi+b))+sigma(ai) 其中a={a1,a2..an}為拉格朗日向量
根據對偶性質 原始問題就是求對偶問題的極大極小max[a]min[w,b]L(w,b,a)
先求L對w,b的極小,再求對a的極大
求min[w,b]L(w,b,a):
L’(w)=w-sigma(aiyixi)=0
L’(b)=sigma(aiyi)=0;
代入後可得min[w,b]L(w,b,a)=-1/2*sigma(sigma(aiajyiyj(xi·xj)))+sigma(ai)
求min[w,b]L(w,b,a)對a的極大
max[a] -1/2*sigma(sigma(aiajyiyj(xi·xj)))+sigma(ai)
sigma(aiyi)=0
轉成等價的對偶形式就是
min[a] 1/2*sigma(sigma(aiajyiyj(xi·xj)))-sigma(ai)
sigma(aiyi)=0
假如求解出來的a為a^=(a1,a2,…an)
則得到最優的w,b分別為
w^=sigma(aiyixi)
b^=yj-sigma(aiyi(xi·xj))
所以,最終的決策分類面為
f=sign(sigma(aiyi(x·xi))+b^
也就是說,分類決策函式只依賴於輸入x與訓練樣本的輸入的內積
與分離超平面最近的樣本點稱為支援向量
損失函式
經驗損失函式:sigma(1-yi(wxi+b)) (注意,如果該值小於0時直接取0即可)
合頁損失函式:sigma(1-yi(wi+b)) + leama||w||^2 後面的是L2正則項
為什麼要引入對偶演算法
- 對偶問題往往更加容易求解(結合拉格朗日和kkt條件)
- 可以很自然的引用核函式(拉格朗日表示式裡面有內積,而核函式也是通過內積進行對映的)
核函式
將輸入特徵x(線性不可分)對映到高維特徵R空間,可以在R空間上讓SVM進行線性可以變,這就是核函式的作用
- 多項式核函式:K(x,z)=(x*z+1)^p
- 高斯核函式:K(x,z)=exp(-(x-z)^2/a^2) a為均值
- 字串核函式:好像用於文字匹配、檢索之類的,不懂
SVM優缺點
優點:
- 使用核函式可以向高維空間進行對映
- 使用核函式可以解決非線性的分類
- 分類思想很簡單,就是將樣本與決策面的間隔最大化
- 分類效果較好
缺點:
- 對大規模資料訓練比較困難,因為它是用二次規劃來求解的
- 無法直接支援多分類,但是可以使用間接的方法來做
SMO
SMO是用於快速求解SVM的
它選擇凸二次規劃的兩個變數,其他的變數保持不變,然後根據這兩個變數構建一個二次規劃問題,這個二次規劃關於這兩個變數解會更加的接近原始二次規劃的解,通過這樣的子問題劃分可以大大增加整個演算法的計算速度,關於這兩個變數:
- 其中一個是嚴重違反KKT條件的一個變數
- 另一個變數是根據自由約束確定,好像是求剩餘變數的最大化來確定的。
SVM多分類問題
- 直接法
直接在目標函式上進行修改,將多個分類面的引數求解合併到一個最優化問題中,通過求解該優化就可以實現多分類(計算複雜度很高,實現起來較為困難) - 間接法
- 一對多
其中某個類為一類,其餘n-1個類為另一個類,比如A,B,C,D四個類,第一次A為一個類,{B,C,D}為一個類訓練一個分類器,第二次B為一個類,{A,C,D}為另一個類,按這方式共需要訓練4個分類器,最後在測試的時候將測試樣本經過這4個分類器f1(x),f2(x),f3(x)和f4(x),取其最大值為分類器(這種方式由於是1對M分類,會存在偏置,很不實用) - 一對一(libsvm實現的方式)
任意兩個類都訓練一個分類器,那麼n個類就需要n*(n-1)/2個svm分類器。
還是以A,B,C,D為例,那麼需要{A,B},{A,C},{A,D},{B,C},{B,D},{C,D}為目標共6個分類器,然後在預測的將測試樣本通過這6個分類器之後進行投票選擇最終結果。(這種方法雖好,但是需要n*(n-1)/2個分類器代價太大,不過有好像使用迴圈圖來進行改進)
- 一對多
決策樹
決策樹是一顆依託決策而建立起來的樹。
ID3
- 首先是針對當前的集合,計算每個特徵的資訊增益
- 然後選擇資訊增益最大的特徵作為當前節點的決策決策特徵
- 根據特徵不同的類別劃分到不同的子節點(比如年齡特徵有青年,中年,老年,則劃分到3顆子樹)
- 然後繼續對子節點進行遞迴,直到所有特徵都被劃分
S(C,ai)=-sigma(pilog(pi)) 一個屬性中某個類別的熵 pi=P(yi|ai) pi表示ai情況下發生yi的概率,也即是統計概率
S(C,A)=sigma(P(A=ai)\S(ai)) 整個屬性的熵,為各個類別的比例與各自熵的加權求和
Gain(C,A)=S(C)-S(C,A) 增益表示分類目標的熵減去當前屬性的熵,增益越大,分類能力越強
(這裡前者叫做經驗熵,表示資料集分類C的不確定性,後者就是經驗條件熵,表示在給定A的條件下對資料集分類C的不確定性,兩者相減叫做互資訊,決策樹的增益等價於互資訊)
比如說當前屬性是是否擁有房產,分類是是否能償還債務
現在:
- 有用房產為7個,4個能償還債務,3個無法償還債務
- 然後無房產為3個,其中1個能償還債務,2個無法償還債務
然後S(有房產)=-(4/7*log4/7+3/7*log3/7)
S(無房產)=-(1/3*log1/3+2/3*log2/3)
其中S(分類)=-(5/10*log5/10+5/10*log5/10)
最終的增益=S(分類)-(7/10*S(有房產)+3/10*S(無房產)) 最大越好
關於損失函式
設樹的葉子節點個數為T,t為其中一個葉子節點,該葉子節點有Nt個樣本,其中k類的樣本有Ntk個,H(t)為葉子節點上的經驗熵,則損失函式定義為
Ct(T)=sigma(Nt*H(t))+ lamdba |T|
其中H(t)=sigma(Ntk/Nt*log(Ntk/Nt))
代入可以得到Ct(T)=sigma(sigma(Ntk*log(Ntk/Nt)))+lamdba|T|
最終有Ct(T)=C(T)+ lamdba|T|
lamdba|T|為正則化項,leama是用於調節比率
決策樹的生成只考慮了資訊增益
C4.5
它是ID3的一個改進演算法,使用資訊增益率來進行屬性的選擇
splitInformation(S,A)=-sigma(|Si|/|S|*log2(|Si|/|S|))
GainRatio(S,A)=Gain(S,A)/splitInformation(S,A)
優缺點:
準確率高,但是子構造樹的過程中需要進行多次的掃描和排序,所以它的運算效率較低
Cart
分類迴歸樹(Classification And Regression Tree)是一個決策二叉樹,在通過遞迴的方式建立,每個節點在分裂的時候都是希望通過最好的方式將剩餘的樣本劃分成兩類,這裡的分類指標:
- 分類樹:基尼指數最小化(gini_index)
- 迴歸樹:平方誤差最小化
分類樹:
- 首先是根據當前特徵計算他們的基尼增益
- 選擇基尼增益最小的特徵作為劃分特徵
- 從該特徵中查詢基尼指數最小的分類類別作為最優劃分點
- 將當前樣本劃分成兩類,一類是劃分特徵的類別等於最優劃分點,另一類就是不等於
- 針對這兩類遞迴進行上述的劃分工作,直達所有葉子指向同一樣本目標或者葉子個數小於一定的閾值
gini用來度量分佈不均勻性(或者說不純),總體的類別越雜亂,GINI指數就越大(跟熵的概念很相似)
gini(ai)=1-sigma(pi^2) pi當前資料集中第i類樣本的比例
gini越小,表示樣本分佈越均勻(0的時候就表示只有一類了),越大越不均勻
基尼增益gini_gain=sigma(Ni/N*gini(ai)) 表示當前屬性的一個混亂 Ni/N表示當前類別佔所有類別的概率
最終Cart選擇GiniGain最小的特徵作為劃分特徵
以ID3中的貸款的那棵樹為樣例:
gini(有房產)=1-((3/7)^2+(4/7)^2) //基尼指數
gini(無房產)=1-((1/3)^2+(2/3)^2)
gini_gain=7/10*gini(有房產)+3/10*gini(無房產) //基尼增益
迴歸樹:
迴歸樹是以平方誤差最小化的準則劃分為兩塊區域
- 遍歷特徵計算最優的劃分點s,
使其最小化的平方誤差是:min{min(R1.sigma((yi-c1)^2))+min(R2.sigma((yi-c2)^2))}
計算根據s劃分到左側和右側子樹的目標值與預測值之差的平方和最小,這裡的預測值是兩個子樹上輸入xi樣本對應yi的均值 - 找到最小的劃分特徵j以及其最優的劃分點s,根據特徵j以及劃分點s將現有的樣本劃分為兩個區域,一個是在特徵j上小於等於s,另一個在在特徵j上大於s
R1(j)={x|x(j)<=s}、R2(j)={x|x(j)>s} - 進入兩個子區域按上述方法繼續劃分,直到到達停止條件
這裡面的最小化我記得可以使用最小二乘法來求
關於剪枝:用獨立的驗證資料集對訓練集生長的樹進行剪枝(事後剪枝)。
停止條件
- 直到每個葉子節點都只有一種型別的記錄時停止,(這種方式很容易過擬合)
- 另一種時當葉子節點的記錄樹小於一定的閾值或者節點的資訊增益小於一定的閾值時停止
關於特徵與目標值
- 特徵離散 目標值離散:可以使用ID3,cart
- 特徵連續 目標值離散:將連續的特徵離散化 可以使用ID3,cart
- 特徵離散 目標值連續
決策樹的分類與迴歸
- 分類樹
輸出葉子節點中所屬類別最多的那一類 - 迴歸樹
輸出葉子節點中各個樣本值的平均值
理想的決策樹
- 葉子節點數儘量少
- 葉子節點的深度儘量小(太深可能會過擬合)
解決決策樹的過擬合
- 剪枝
- 前置剪枝:在分裂節點的時候設計比較苛刻的條件,如不滿足則直接停止分裂(這樣幹決策樹無法到最優,也無法得到比較好的效果)
- 後置剪枝:在樹建立完之後,用單個節點代替子樹,節點的分類採用子樹中主要的分類(這種方法比較浪費前面的建立過程)
- 交叉驗證
- 隨機森林
優缺點
優點:
- 計算量簡單,可解釋性強,比較適合處理有缺失屬性值的樣本,能夠處理不相關的特徵;
缺點: - 單顆決策樹分類能力弱,並且對連續值變數難以處理;
- 容易過擬合(後續出現了隨機森林,減小了過擬合現象);
隨機森林RF
隨機森林是有很多隨機得決策樹構成,它們之間沒有關聯。得到RF以後,在預測時分別對每一個決策樹進行判斷,最後使用Bagging的思想進行結果的輸出(也就是投票的思想)
學習過程
- 現在有N個訓練樣本,每個樣本的特徵為M個,需要建K顆樹
- 從N個訓練樣本中有放回的取N個樣本作為一組訓練集(其餘未取到的樣本作為預測分類,評估其誤差)
- 從M個特徵中取m個特徵左右子集特徵(m<<M)
- 對取樣的資料使用完全分裂的方式來建立決策樹,這樣的決策樹每個節點要麼無法分裂,要麼所有的樣本都指向同一個分類
- 重複2的過程K次,即可建立森林
預測過程
- 將預測樣本輸入到K顆樹分別進行預測
- 如果是分類問題,直接使用投票的方式選擇分類頻次最高的類別
- 如果是迴歸問題,使用分類之後的均值作為結果
引數問題
- 這裡的一般取m=sqrt(M)
- 關於樹的個數K,一般都需要成百上千,但是也有具體的樣本有關(比如特徵數量)
- 樹的最大深度,(太深可能可能導致過擬合??)
- 節點上的最小樣本數、最小資訊增益
泛化誤差估計
使用oob(out-of-bag)進行泛化誤差的估計,將各個樹的未取樣樣本作為預測樣本(大約有36.8%),使用已經建立好的森林對各個預測樣本進行預測,預測完之後最後統計誤分得個數佔總預測樣本的比率作為RF的oob誤分率。
學習演算法
- ID3演算法:處理離散值的量
- C45演算法:處理連續值的量
- Cart演算法:離散和連續 兩者都合適?
關於CART
Cart可以通過特徵的選擇迭代建立一顆分類樹,使得每次的分類平面能最好的將剩餘資料分為兩類
gini=1-sigma(pi^2),表示每個類別出現的概率和與1的差值,
分類問題:argmax(Gini-GiniLeft-GiniRight)
迴歸問題argmax(Var-VarLeft-VarRight)
查詢最佳特徵f已經最佳屬性閾值th 小於th的在左邊,大於th的在右邊子樹
優缺點
- 能夠處理大量特徵的分類,並且還不用做特徵選擇
- 在訓練完成之後能給出哪些feature的比較重要
- 訓練速度很快
- 很容易並行
- 實現相對來說較為簡單
GBDT
GBDT的精髓在於訓練的時候都是以上一顆樹的殘差為目標,這個殘差就是上一個樹的預測值與真實值的差值。
比如,當前樣本年齡是18歲,那麼第一顆會去按18歲來訓練,但是訓練完之後預測的年齡為12歲,差值為6,所以第二顆樹的會以6歲來進行訓練,假如訓練完之後預測出來
Boosting的好處就是每一步的參加就是變相了增加了分錯instance的權重,而對已經對的instance趨向於0,這樣後面的樹就可以更加關注錯分的instance的訓練了
Shrinkage
Shrinkage認為,每次走一小步逐步逼近的結果要比每次邁一大步逼近結果更加容易避免過擬合。
y(1 ~ i) = y(1 ~ i-1) + step * yi
就像我們做網際網路,總是先解決60%使用者的需求湊合著,再解決35%使用者的需求,最後才關注那5%人的需求,這樣就能逐漸把產品做好.
調參
- 樹的個數 100~10000
- 葉子的深度 3~8
- 學習速率 0.01~1
- 葉子上最大節點樹 20
- 訓練取樣比例 0.5~1
- 訓練特徵取樣比例 sqrt(num)
優缺點:
優點:
- 精度高
- 能處理非線性資料
- 能處理多特徵型別
- 適合低維稠密資料
缺點: - 並行麻煩(因為上下兩顆樹有聯絡)
- 多分類的時候 複雜度很大
BP
最小二乘法
最小二乘法是一種數學的優化技術,通過求最小化平方誤差來尋找最佳的函式匹配
假設現在有二維的觀測資料(x1,y1),(x2,y2)…(xn,yn),求y=a+bx的擬合。
現設yi=a+bxi+ki 如果有a,b能得到sigma(|ki|)最小,則該線比較理想
所以先變為求min(sigma(ki)) ,這個與min(sigma(ki^2))等價
而ki=yi-(a+bxi)
那麼現設f=sigma((yi-(a+bxi))^2)求其最小即可
上述就是最小二乘原則,估計a,b的方法稱為最小二乘法
先求f對a,b的偏導:
f’(a)=-2*sigma(yi-(a+bxi))=0
f’(b)=-2*xi*sigma(yi-(a+bxi))=0
現設:X=sigma(xi)/n Y=sigma(yi)/
則代入上述偏導:
an+bnX=nY
anX+b*sigma(xi^2)=sigma(xi*yi)
求該行列式:
|n ,nX |
|nX,sigma(xi^2)|
=n*sigma((xi-X))!=0 所以有唯一解
最後記:
l(xx)=sigma((xi-X)^2)
l(yy)=sigma((yi-Y)^2)
l(xy)=sigma((xi-X)(yi-Y))
則b=l(xy)/l(xx) a=Y-bX
EM
EM用於隱含變數的概率模型的極大似然估計,它一般分為兩步:第一步求期望(E),第二步求極大(M),
如果概率模型的變數都是觀測變數,那麼給定資料之後就可以直接使用極大似然法或者貝葉斯估計模型引數。
但是當模型含有隱含變數的時候就不能簡單的用這些方法來估計,EM就是一種含有隱含變數的概率模型引數的極大似然估計法。
應用到的地方:混合高斯模型、混合樸素貝葉斯模型、因子分析模型
Bagging
- 從N樣本中有放回的取樣N個樣本
- 對這N個樣本在全屬性上建立分類器(CART,SVM)
- 重複上面的步驟,建立m個分類器
- 預測的時候使用投票的方法得到結果
Boosting
boosting在訓練的時候會給樣本加一個權重,然後使loss function儘量去考慮那些分錯類的樣本(比如給分錯類的樣本的權重值加大)
凸優化
在機器學習中往往是最終要求解某個函式的最優值,但是一般情況下,任意一個函式的最優值求解比較困難,但是對於凸函式來說就可以有效的求解出全域性最優值。
凸集
一個集合C是,當前僅當任意x,y屬於C且0<=theta<=1,都有theta*x+(1-theta)*y屬於C
用通俗的話來說C集合線段上的任意兩點也在C集合中
凸函式
一個函式f其定義域(D(f))是凸集,並且對任意x,y屬於D(f)和0<=theta<=1都有
f(theta*x+(1-theta)*y)<=theta*f(x)+(1-theta)*f(y) —這個貌似叫做jensen不等式
用通俗的話來說就是曲線上任意兩點的割線都在曲線的上方
常見的凸函式有:
- 指數函式f(x)=a^x a>1
- 負對數函式-logax a>1,x>0
- 開口向上的二次函式等
凸函式的判定:
- 如果f是一階可導,對於任意資料域內的x,y滿足f(y)>=f(x)+f’(x)(y-x)
- 如果f是二階可導,
凸優化應用舉例
- SVM:其中由max|w| 轉向min(1/2*|w|^2)
- 最小二乘法?
- LR的損失函式sigma(yi*log(hw(x))+(1-yi)*(log(1-hw(x))))
相關文章
- 面試Python機器學習時,常見的十個面試題Python機器學習面試題
- 【演算法工程師】機器學習面試問題總結演算法工程師機器學習面試
- Webpack常見面試題總結Web面試題
- Python常見面試題總結——個人Python學習經驗Python面試題
- 大資料面試常見的面試題總結大資料面試題
- 「乾貨」22道機器學習常見面試題目機器學習面試題
- 前端常見面試題少量總結前端面試題
- 常見面試題學習(4)面試題
- 面試題(五)常見vue相關面試題總結面試題Vue
- 資料庫常見面試題總結資料庫面試題
- MySQL常見面試題總結[精讀]MySql面試題
- ES6常見面試題總結面試題
- 機器學習及深度學習的知識點及面試題總結機器學習深度學習面試題
- 機器學習面試問題彙總機器學習面試
- Android複習資料——常見面試演算法題彙總(二)Android面試演算法
- Android複習資料——常見面試演算法題彙總(一)Android面試演算法
- 演算法、資料結構 常見面試題演算法資料結構面試題
- 【LinuxSRE運維學習】2022最新Docker常見面試題彙總!Linux運維Docker面試題
- MySQL 鎖常見知識點&面試題總結MySql面試題
- 【機器學習基礎】常見損失函式總結機器學習函式
- 常見機器學習演算法背後的數學機器學習演算法
- MyBatis學習總結(24)——Mybatis常見問題彙總MyBatis
- 9 大主題!機器學習演算法理論面試題大彙總機器學習演算法面試題
- MySQL 事務常見面試題總結 | JavaGuide 稽核中MySql面試題JavaGUIIDE
- [圖解] 機器學習常見的基本演算法圖解機器學習演算法
- 常見Java面試知識點總結Java面試
- 為面試加油助力,90個常見的Kubernetes面試題,值得收藏學習面試題
- JavaScript常見面試題彙總(含答案)JavaScript面試題
- Java常見面試題及答案彙總Java面試題
- 【彙總】Python爬蟲常見面試題!Python爬蟲面試題
- 【搞定 Java 併發面試】面試最常問的 Java 併發基礎常見面試題總結!Java面試題
- 【Python學習教程】Python常見面試題之Redis篇!Python面試題Redis
- Vue常見的面試題Vue面試題
- 集合常見的面試題面試題
- Java常見的面試題Java面試題
- 常見的JVM 面試題JVM面試題
- 機器學習問題方法總結機器學習
- 軟體測試系統學習流程和常見面試題面試題
- 搞懂單連結串列常見面試題面試題