1. 程式人生 > >Kmeans、Kmeans++和KNN算法比較

Kmeans、Kmeans++和KNN算法比較

aps 公式 算法思路 相互 png 非監督學習 位置 ide base

K-Means介紹

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++算法來解決)

針對上述第2個缺陷,能夠使用Kmeans++算法來解決

K-Means ++ 算法

k-means++算法選擇初始seeds的基本思想就是:初始的聚類中心之間的相互距離要盡可能的遠。

  1. 從輸入的數據點集合中隨機選擇一個點作為第一個聚類中心
  2. 對於數據集中的每個點x。計算它與近期聚類中心(指已選擇的聚類中心)的距離D(x)
  3. 選擇一個新的數據點作為新的聚類中心,選擇的原則是:D(x)較大的點,被選取作為聚類中心的概率較大
  4. 反復2和3直到k個聚類中心被選出來
  5. 利用這k個初始的聚類中心來執行標準的k-means算法
從上面的算法描寫敘述上能夠看到。算法的關鍵是第3步,怎樣將D(x)反映到點被選擇的概率上,一種算法例如以下:
  1. 先從我們的數據庫隨機挑個隨機點當“種子點”
  2. 對於每一個點。我們都計算其和近期的一個“種子點”的距離D(x)並保存在一個數組裏。然後把這些距離加起來得到Sum(D(x))。

  3. 然後。再取一個隨機值。用權重的方式來取計算下一個“種子點”。

    這個算法的實現是。先取一個能落在Sum(D(x))中的隨機值Random。然後用Random -= D(x),直到其<=0。此時的點就是下一個“種子點”。

  4. 反復2和3直到k個聚類中心被選出來
  5. 利用這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。

Kmeans、Kmeans++和KNN算法比較