最近研究資料探勘的相關知識,總是搞混一些演算法之間的關聯,俗話說好記性不如爛筆頭,還是記下了以備不時之需。
首先明確一點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之間)。
上面這幾個圖的大意是他們是怎麼個逼近中心的,第乙個圖以星形的方式,第二個圖以同心圓的方式,第三個圖以菱形的方式。
kmeans演算法的缺陷
針對上述第2個缺陷,可以使用kmeans++演算法來解決
k-means ++ 演算法
k-means++演算法選擇初始seeds的基本思想就是:初始的聚類中心之間的相互距離要盡可能的遠。
從輸入的資料點集合中隨機選擇乙個點作為第乙個聚類中心
對於資料集中的每乙個點x,計算它與最近聚類中心(指已選擇的聚類中心)的距離d(x)
選擇乙個新的資料點作為新的聚類中心,選擇的原則是:d(x)較大的點,被選取作為聚類中心的概率較大
重複2和3直到k個聚類中心被選出來
利用這k個初始的聚類中心來執行標準的k-means演算法
從上面的演算法描述上可以看到,演算法的關鍵是第3步,如何將d(x)反映到點被選擇的概率上,一種演算法如下:
先從我們的資料庫隨機挑個隨機點當「種子點」
對於每個點,我們都計算其和最近的乙個「種子點」的距離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++**:
演算法思路:如果乙個樣本在特徵空間中的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
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演算法與KNN演算法的區別
首先明確一點knn與kmeans的演算法的區別 1.knn演算法是分類演算法,分類演算法肯定是需要有學習語料,然後通過學習語料的學習之後的模板來匹配我們的測試語料集,將測試語料集合進行按照預先學習的語料模板來分類 2kmeans演算法是聚類演算法,聚類演算法與分類演算法最大的區別是聚類演算法沒有學習...
Kmeans演算法與KNN演算法的區別
kmeans演算法的缺陷 1.聚類中心的數量k需要事先給定,但在實際中這個k值的選定是非常難以進行估計的,很多時候,事先並不知道給定的資料集應該分成多少個類別才更合適。2.kmeans需要初始化聚類中心,不同的初始聚類中心可能導致完全不同的聚類效果。針對第2個缺陷,可以使用kmeans 演算法來解決...
KNN 與 K Means 演算法比較
knn k means 1.分類演算法 聚類演算法 2.監督學習 非監督學習 3.資料型別 餵給它的資料集是帶label的資料,已經是完全正確的資料 餵給它的資料集是無label的資料,是雜亂無章的,經過聚類後才變得有點順序,先無序,後有序 4.訓練過程 沒有明顯的前期訓練過程,屬於memory b...