標籤:

KNN 與 SVM 的區別是什麼?


機器學習的本質不是去學習一個函數來正確預測所有的樣本,而是希望函數預測的誤差在可以控制的範圍之內。這也是所有模型希望達到和需要在理論上給予證明的。SVM的基礎就是這一套VC維和結構化風險最小化理論。而從這個角度來看KNN演算法,他的VC維遠遠大於SVM或者其他的一些學習模型,甚至可以說,KNN演算法沒有一個學習的過程。使用應用KNN演算法時,我們無法對預測的誤差有一個統計意義上的估計,結果的波動可能很大,這通常不是我們希望看到的。但是KNN的實現簡單,使用靈活,也有自己的用武之地。


一般分類任務主要有兩個步驟:1.訓練;2.測試。

對於SVM,是先在訓練集上訓練一個模型,然後用這個模型直接對測試集進行分類。這兩個步驟是獨立的。

對於KNN,沒有訓練過程。只是將訓練數據與訓練數據進行距離度量來實現分類。


KNN在識別過程的運算量會死人啊,適合做一些很簡單的實例


之前說的,knn是聚類,說的不對。http://www.tuicool.com/m/articles/qamYZv

這是詳細的說明knn和kmeans的區別。

對不起,小白在這說錯了。

knn是有監督的分類。

kmeans是聚類方法。無監督,但類別數需知。

svm是可用於解決高維數據。

利用margin(產生分界面)來進行分類。其值得說明的一點是,它可解決非線性分類問題,在低維空間里線性不可分,但將它們映射到高維空間里,預設它們是此時是線性可分的。然後利用margin進行分類。


KNN和SVM都屬於監督學習演算法。KNN是惰性學習機制,就是訓練的過程基本不需要太多處理,不過做文本這塊可能也需要計算並保留一下經驗IDF。SVM是比較新的分類演算法,訓練的時間複雜度比較高,特別是多個類別的時候,但是分類準確率一般來說要高於KNN。


1.

KNN對每個樣本考慮。

SVM是要去找一個函數把達到樣本可分。

2.

樸素的KNN是不會去自主學習特徵權重的。

SVM的本質就是在找權重。

3.

KNN如果樣本維度太高直接卡死。

SVM處理高維數據比較優秀。

具體原理題主可以百度或者維基,以上是我對KNN和SVM的一些見解而已。


個人感覺最大的區別是效率,其實KNN光看F1值還是不錯的,KNN是隋性學習法,導致來一條數據打成VSM後還得從頭到尾過一遍語料庫,而SVM訓練完成後,來一條文本只需要在打成VSM後加很少的計算就能結束了


求共同點


最大區別:

KNN預測時要用到全部訓練樣本點,非稀疏模型

SVM只用到支持向量,稀疏模型

最大相似:

KNN的距離度量函數類似SVM的核函數,勢的疊加也是類似的


正好最近的一個project兩個都在用,做完之後來答,先佔個坑。

KNN幾乎不train,說簡單一點,就是一圈一圈畫個年輪,比較trivial,也很好實現。

SVM要大量train,要不斷調整超平面的取向,使所分類各部到超平面的距離都能達到最大。

我所做的這個project數據跟Uniform Distribution差得太遠,skewed的程度很大,所以SVM在這裡能達到的f1-score不如KNN, 因為為了把很skewed的那部分data分出去,超平面已經向那部分數據反方向偏離太多了,過擬合程度太大。


1.knn沒有訓練過程,他的基本原理就是找到訓練數據集裡面離需要預測的樣本點距離最近的k個值(距離可以使用比如歐式距離,k的值需要自己調參),然後把這k個點的label做個投票,選出一個label做為預測。svm需要超平面wx+b來分割數據集(此處以線性可分為例),因此會有一個模型訓練過程來找到w和b的值。訓練完成之後就可以拿去預測了,根據函數y=wx+b的值來確定樣本點x的label,不需要再考慮訓練集。

2.根據第一條,兩者效率差別極大。knn沒有訓練過程,但是預測過程需要挨個計算每個訓練樣本和測試樣本的距離,當訓練集和測試集很大時,預測效率感人。svm有一個訓練過程,訓練完直接得到超平面函數,根據超平面函數直接判定預測點的label,預測效率很高(一般我們更關心預測效率)。

3.兩者調參過程不一樣。knn只有一個參數k,而svm的參數更多,在線性不可分的情況下(這種情況更普遍),有鬆弛變數的係數,有具體的核函數。

地鐵上隨手寫的,歡迎補充。


KNN相當於Local Weight Regression,無參數模型

SVM是參數化模型,選擇高斯核的時候他們有一定的相似性


KNN:原理比較簡單,可以需要很少量的樣本數據,但一定要足夠典型;高緯度情況下會瘋掉。

SVM:適合處理高緯度情況。

初學者愚見。。。我更想問的是:SVM和logistic回歸分別在什麼情況下使用?


參考 Similarity, Neighbors(KNN)【總結】


在分類中:

knn(k-nearest neighbor )

train階段:記住所有點

test階段:計算新加入的點a與原來數據中的每個點的歐式距離

預測:找到和點a最近的k個點,看k個點屬於哪一個分類的點最多,就將點a划到那一個類

缺點:test階段花費時間太多

svm(support vector machine)和knn差別很大的,反而是logistic regression比較像

分類演算法,區別在於邏輯回歸採用的是logistical loss,svm採用的是hinge loss.這兩個損失函數的目的都是增加對分類影響較大的數據點的權重,減少與分類關係較小的數據點的權重。svm通過支持向量,所以具有稀疏性。而logistic回歸通過使用權重,降低異常點的權重。


svm, 就像是在河北和北京之間有一條邊界線,如果一個人居住在北京一側就預測為北京人,在河北一側,就預測為河北人。但是住在河北的北京人和住在北京的河北人就會被誤判。

knn,就是物以類聚,人以群分。如果你的朋友里大部分是北京人,就預測你也是北京人。如果你的朋友里大部分是河北人,那就預測你是河北人。不管你住哪裡。


給樓主說個簡單的例子,一個中心的點是紅色,六個環繞他的點是綠色(正六邊形吧)

knn最後給的邊界(假設k=1)是一個正六邊形

svm給的邊界是一個圓(kernel function取歐拉距離)


推薦閱讀:

支持向量機中的函數距離和幾何距離怎麼理解?
支持向量機(SVM)是否適合大規模數據?
為什麼支持向量機要用拉格朗日對偶演算法來解最大化間隔問題?
多標籤(multi-label)數據的學習問題,常用的分類器或者分類策略有哪些?

TAG:數據挖掘 | SVM |