機器學習&數據挖掘筆記_16(常見面試之機器學習算法思想簡單梳理)

 

  前言:html

  找工做時(IT行業),除了常見的軟件開發之外,機器學習崗位也能夠看成是一個選擇,很多計算機方向的研究生都會接觸這個,若是你的研究方向是機器學習/數據挖掘之類,且又對其很是感興趣的話,能夠考慮考慮該崗位,畢竟在機器智能沒達到人類水平以前,機器學習能夠做爲一種重要手段,而隨着科技的不斷髮展,相信這方面的人才需求也會愈來愈大。面試

  縱觀IT行業的招聘崗位,機器學習之類的崗位仍是挺少的,國內大點的公司裏百度,阿里,騰訊,網易,搜狐,華爲(華爲的崗位基本都是隨機分配,機器學習等崗位基本面向的是博士)等會有相關職位,另一些國內的中小型企業和外企也會招一小部分。固然了,其中大部分仍是百度北京要人最多,上百人。阿里的算法崗位很大一部分也是搞機器學習相關的。另外本人有幸簽約了網易杭州研究院的深度學習算法崗位,打算從事機器學習領域至少5年。很是感謝小易收留了我!算法

  下面是本人在找機器學習崗位工做時,總結的常見機器學習算法(主要是一些常規分類器)大概流程和主要思想,但願對你們找機器學習崗位時有點幫助。實際上在面試過程當中,懂這些算法的基本思想和大概流程是遠遠不夠的,那些面試官每每問的都是一些公司內部業務中的課題,每每要求你不只要懂得這些算法的理論過程,並且要很是熟悉怎樣使用它,什麼場合用它,算法的優缺點,以及調參經驗等等。說白了,就是既要會點理論,也要會點應用,既要有點深度,也要有點廣度,不然運氣很差的話很容易就被刷掉,由於每一個面試官愛好不一樣。機器學習

 

 

  樸素貝葉斯:函數

  有如下幾個地方須要注意:學習

  1. 若是給出的特徵向量長度可能不一樣,這是須要歸一化爲通長度的向量(這裏以文本分類爲例),好比說是句子單詞的話,則長度爲整個詞彙量的長度,對應位置是該單詞出現的次數。測試

  2. 計算公式以下:大數據

   

  其中一項條件機率能夠經過樸素貝葉斯條件獨立展開。要注意一點就是 的計算方法,而由樸素貝葉斯的前提假設可知, = ,所以通常有兩種,一種是在類別爲ci的那些樣本集中,找到wj出現次數的總和,而後除以該樣本的總和;第二種方法是類別爲ci的那些樣本集中,找到wj出現次數的總和,而後除以該樣本中全部特徵出現次數的總和。優化

  3. 若是 中的某一項爲0,則其聯合機率的乘積也可能爲0,即2中公式的分子爲0,爲了不這種現象出現,通常狀況下會將這一項初始化爲1,固然爲了保證機率相等,分母應對應初始化爲2(這裏由於是2類,因此加2,若是是k類就須要加k,術語上叫作laplace光滑, 分母加k的緣由是使之知足全機率公式)。google

  樸素貝葉斯的優勢:

  對小規模的數據表現很好,適合多分類任務,適合增量式訓練。

  缺點

  對輸入數據的表達形式很敏感。

 

 

  決策樹:

  決策樹中很重要的一點就是選擇一個屬性進行分枝,所以要注意一下信息增益的計算公式,並深刻理解它。

  信息熵的計算公式以下:

   

  其中的n表明有n個分類類別(好比假設是2類問題,那麼n=2)。分別計算這2類樣本在總樣本中出現的機率p1和p2,這樣就能夠計算出未選中屬性分枝前的信息熵。

  如今選中一個屬性xi用來進行分枝,此時分枝規則是:若是xi=vx的話,將樣本分到樹的一個分支;若是不相等則進入另外一個分支。很顯然,分支中的樣本頗有可能包括2個類別,分別計算這2個分支的熵H1和H2,計算出分枝後的總信息熵H’=p1*H1+p2*H2.,則此時的信息增益ΔH=H-H’。以信息增益爲原則,把全部的屬性都測試一邊,選擇一個使增益最大的屬性做爲本次分枝屬性。

  決策樹的優勢:

  計算量簡單,可解釋性強,比較適合處理有缺失屬性值的樣本,可以處理不相關的特徵;

  缺點:

  容易過擬合(後續出現了隨機森林,減少了過擬合現象);

 

 

  Logistic迴歸:

  Logistic是用來分類的,是一種線性分類器,須要注意的地方有:

  1. logistic函數表達式爲:

   

  其導數形式爲:

   

  2. logsitc迴歸方法主要是用最大似然估計來學習的,因此單個樣本的後驗機率爲:

   

  到整個樣本的後驗機率:

   

  其中:

   

  經過對數進一步化簡爲:

   

  3. 其實它的loss function爲-l(θ),所以咱們需使loss function最小,可採用梯度降低法獲得。梯度降低法公式爲:

   

  

  Logistic迴歸優勢:

  一、實現簡單;

  二、分類時計算量很是小,速度很快,存儲資源低;

  缺點:

  一、容易欠擬合,通常準確度不過高

  二、只能處理兩分類問題(在此基礎上衍生出來的softmax能夠用於多分類),且必須線性可分;

 

 

  線性迴歸:

  線性迴歸纔是真正用於迴歸的,而不像logistic迴歸是用於分類,其基本思想是用梯度降低法對最小二乘法形式的偏差函數進行優化,固然也能夠用normal equation直接求得參數的解,結果爲:

   

  而在LWLR(局部加權線性迴歸)中,參數的計算表達式爲:

   

  由於此時優化的是:

   

  因而可知LWLR與LR不一樣,LWLR是一個非參數模型,由於每次進行迴歸計算都要遍歷訓練樣本至少一次。

  線性迴歸優勢:

  實現簡單,計算簡單;

  缺點:

  不能擬合非線性數據;

 

 

  KNN算法:

  KNN即最近鄰算法,其主要過程爲:

  1. 計算訓練樣本和測試樣本中每一個樣本點的距離(常見的距離度量有歐式距離,馬氏距離等);

  2. 對上面全部的距離值進行排序;

  3. 選前k個最小距離的樣本;

  4. 根據這k個樣本的標籤進行投票,獲得最後的分類類別;

  如何選擇一個最佳的K值,這取決於數據。通常狀況下,在分類時較大的K值可以減少噪聲的影響。但會使類別之間的界限變得模糊。一個較好的K值可經過各類啓發式技術來獲取,好比,交叉驗證。另外噪聲和非相關性特徵向量的存在會使K近鄰算法的準確性減少。

  近鄰算法具備較強的一致性結果。隨着數據趨於無限,算法保證錯誤率不會超過貝葉斯算法錯誤率的兩倍。對於一些好的K值,K近鄰保證錯誤率不會超過貝葉斯理論偏差率。

  注:馬氏距離必定要先給出樣本集的統計性質,好比均值向量,協方差矩陣等。關於馬氏距離的介紹以下:

   

  KNN算法的優勢:

  1. 思想簡單,理論成熟,既能夠用來作分類也能夠用來作迴歸;

  2. 可用於非線性分類;

  3. 訓練時間複雜度爲O(n);

  4. 準確度高,對數據沒有假設,對outlier不敏感;

  缺點:

  1. 計算量大;

  2. 樣本不平衡問題(即有些類別的樣本數量不少,而其它樣本的數量不多);

  3. 須要大量的內存;

 

 

  SVM

  要學會如何使用libsvm以及一些參數的調節經驗,另外須要理清楚svm算法的一些思路:

  1. svm中的最優分類面是對全部樣本的幾何裕量最大(爲何要選擇最大間隔分類器,請從數學角度上說明?網易深度學習崗位面試過程當中有被問到。答案就是幾何間隔與樣本的誤分次數間存在關係: ,其中的分母就是樣本到分類間隔距離,分子中的R是全部樣本中的最長向量值),即:

   

  通過一系列推導可得爲優化下面原始目標:

  

  2. 下面來看看拉格朗日理論:

  

  能夠將1中的優化目標轉換爲拉格朗日的形式(經過各類對偶優化,KKD條件),最後目標函數爲:

   

  咱們只須要最小化上述目標函數,其中的α爲原始優化問題中的不等式約束拉格朗日系數。

  3. 對2中最後的式子分別w和b求導可得:

  

   

  由上面第1式子能夠知道,若是咱們優化出了α,則直接能夠求出w了,即模型的參數搞定。而上面第2個式子能夠做爲後續優化的一個約束條件。

  4. 對2中最後一個目標函數用對偶優化理論能夠轉換爲優化下面的目標函數:

  

  而這個函數能夠用經常使用的優化方法求得α,進而求得w和b。

  5. 按照道理,svm簡單理論應該到此結束。不過仍是要補充一點,即在預測時有:

   

  那個尖括號咱們能夠用核函數代替,這也是svm常常和核函數扯在一塊兒的緣由。

  6. 最後是關於鬆弛變量的引入,所以原始的目標優化公式爲:

   

  此時對應的對偶優化公式爲:

   

  與前面的相比只是α多了個上界。

  SVM算法優勢:

  可用於線性/非線性分類,也能夠用於迴歸;

  低泛化偏差;

  容易解釋;

  計算複雜度較低;

  缺點:

  對參數和核函數的選擇比較敏感;

  原始的SVM只比較擅長處理二分類問題;

 

 

  Boosting

  主要以Adaboost爲例,首先來看看Adaboost的流程圖,以下:

   

  從圖中能夠看到,在訓練過程當中咱們須要訓練出多個弱分類器(圖中爲3個),每一個弱分類器是由不一樣權重的樣本(圖中爲5個訓練樣本)訓練獲得(其中第一個弱分類器對應輸入樣本的權值是同樣的),而每一個弱分類器對最終分類結果的做用也不一樣,是經過加權平均輸出的,權值見上圖中三角形裏面的數值。那麼這些弱分類器和其對應的權值是怎樣訓練出來的呢?

  下面經過一個例子來簡單說明。

  書中(machine learning in action)假設的是5個訓練樣本,每一個訓練樣本的維度爲2,在訓練第一個分類器時5個樣本的權重各爲0.2. 注意這裏樣本的權值和最終訓練的弱分類器組對應的權值α是不一樣的,樣本的權重只在訓練過程當中用到,而α在訓練過程和測試過程都有用到。

  如今假設弱分類器是帶一個節點的簡單決策樹,該決策樹會選擇2個屬性(假設只有2個屬性)的一個,而後計算出這個屬性中的最佳值用來分類。

  Adaboost的簡單版本訓練過程以下:

  1. 訓練第一個分類器,樣本的權值D爲相同的均值。經過一個弱分類器,獲得這5個樣本(請對應書中的例子來看,依舊是machine learning in action)的分類預測標籤。與給出的樣本真實標籤對比,就可能出現偏差(即錯誤)。若是某個樣本預測錯誤,則它對應的錯誤值爲該樣本的權重,若是分類正確,則錯誤值爲0. 最後累加5個樣本的錯誤率之和,記爲ε。

  2. 經過ε來計算該弱分類器的權重α,公式以下:

   

  3. 經過α來計算訓練下一個弱分類器樣本的權重D,若是對應樣本分類正確,則減少該樣本的權重,公式爲:

   

  若是樣本分類錯誤,則增長該樣本的權重,公式爲:

   

  4. 循環步驟1,2,3來繼續訓練多個分類器,只是其D值不一樣而已。

  測試過程以下:

  輸入一個樣本到訓練好的每一個弱分類中,則每一個弱分類都對應一個輸出標籤,而後該標籤乘以對應的α,最後求和獲得值的符號即爲預測標籤值。

  Boosting算法的優勢:

  低泛化偏差;

  容易實現,分類準確率較高,沒有太多參數能夠調;

  缺點:

  對outlier比較敏感;

 

 

  聚類:

  根據聚類思想劃分:

  1. 基於劃分的聚類:

  K-means, k-medoids(每個類別中找一個樣本點來表明),CLARANS.

  k-means是使下面的表達式值最小:

   

   k-means算法的優勢:

  (1)k-means算法是解決聚類問題的一種經典算法,算法簡單、快速。

  (2)對處理大數據集,該算法是相對可伸縮的和高效率的,由於它的複雜度大約是O(nkt),其中n是全部對象的數目,k是簇的數目,t是迭代的次數。一般k<<n。這個算法一般局部收斂。

  (3)算法嘗試找出使平方偏差函數值最小的k個劃分。當簇是密集的、球狀或團狀的,且簇與簇之間區別明顯時,聚類效果較好。

   缺點:

  (1)k-平均方法只有在簇的平均值被定義的狀況下才能使用,且對有些分類屬性的數據不適合。

  (2)要求用戶必須事先給出要生成的簇的數目k。

  (3)對初值敏感,對於不一樣的初始值,可能會致使不一樣的聚類結果。

  (4)不適合於發現非凸面形狀的簇,或者大小差異很大的簇。

  (5)對於"噪聲"和孤立點數據敏感,少許的該類數據可以對平均值產生極大影響。

  2. 基於層次的聚類:

  自底向上的凝聚方法,好比AGNES。

  自上向下的分裂方法,好比DIANA。

  3. 基於密度的聚類:

  DBSACN,OPTICS,BIRCH(CF-Tree),CURE.

  4. 基於網格的方法:

  STING, WaveCluster.

  5. 基於模型的聚類:

  EM,SOM,COBWEB.

  以上這些算法的簡介可參考聚類(百度百科)。

 

 

   推薦系統:

  推薦系統的實現主要分爲兩個方面:基於內容的實現和協同濾波的實現。

  基於內容的實現:

  不一樣人對不一樣電影的評分這個例子,能夠看作是一個普通的迴歸問題,所以每部電影都須要提早提取出一個特徵向量(即x值),而後針對每一個用戶建模,即每一個用戶打的分值做爲y值,利用這些已有的分值y和電影特徵值x就能夠訓練迴歸模型了(最多見的就是線性迴歸)。這樣就能夠預測那些用戶沒有評分的電影的分數。(值得注意的是需對每一個用戶都創建他本身的迴歸模型)

  從另外一個角度來看,也能夠是先給定每一個用戶對某種電影的喜愛程度(即權值),而後學出每部電影的特徵,最後採用迴歸來預測那些沒有被評分的電影。

  固然還能夠是同時優化獲得每一個用戶對不一樣類型電影的熱愛程度以及每部電影的特徵。具體能夠參考Ng在coursera上的ml教程:https://www.coursera.org/course/ml

  基於協同濾波的實現:

  協同濾波(CF)能夠看作是一個分類問題,也能夠看作是矩陣分解問題。協同濾波主要是基於每一個人本身的喜愛都相似這一特徵,它不依賴於我的的基本信息。好比剛剛那個電影評分的例子中,預測那些沒有被評分的電影的分數只依賴於已經打分的那些分數,並不須要去學習那些電影的特徵。

  SVD將矩陣分解爲三個矩陣的乘積,公式以下所示:

   

  中間的矩陣sigma爲對角矩陣,對角元素的值爲Data矩陣的奇異值(注意奇異值和特徵值是不一樣的),且已經從大到小排列好了。即便去掉特徵值小的那些特徵,依然能夠很好的重構出原始矩陣。以下圖所示:

  

  其中更深的顏色表明去掉小特徵值重構時的三個矩陣。

  果m表明商品的個數,n表明用戶的個數,則U矩陣的每一行表明商品的屬性,如今經過降維U矩陣(取深色部分)後,每個商品的屬性能夠用更低的維度表示(假設爲k維)。這樣當新來一個用戶的商品推薦向量X,則能夠根據公式X'*U1*inv(S1)獲得一個k維的向量,而後在V’中尋找最類似的那一個用戶(類似度測量可用餘弦公式等),根據這個用戶的評分來推薦(主要是推薦新用戶未打分的那些商品)。具體例子能夠參考網頁:SVD在推薦系統中的應用

  另外關於SVD分解後每一個矩陣的實際含義能夠參考google吳軍的《數學之美》一書(不過我的感受吳軍解釋UV兩個矩陣時好像弄反了,不知道你們怎樣認爲)。或者參考machine learning in action其中的svd章節。

 

 

  pLSA:

  pLSA由LSA發展過來,而早期LSA的實現主要是經過SVD分解。pLSA的模型圖以下:

   

  公式中的意義以下:

   

  具體能夠參考2010龍星計劃:機器學習中對應的主題模型那一講

 

 

  LDA

  主題模型,機率圖以下:

   

  和pLSA不一樣的是LDA中假設了不少先驗分佈,且通常參數的先驗分佈都假設爲Dirichlet分佈,其緣由是共軛分佈時先驗機率和後驗機率的形式相同。

 

 

  GDBT

  GBDT(Gradient Boosting Decision Tree) 又叫 MART(Multiple Additive Regression Tree),好像在阿里內部用得比較多(因此阿里算法崗位面試時可能會問到),它是一種迭代的決策樹算法,該算法由多棵決策樹組成,全部樹的輸出結果累加起來就是最終答案。它在被提出之初就和SVM一塊兒被認爲是泛化能力(generalization)較強的算法。近些年更由於被用於搜索排序的機器學習模型而引發你們關注。

  GBDT是迴歸樹,不是分類樹。其核心就在於,每一棵樹是從以前全部樹的殘差中來學習的。爲了防止過擬合,和Adaboosting同樣,也加入了boosting這一項。

  關於GDBT的介紹能夠能夠參考:GBDT(MART) 迭代決策樹入門教程 | 簡介

 

 

  Regularization:

  做用是(網易電話面試時有問到):

  1. 數值上更容易求解;

  2. 特徵數目太大時更穩定;

  3. 控制模型的複雜度,光滑性。複雜性越小且越光滑的目標函數泛化能力越強。而加入規則項能使目標函數複雜度減少,且更光滑。

  4. 減少參數空間;參數空間越小,複雜度越低。

  5. 係數越小,模型越簡單,而模型越簡單則泛化能力越強(Ng宏觀上給出的解釋)。

  6. 能夠當作是權值的高斯先驗。

 

 

  異常檢測:

  能夠估計樣本的密度函數,對於新樣本直接計算其密度,若是密度值小於某一閾值,則表示該樣本異常。而密度函數通常採用多維的高斯分佈。若是樣本有n維,則每一維的特徵均可以看做是符合高斯分佈的,即便這些特徵可視化出來不太符合高斯分佈,也能夠對該特徵進行數學轉換讓其看起來像高斯分佈,好比說x=log(x+c), x=x^(1/c)等。異常檢測的算法流程以下:

   

   其中的ε也是經過交叉驗證獲得的,也就是說在進行異常檢測時,前面的p(x)的學習是用的無監督,後面的參數ε學習是用的有監督。那麼爲何不所有使用普通有監督的方法來學習呢(即把它看作是一個普通的二分類問題)?主要是由於在異常檢測中,異常的樣本數量很是少而正常樣本數量很是多,所以不足以學習到好的異常行爲模型的參數,由於後面新來的異常樣本可能徹底是與訓練樣本中的模式不一樣。

  另外,上面是將特徵的每一維當作是相互獨立的高斯分佈,其實這樣的近似並非最好的,可是它的計算量較小,所以也常被使用。更好的方法應該是將特徵擬合成多維高斯分佈,這時有特徵之間的相關性,但隨之計算量會變複雜,且樣本的協方差矩陣還可能出現不可逆的狀況(主要在樣本數比特徵數小,或者樣本特徵維數之間有線性關係時)。

  上面的內容能夠參考Ng的https://www.coursera.org/course/ml

 

 

  EM算法:

  有時候由於樣本的產生和隱含變量有關(隱含變量是不能觀察的),而求模型的參數時通常採用最大似然估計,因爲含有了隱含變量,因此對似然函數參數求導是求不出來的,這時能夠採用EM算法來求模型的參數的(對應模型參數個數可能有多個),EM算法通常分爲2步:

  E步:選取一組參數,求出在該參數下隱含變量的條件機率值;

  M步:結合E步求出的隱含變量條件機率,求出似然函數下界函數(本質上是某個指望函數)的最大值。

  重複上面2步直至收斂。

  公式以下所示:

   

  M步公式中下界函數的推導過程:

   

  EM算法一個常見的例子就是GMM模型,每一個樣本都有可能由k個高斯產生,只不過由每一個高斯產生的機率不一樣而已,所以每一個樣本都有對應的高斯分佈(k箇中的某一個),此時的隱含變量就是每一個樣本對應的某個高斯分佈。

  GMM的E步公式以下(計算每一個樣本對應每一個高斯的機率):

   

  更具體的計算公式爲:

  

  M步公式以下(計算每一個高斯的比重,均值,方差這3個參數):

   

  關於EM算法能夠參考Ng的cs229課程資料 或者網易公開課:斯坦福大學公開課 :機器學習課程

 

 

  Apriori:

  Apriori是關聯分析中比較早的一種方法,主要用來挖掘那些頻繁項集合。其思想是:

  1. 若是一個項目集合不是頻繁集合,那麼任何包含它的項目集合也必定不是頻繁集合;

  2. 若是一個項目集合是頻繁集合,那麼它的任何非空子集也是頻繁集合;

  Aprioir須要掃描項目表多遍,從一個項目開始掃描,捨去掉那些不是頻繁的項目,獲得的集合稱爲L,而後對L中的每一個元素進行自組合,生成比上次掃描多一個項目的集合,該集合稱爲C,接着又掃描去掉那些非頻繁的項目,重複…

  看下面這個例子:

  元素項目表格:

   

  若是每一個步驟不去掉非頻繁項目集,則其掃描過程的樹形結構以下:

   

  在其中某個過程當中,可能出現非頻繁的項目集,將其去掉(用陰影表示)爲:

   

  上面的內容主要參考的是machine learning in action這本書。

 

 

  FP Growth:

  FP Growth是一種比Apriori更高效的頻繁項挖掘方法,它只須要掃描項目表2次。其中第1次掃描得到當個項目的頻率,去掉不符合支持度要求的項,並對剩下的項排序。第2遍掃描是創建一顆FP-Tree(frequent-patten tree)。

  接下來的工做就是在FP-Tree上進行挖掘。

  好比說有下表:

   

  它所對應的FP_Tree以下:

   

  而後從頻率最小的單項P開始,找出P的條件模式基,用構造FP_Tree一樣的方法來構造P的條件模式基的FP_Tree,在這棵樹上找出包含P的頻繁項集。

  依次從m,b,a,c,f的條件模式基上挖掘頻繁項集,有些項須要遞歸的去挖掘,比較麻煩,好比m節點,具體的過程能夠參考博客:Frequent Pattern 挖掘之二(FP Growth算法),裏面講得很詳細。

 

 

  參考資料:

   Harrington, P. (2012). Machine Learning in Action, Manning Publications Co.

      最近鄰算法(維基百科)

      馬氏距離(維基百科)

   聚類(百度百科)

      https://www.coursera.org/course/ml

      SVD在推薦系統中的應用

      吳軍 and 谷歌 (2012). 數學之美, 人民郵電出版社.

      2010龍星計劃:機器學習 對應的視頻教程: 2010龍星計劃機器學習視頻教程

      GBDT(MART) 迭代決策樹入門教程 | 簡介

      Ng的cs229課程資料

      斯坦福大學公開課 :機器學習課程

      Frequent Pattern 挖掘之二(FP Growth算法)

相關文章
相關標籤/搜索