knn是k-nearest neighbor的簡寫,直譯為k-近鄰演算法。
顧名思義,找到最近的k個資料,在前k個資料中選擇佔比最高的類別作為**類別。
如**分類的例子,**可以分為軍事**和網遊**,軍事**的以戰爭描寫為主,網遊**以網路遊戲描述為主。假設一本沒看過的**(假設這本**是軍事**和網遊**之一),我們使用k-近鄰演算法來進行判斷它是屬於軍事**還是網遊**。
我們統計了3本軍事**和3本網遊**裡出現戰爭描述和網路遊戲描述的次數,以及我們沒看過的這本**裡出現戰爭描述和網路遊戲描述的次數。如下表所示。
**名稱
戰爭描述
網遊描述型別1
252網遊2
505戰爭3
140網遊4
250網遊5
513戰爭6
492戰爭7
945未知k-近鄰演算法是怎麼判斷的呢,計算未知的**與那6本**的距離,距離的演算法再說,下表是計算出的距離。
**名稱
距離型別
49.3網遊3
9.6網遊110
網遊257戰爭
659.5戰爭5
59.7
戰爭把距離按照從小到大排序之後,我們可以找到k個距離最近的電影。假定k=3,可以看出最近的3個**是4、3和1,型別都是網遊**,因此我們判斷未知**為網遊**。
這就是knn的簡單描述。
優點:
簡單,易於理解和實現,無需估計引數;
適合對稀有事件進行分類;
特別適合於多分類問題(multi-modal,物件具有多個類別標籤)。
缺點:
計算量較大,要對每乙個待分類的文字都要計算它到全體已知樣本的距離。
空間複雜度高。
適用資料:標稱型和數值型。
標稱型:一般在有限的資料中取,而且只存在『是』和『否』兩種不同的結果。
數值型:可以在無限的資料中取,而且數值比較具體化,例如5.03,2.85這種值。
來自機器學習實戰這本書。
from numpy import
*import operator
defcreatedataset()
: group = array([[
1.0,
1.1],[
1.0,
1.0],[
0,0]
,[0,
0.1]])
labels =
['a'
,'a'
,'b'
,'b'
]return group,labels
defclassify0
(inx,dataset,labels,k)
: datasetsize = dataset.shape[0]
#計算歐氏距離
diff1 = tile(inx,
(datasetsize,1)
)- dataset
diff2 = diff1**
2 diff3 = diff2.
sum(axis=1)
diff4 = diff3**
0.5 diff = diff4.argsort(
) classcount=
#選擇最小的距離
for i in
range
(k):
voteilabel = labels[diff[i]
] classcount[voteilabel]
= classcount.get(voteilabel,0)
+1#排序 sortedclasscount =
sorted
( classcount.iteritems(
),key=operator.itemgetter(1)
,reverse=true)
return sortedclasscount[0][0]
en 機器學習實戰 KNN演算法(K近鄰)
演算法實現 演算法應用舉例 k近鄰演算法是機器學習最簡單的演算法之一,也是機器學習的初步,其主要通過大量的資料分析,判斷一組未知資料和各資料的距離,從而對一組未知資料進行相應的歸類。而所謂k最近鄰,就是k個最近的鄰居的意思,說的是每個樣本都可以用它最接近的k個鄰居來代表。所以knn演算法並不是十分完...
《機器學習實戰》 k近鄰分類演算法kNN
knn全稱為k nearest neighbors,是模式識別中比較簡單的一種演算法,可以用於分類和回歸。使用時,輸入的訓練樣本帶有標籤,輸出根據是用於分類還是回歸 分類問題的輸出為 找出k個和要 物件最近鄰的樣本,這k個樣本中,大多數 屬於哪一類即為 物件的分類標籤。回歸問題的輸出為 找出k個和回...
機器學習之 K近鄰演算法(KNN)
k近鄰演算法是機器學習中的最基礎的演算法之一,也是必須會講解的演算法之一。因為其簡單,易懂。但是k近鄰演算法在實際應用中卻很少使用到,由於其侷限性很強,執行效率低下。那麼所謂的k近鄰中的近鄰是指 已有乙個訓練資料集,現給定乙個新的資料,利用現有資料集對其進行 那麼 方法便是尋找與給定資料距離最近的k...