Python機器學習之k-means聚類算法

2022-01-06 AI算法之道

所謂聚類,就是按照某個特定的標準將一個數據集劃分成不同的多個類或者簇,使得同一個簇內的數據對象的相似性儘可能大,同時不再一個簇內的數據對象的差異性也儘可能大,聚類算法屬於無監督學習算法的一種.

引言


k-均值聚類算法屬於最基礎的聚類算法,該算法是一種迭代的算法,將規模為n的數據集基於數據間的相似性以及距離簇內中心點的距離劃分成k簇.這裡的k通常是由用戶自己指定的簇的個數,也就是我們聚類的類別個數.


一般步驟如下:

step1 選擇k,來指定我們需要聚類的類別數目.參考上圖a,這裡k=2.

step2 從數據集中隨機選擇k個樣本作為我們不同類別的類內的中心點.參考圖b中紅色和藍色x字

step3 對數據集中的每一個樣本,計算該樣本到k個中心點的距離,選擇距離該樣本最近的中心點的類別作為該樣本的類別.參考上圖c.

step4 根據上一步重新指定的樣本的類別,計算每個類別的類內中心點.圖d所示,重新計算的類內中心點為紅色和藍色x字.

step5 重複步驟3,為數據集中的每個樣本重新分配距離其最近的中心點的類別.圖e所示.

step6 如果給每個樣本分配的類別發生改變,則進入step4,否則進入step7

step7 算法結束. 圖f所示.

K值選擇


通過上述描述,我們基本理解了k-means算法工作的原理,但是遺留給我們的問題是這個k值要如何確定呢?由於這個值是算法的輸入,需要用戶自行指定,當然不可以隨便拍腦袋想了.這裡介紹一種常用的WCSS方法來進行k值的選擇.

WCSS算法是Within-Cluster-Sum-of-Squares的簡稱,中文翻譯為最小簇內節點平方偏差之和.我們希望聚類後的效果是對每個樣本距離其簇內中心點的距離最小.

使用WCSS選擇k值的步驟如下:

step1 選擇不同的k值(比如1-14),對數據樣本執行k-means算法

step2 對於每個k值,計算相應的WCSS值

step3 畫出WCSS值隨著k值變化的曲線

step4一般來說WCSS值應該隨著K的增加而減小,然後趨於平緩,選擇當WCSS開始趨於平衡時的K的取值.上圖中可以選擇6-10之間的值作為k值.

03

代碼實現


樣例數據生成

我們使用python生成我們的數據代碼如下:

from clustering__utils import *x1, y1, x2, y2 = synthData()X1 = np.array([x1, y1]).TX2 = np.array([x2, y2]).T

結果如下:


k-Means實現

參考上述原理,我們來實現kMeans,我們將其封裝成類,代碼如下:

class kMeans(Distance):    def __init__(self, K=2, iters=16, seed=1):        super(kMeans, self).__init__()        self._K = K        self._iters = iters        self._seed = seed        self._C = None        def _FNC(self, x, c, n):                        cmp = np.ndarray(n, dtype=int)        for i, p in enumerate(x):            d = self.distance(p, self._C)            cmp[i] = np.argmin(d)        return cmp        def pred(self, X):                n, dim = X.shape        np.random.seed(self._seed)        sel = np.random.randint(0, n, self._K)        self._C = X[sel]        cmp = self._FNC(X, self._C, n)        for _ in range(self._iters):                                    for i in range(sel.size):                P = X[cmp == i]                self._C[i] = np.mean(P, axis=0)            cmp = self._FNC(X, self._C, n)        return cmp, self._C

上述代碼中:

  FNC函數中x為輸入樣本,c為聚類中心點,n為樣本數目,該函數為每個樣本計算其最近的中心點

pred函數首先重新計算樣本中心點,然後基於此給樣本數據重新分配所屬類別.返回值為n個樣本所屬中心點以及中心點的位置.

K值確定
我們使用以下代碼,計算不同k值下的WCSS的值
Cs = 12V1 = np.zeros(Cs)V2 = np.zeros(Cs)D = Distance()for k in range(Cs):    kmeans = kMeans(K=k + 1, seed=6)    fnc1, C1 = kmeans.pred(X1)    fnc2, C2 = kmeans.pred(X2)    for i, [c1, c2] in enumerate(zip(C1, C2)):        d1 = D.distance(c1, X1[fnc1 == i])**2        d2 = D.distance(c2, X2[fnc2 == i])**2        V1[k] += np.sum(d1)        V2[k] += np.sum(d2)


通過觀察上圖,這裡我們對第一組數據,選擇k=3;針對第二組數據選擇k=6,示例如上圖紅色圓圈所示.

最終效果:
我們根據上述選定的k值,可視化兩組數據迭代過程,代碼如下:
iters = 20; seed = 6K1 = 3kmeans1 = kMeans(K1, iters, seed)fnc1, C1 = kmeans1.pred(X1)K2 = 6kmeans2 = kMeans(K2, iters, seed)fnc2, C2 = kmeans2.pred(X2)

04

總結


本文介紹了機器學習領域中k-means進行聚類的原理以及相應的代碼實現,並給出了完整的代碼示例.

您學廢了嗎?

註:完整代碼,關注公眾號,後臺回復 kMeans , 即可獲取。

相關焦點

  • python機器學習之k-means聚類算法(1)
    k-means算法是一種無監督的機器學習算法,雖然是機器學習,但它簡單易於實現。本篇採用python語言,自主編程實現k-menas算法,當然python用專門的庫函數來實現該算法,但本次主要使用該算法闡述編程思想,所以不採用內置函數。採用自主編寫的程序的方式。
  • 機器學習之SKlearn(scikit-learn)的K-means聚類算法
    Scikit learn 也簡稱 sklearn, 是機器學習領域當中最知名的 python 模塊之一.Sklearn聚類算法對比Sklearn聚類算法官方列舉了不同的算法,大家可以根據自己的數據特徵,以及需要解決的問題,選擇不同的算法,本期我們首先簡單了解一下K-means算法Sklearn聚類算法的K-means
  • python之kmeans數據聚類算法
    一 Kmeans原理kmeans是屬於無監督學習的數據聚類算法,根據點與點之間的距離推測每個點屬於哪個中心,常用計算距離的方式有:餘弦距離、歐式距離、曼哈頓距離等,本文以歐式距離為例。圖3kmeans實現邏輯:需要輸入待聚類的數據和欲聚類簇數k1.隨機生成k個初始點作為質心
  • Python聚類算法——K-means軌跡聚類
    實際上NCL就可以實現聚類算法,官方提供了k-means的算法函數(kmeans_as136),這個函數筆者也用過,相比與Python的聚類可以說還是比較麻煩的。       另外我也見過大佬們用MetoInfo的軟體做軌跡和聚類研究,十分方便。
  • 機器學習十大經典算法之K-Means聚類算法
    聚類介紹聚類在機器學習,數據挖掘,模式識別,圖像分析以及生物信息等領域有廣泛的應用。聚類是把相似的對象通過靜態分類的方法分成不同的組別或者更多的子集(subset),這樣讓在同一個子集中的成員對象都有相似的一些屬性,常見的包括在坐標系中更加短的空間距離(一般是歐式距離)等。
  • K-Means聚類算法詳解
    寫在前面如果想從事數據挖掘或者機器學習的工作,掌握常用的機器學習算法是非常有必要的,常見的機器學習算法:監督學習算法:邏輯回歸,線性回歸,決策樹,樸素貝葉斯,K近鄰,支持向量機,集成算法Adaboost等無監督算法:聚類,降維,關聯規則, PageRank等為了詳細的理解這些原理
  • 聚類算法之Kmeans
    5、我們言簡意賅地提了一下SVM的特點及其應用場景,並給出了svm在sklearn中相關的算法及參數的說明。沒事嘮兩句在傳統機器學習領域裡,主要涉及的任務有回歸、分類、聚類、推薦等。聚類算法之Kmeans聚類算法其實有很多,包括層次聚類,密度聚類,譜聚類等等。
  • K-means 算法實現二維數據聚類
    聚類分析是一種無監督的觀察式學習方法,在聚類前可以不知道類別甚至不用給定類別數量。目前聚類廣泛應用於統計學、生物學、資料庫技術和市場營銷等領域。聚類算法有很多種,如K-means(K均值聚類)、K中心聚類、密度聚類、譜系聚類、最大期望聚類等。這裡我們重點介紹K-means聚類算法,該算法的基本思想是以空間中K個點為中心進行聚類,對最靠近它們的對象歸類。
  • Python氣象數據處理與繪圖:聚類算法(K-means軌跡聚類)
    實際上NCL就可以實現聚類算法,官方提供了k-means的算法函數(kmeans_as136),這個函數筆者也用過,相比與Python的聚類可以說還是比較麻煩的。       另外我也見過大佬們用MetoInfo的軟體做軌跡和聚類研究,十分方便。
  • K-Means聚類算法
    是一種聚類算法,與之前提到的樸素貝葉斯等算法不同,它屬於無監督學習。from sklearn.cluster import KMeanskmeans = KMeans(3)kmeans.fit(X)y_ = kmeans.predict
  • 深入理解K-Means聚類算法
    寫在前面如果想從事數據挖掘或者機器學習的工作,掌握常用的機器學習算法是非常有必要的,常見的機器學習算法:監督學習算法:邏輯回歸,線性回歸,決策樹,樸素貝葉斯,K近鄰,支持向量機,集成算法Adaboost等無監督算法:聚類,降維,關聯規則, PageRank等
  • 機器學習算法之K-means算法
    K-means舉例shi'li1 K-means算法簡介k-means算法是一種聚類算法,所謂聚類,即根據相似性原則聚類與分類最大的區別在於,聚類過程為無監督過程,即待處理數據對象沒有任何先驗知識,而分類過程為有監督過程,即存在有先驗知識的訓練數據集。2 K-means算法原理k-means算法中的k代表類簇個數,means代表類簇內數據對象的均值(這種均值是一種對類簇中心的描述),因此,k-means算法又稱為k-均值算法。
  • Python聚類算法學習之K-Means
    1.簡介       K-means算法是最為經典的基於劃分的聚類方法,是十大經典數據挖掘算法之一
  • 純Python實現k-means聚類算法
    開篇在本系列的前面幾期中,我們介紹了包含決策樹及其相關算法在內的一系列有監督學習算法。本期不妨換換口味,學習一種比較簡單的無監督學習算法:k-means.既然不知道類別標籤,你又讓我對這些樣本進行分類,那如何聚類?又要聚成幾類呢?其實,在k-means中,最終聚成幾類是由我們自己決定的;這裡的類別標籤通常用數字表示,如0,1,2等;當我們指定好類別總數後,每一個樣本被歸到哪一類,就需要聚類算法自己去學習了。
  • k-means聚類算法原理總結
    目錄1. k-means聚類算法原理2. k-means聚類算法步驟3. k-means++聚類優化算法4.小批量處理的k-means聚類算法5. k值的選取6. k-means聚類算法不適用的幾個場景7. k-means與knn區別8. 小結聚類算法性能度量的文章提到若簇類相似度好簇間的相似度差,則聚類算法的性能較好。我們基於此定義k-means聚類算法的目標函數: 其中
  • 手把手聚類算法之K-means算法原理及python實現
    而這一類算法,應用最為廣泛的就是「聚類」。聚類算法可以對數據進行數據歸納,即在儘可能保證數據完整的前提下,減少數據的量級,以便後續處理。也可以對聚類數據結果直接應用或分析。而K-means 算法可以說是聚類算法裡面較為基礎的一種算法。K-means算法採用距離作為相似性的評價指標,認為兩個對象的距離越近,其相似度就越大。該
  • 使用K-means 算法進行客戶分類
    應用機器學習技術就很有可能為客戶創造價值。,xn),其中每一個觀測值都是d維實數向量,K均值聚類旨在將n個觀測值劃分為k(k≤n)個集合S={S1,S2,...,Sk}以最小化聚類內的平方和,其中µi是Si中的點的平均值。保證K-Means算法收斂到局部最優。
  • 不足 20 行 Python 代碼,高效實現 k-means 均值聚類算法!
    將機器學習分為4個領域,分別是分類(classification)、聚類(clustering)、回歸(regression)和降維(dimensionality reduction)。k-mk-means均值算法雖然是聚類算法中比較簡單的一種,卻包含了豐富的思想內容,非常適合作為初學者的入門習題。關於 k-means 均值聚類算法的原理介紹、實現代碼,網上有很多,但運行效率似乎都有點問題。今天稍微有點空閒,寫了一個不足20行的 k-means 均值聚類算法,1萬個樣本平均耗時20毫秒(10次均值)。同樣的數據樣本,網上流行的算法平均耗時3000毫秒(10次均值)。
  • K-Means聚類講解:算法和Sklearn的實現(附代碼)
    K-Means聚類是機器學習領域中最強大的聚類算法之一。他的原因比較簡單,但得出的結果也非常準確。聚類是理解數據集的非常重要的方式,因此在本文中,我們將討論什麼是聚類,為什麼需要聚類以及什麼是k-means聚類。
  • 機器學習之分類算法K-Means介紹與代碼分析(篇四)
    k-平均聚類的目的是:把n個點(可以是樣本的一次觀察或一個實例)劃分到k個聚類中,使得每個點都屬於離他最近的均值(此即聚類中心)對應的聚類,以之作為聚類的標準。這個問題將歸結為一個把數據空間劃分為Voronoi cells的問題。這個問題在計算上是NP困難的,不過存在高效的啟發式算法。