最近研究數據挖掘的相關知識,總是搞混一些算法之間的關聯,俗話說好記性不如爛筆頭,還是記下了以備不時之需。
首先明確一點KNN與Kmeans的算法的區別:
1.KNN算法是分類算法,分類算法肯定是需要有學習語料,然后通過學習語料的學習之后的模板來匹配我們的測試語料集,將測試語料集合進行按照預先學習的語料模板來分類
2Kmeans算法是聚類算法,聚類算法與分類算法最大的區別是聚類算法沒有學習語料集合。
K-means算法是聚類分析中使用最廣泛的算法之一。它把n個對象根據他們的屬性分為k個聚類以便使得所獲得的聚類滿足:同一聚類中的對象相似度較高;而不同聚類中的對象相似度較小。其聚類過程可以用下圖表示:
如圖所示,數據樣本用圓點表示,每個簇的中心點用叉叉表示。(a)剛開始時是原始數據,雜亂無章,沒有label,看起來都一樣,都是綠色的。(b)假設 數據集可以分為兩類,令K=2,隨機在坐標上選兩個點,作為兩個類的中心點。(c-f)演示了聚類的兩種迭代。先划分,把每個數據樣本划分到最近的中心點 那一簇;划分完后,更新每個簇的中心,即把該簇的所有數據點的坐標加起來去平均值。這樣不斷進行”划分—更新—划分—更新”,直到每個簇的中心不在移動為 止。
該算法過程比較簡單,但有些東西我們還是需要關注一下,此處,我想說一下"求點中心的算法"
一般來說,求點群中心點的算法你可以很簡的使用各個點的X/Y坐標的平均值。也可以用另三個求中心點的的公式:
1)Minkowski Distance 公式 —— λ 可以隨意取值,可以是負數,也可以是正數,或是無窮大。
2)Euclidean Distance 公式 —— 也就是第一個公式 λ=2 的情況
3)CityBlock Distance 公式 —— 也就是第一個公式 λ=1 的情況
這三個公式的求中心點有一些不一樣的地方,我們看下圖(對於第一個 λ 在 0-1之間)。
(1)Minkowski Distance (2)Euclidean Distance (3)CityBlock Distance
上面這幾個圖的大意是他們是怎么個逼近中心的,第一個圖以星形的方式,第二個圖以同心圓的方式,第三個圖以菱形的方式。
Kmeans算法的缺陷
- 聚類中心的個數K 需要事先給定,但在實際中這個 K 值的選定是非常難以估計的,很多時候,事先並不知道給定的數據集應該分成多少個類別才最合適
- Kmeans需要人為地確定初始聚類中心,不同的初始聚類中心可能導致完全不同的聚類結果。(可以使用Kmeans++算法來解決)
K-Means ++ 算法
k-means++算法選擇初始seeds的基本思想就是:初始的聚類中心之間的相互距離要盡可能的遠。
- 從輸入的數據點集合中隨機選擇一個點作為第一個聚類中心
- 對於數據集中的每一個點x,計算它與最近聚類中心(指已選擇的聚類中心)的距離D(x)
- 選擇一個新的數據點作為新的聚類中心,選擇的原則是:D(x)較大的點,被選取作為聚類中心的概率較大
- 重復2和3直到k個聚類中心被選出來
- 利用這k個初始的聚類中心來運行標准的k-means算法
- 先從我們的數據庫隨機挑個隨機點當“種子點”
- 對於每個點,我們都計算其和最近的一個“種子點”的距離D(x)並保存在一個數組里,然后把這些距離加起來得到Sum(D(x))。
- 然后,再取一個隨機值,用權重的方式來取計算下一個“種子點”。這個算法的實現是,先取一個能落在Sum(D(x))中的隨機值Random,然后用Random -= D(x),直到其<=0,此時的點就是下一個“種子點”。
- 重復2和3直到k個聚類中心被選出來
- 利用這k個初始的聚類中心來運行標准的k-means算法
可以看到算法的第三步選取新中心的方法,這樣就能保證距離D(x)較大的點,會被選出來作為聚類中心了。至於為什么原因比較簡單,如下圖 所示:
假設A、B、C、D的D(x)如上圖所示,當算法取值Sum(D(x))*random時,該值會以較大的概率落入D(x)較大的區間內,所以對應的點會以較大的概率被選中作為新的聚類中心。
k-means++代碼:http://rosettacode.org/wiki/K-means%2B%2B_clustering
KNN(K-Nearest Neighbor)介紹
算法思路:如果一個樣本在特征空間中的k個最相似(即特征空間中最鄰近)的樣本中的大多數屬於某一個類別,則該樣本也屬於這個類別。該方法在定類決策上只依據最鄰近的一個或者幾個樣本的類別來決定待分樣本所屬的類別。
KNN的算法過程是是這樣的:
從上圖中我們可以看到,圖中的數據集是良好的數據,即都打好了label,一類是藍色的正方形,一類是紅色的三角形,那個綠色的圓形是我們待分類的數據。
如果K=3,那么離綠色點最近的有2個紅色三角形和1個藍色的正方形,這3個點投票,於是綠色的這個待分類點屬於紅色的三角形
如果K=5,那么離綠色點最近的有2個紅色三角形和3個藍色的正方形,這5個點投票,於是綠色的這個待分類點屬於藍色的正方形
我們可以看到,KNN本質是基於一種數據統計的方法!其實很多機器學習算法也是基於數據統計的。
KNN是一種memory-based learning,也叫instance-based learning,屬於lazy learning。即它沒有明顯的前期訓練過程,而是程序開始運行時,把數據集加載到內存后,不需要進行訓練,就可以開始分類了。
具體是每次來一個未知的樣本點,就在附近找K個最近的點進行投票。
再舉一個例子,Locally weighted regression (LWR)也是一種 memory-based 方法,如下圖所示的數據集。
用任何一條直線來模擬這個 數據集都是不行的,因為這個數據集看起來不像是一條直線。但是每個局部范圍內的數據點,可以認為在一條直線上。每次來了一個位置樣本x,我們在X軸上以該 數據樣本為中心,左右各找幾個點,把這幾個樣本點進行線性回歸,算出一條局部的直線,然后把位置樣本x代入這條直線,就算出了對應的y,完成了一次線性回 歸。也就是每次來一個數據點,都要訓練一條局部直線,也即訓練一次,就用一次。LWR和KNN很相似,都是為位置數據量身定制,在局部進行訓練。
KNN和K-Means的區別
KNN |
K-Means |
1.KNN是分類算法 2.監督學習 3.喂給它的數據集是帶label的數據,已經是完全正確的數據 |
1.K-Means是聚類算法 2.非監督學習 3.喂給它的數據集是無label的數據,是雜亂無章的,經過聚類后才變得有點順序,先無序,后有序 |
沒有明顯的前期訓練過程,屬於memory-based learning | 有明顯的前期訓練過程 |
K的含義:來了一個樣本x,要給它分類,即求出它的y,就從數據集中,在x附近找離它最近的K個數據點,這K個數據點,類別c占的個數最多,就把x的label設為c | K的含義:K是人工固定好的數字,假設數據集合可以分為K個簇,由於是依靠人工定好,需要一點先驗知識 |
|
|
相似點:都包含這樣的過程,給定一個點,在數據集中找離它最近的點。即二者都用到了NN(Nears Neighbor)算法,一般用KD樹來實現NN。 文中參考:http://blog.csdn.net/chlele0105/article/details/12997391 |