K-means 算法實現二維數據聚類

2021-12-25 Python中文社區

所謂聚類分析,就是給定一個元素集合D,其中每個元素具有n個觀測屬性,對這些屬性使用某種算法將D劃分成K個子集,要求每個子集內部的元素之間相似度儘可能高,而不同子集的元素相似度儘可能低。聚類分析是一種無監督的觀察式學習方法,在聚類前可以不知道類別甚至不用給定類別數量。目前聚類廣泛應用於統計學、生物學、資料庫技術和市場營銷等領域。

聚類算法有很多種,如K-means(K均值聚類)、K中心聚類、密度聚類、譜系聚類、最大期望聚類等。這裡我們重點介紹K-means聚類算法,該算法的基本思想是以空間中K個點為中心進行聚類,對最靠近它們的對象歸類。通過迭代的方法,逐次更新各聚類中心的值,直至得到最好的聚類結果。K-means算法實現簡單、計算速度快、原理易於理解、具有理想的聚類效果,因此該算法是公認的經典數據挖掘方法之一。

例如對於常見的二維數據集,設計K-means聚類方法,對80個二維數據點進行聚類分析。K-means算法的Python語言實現及處理過程如下:

如下圖所示的80個二維樣本數據集,存儲為testSet文本文檔。經過數據預處理和簡單分析,得知該數據集共有4個類別,因而能確定聚類數K為4。

首先導入必要的模塊:

import kmeans
import numpy as np
import matplotlib.pyplot as plt
from math import sqrt

(1) 從文件加載數據集
構建數據矩陣,從文本中逐行讀取數據,形成供後繼使用的數據矩陣。

dataSet=[]
fileIn=open('testSet.txt')
for line in fileIn.readlines():
    lineArr=line.strip().split('\t')
    dataSet.append([float(lineArr[0]),float(lineArr[1])])

(2) 調用kmeans算法進行數據聚類
通過以下命令調用設計的kmeans模塊,進行數據聚類。

dataSet=np.mat(dataSet)
k=4
centroids,clusterAssment=kmeans.kmeanss(dataSet,k)

kmeans模塊主要包含如下幾個函數。
距離度量函數。這裡使用的是歐氏距離,計算過程如下:

def eucDistance(vec1,vec2):
   return sqrt(sum(pow(vec2-vec1,2)))

初始聚類中心選擇。從數據集中隨機選擇K個數據點,用作初始聚類中心。

def initCentroids(dataSet,k):
    numSamples,dim=dataSet.shape
    centroids=np.zeros((k,dim))
    for i in range(k):
        index=int(np.random.uniform(0,numSamples))
        centroids[i,:]=dataSet[index,:]
    return centroids

K-Means 聚類算法。該算法會創建k個質心,然後將每個點分配到最近的質心,再重新計算質心。這個過程重複數次,直到數據點的簇分配結果不再改變位置。

def kmeanss(dataSet,k):
numSamples=dataSet.shape[0]
    clusterAssement=np.mat(np.zeros((numSamples,2)))
    clusterChanged=True
    
    centroids=initCentroids(dataSet,k)

    while clusterChanged:
        clusterChanged=False
        for i in range(numSamples):
            minDist = 100000.0
            minIndex=0
            
            for j in range(k):
                distance=eucDistance(centroids[j,:],dataSet[i,:])
                if distance < minDist:
                    minDist=distance
                    minIndex=j
            
            clusterAssement[i,:]=minIndex,minDist**2
            if clusterAssement[i,0]!=minIndex:
                clusterChanged=True
        
        for j in range(k):
            pointsInCluster=dataSet[np.nonzero(clusterAssement[:,0].A==j)[0]]
            centroids[j,:]=np.mean(pointsInCluster,axis=0)
    print ('Congratulations,cluster complete!')
    return centroids,clusterAssement

聚類結果顯示。將聚類劃分在的不同簇的數據,用不同的顏色和符號進行顯示,同時畫出最終的聚類中心。

def showCluster(dataSet,k,centroids,clusterAssement):
    numSamples,dim=dataSet.shape
mark=['or','ob','og','ok','^r','+r','<r','pr']
    if k > len(mark):
        print("Sorry!")
        return 1
    for i in np.xrange(numSamples):
        markIndex=int(clusterAssement[i,0])
        plt.plot(centroids[i,0],centroids[i,1],mark[i],markersize=12)
    plt.show()

(3) 聚類結果顯示

對80個二維數據,使用K-means方法進行聚類,聚類結果如圖13-5所示,迭代後的聚類中心用方形表示,其他數據用不同顏色的原點表示。

圖:二維數據的聚類結果

留言回覆你在機器學習方面做過哪些有趣的應用,我們會在留言中隨機抽取一位讀者免費送出北京大學出版社出版的《Python 3 數據分析與機器學習實戰》圖書一本。

本文摘自北京大學出版社出版的《Python 3 數據分析與機器學習實戰》,本書參加了京東春季福利,滿100減50,點擊閱讀原文即可購買。

相關焦點

  • python之kmeans數據聚類算法
    一 Kmeans原理kmeans是屬於無監督學習的數據聚類算法,根據點與點之間的距離推測每個點屬於哪個中心,常用計算距離的方式有:餘弦距離、歐式距離、曼哈頓距離等,本文以歐式距離為例。圖3kmeans實現邏輯:需要輸入待聚類的數據和欲聚類簇數k1.隨機生成k個初始點作為質心
  • 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聚類算法從入門到精通
    k-means算法是非監督聚類最常用的一種方法,因其算法簡單和很好的適用於大樣本數據,廣泛應用於不同領域,本文詳細總結了k-means聚類算法原理 。小批量處理的k-means聚類算法5. k值的選取6. k-means聚類算法不適用的幾個場景7. k-means與knn區別8. 小結聚類算法性能度量的文章提到若簇類相似度好簇間的相似度差,則聚類算法的性能較好。我們基於此定義k-means聚類算法的目標函數: 其中
  • 純Python實現k-means聚類算法
    開篇在本系列的前面幾期中,我們介紹了包含決策樹及其相關算法在內的一系列有監督學習算法。本期不妨換換口味,學習一種比較簡單的無監督學習算法:k-means.k-means 算法理論講解你可能已經聽說過這個算法,沒有也不要緊,它的原理並不複雜,讓我們來看看~給你一批樣本的數據,就像這樣:其中不同的id代表不同樣本,共10個樣本。x和y是兩個特徵,每一個樣本都有且只有這兩個特徵。
  • K-means 聚類算法及其代碼實現
    K-means算法是非監督學習(unsupervised learning)中最簡單也是最常用的一種聚類算法,具有的特點是:本文章介紹
  • K-Means聚類算法
    簡單來說,之前的算法中我們是利用特徵 x 和類別 y 來進行訓練、分類的,而無監督學習是指不需要我們提供具體的類別 y ,而讓數據自己聚在一起,形成 k 個簇,以實現分類的目的。具體方法是通過對給定的樣本進行劃分,分為 k 個簇,使得簇內的點儘量緊密的連在一起,而簇間的距離儘量大,評判的標準就是通過歐氏距離。
  • K-Means聚類算法詳解
    random 的方式則是完全隨機的方式,一般推薦採用優化過的 k-means++ 方式;algorithm:k-means 的實現算法,有「auto」 「full」「elkan」三種。一般來說建議直接用默認的"auto"。簡單說下這三個取值的區別,如果你選擇"full"採用的是傳統的 K-Means 算法,「auto」會根據數據的特點自動選擇是選擇「full」還是「elkan」。
  • Python聚類算法——K-means軌跡聚類
    實際上NCL就可以實現聚類算法,官方提供了k-means的算法函數(kmeans_as136),這個函數筆者也用過,相比與Python的聚類可以說還是比較麻煩的。       另外我也見過大佬們用MetoInfo的軟體做軌跡和聚類研究,十分方便。
  • Python機器學習之k-means聚類算法
    ,聚類算法屬於無監督學習算法的一種.引言k-均值聚類算法屬於最基礎的聚類算法,該算法是一種迭代的算法,將規模為n的數據集基於數據間的相似性以及距離簇內中心點的距離劃分成k簇.這裡的k通常是由用戶自己指定的簇的個數,也就是我們聚類的類別個數.
  • Python氣象數據處理與繪圖:聚類算法(K-means軌跡聚類)
    實際上NCL就可以實現聚類算法,官方提供了k-means的算法函數(kmeans_as136),這個函數筆者也用過,相比與Python的聚類可以說還是比較麻煩的。       另外我也見過大佬們用MetoInfo的軟體做軌跡和聚類研究,十分方便。
  • 聚類算法之Kmeans
    聚類算法之Kmeans聚類算法其實有很多,包括層次聚類,密度聚類,譜聚類等等。重複迭代至找到k個簇心。多補充一句,sklearn中kmeans的簇心初始化方法,一般也默認選擇k-means++。當然,這個是可選可配的。由於k-means++計算的是所有的樣本點到簇心的距離和,其計算量龐大,故而又有了kmeansII算法。
  • 深入理解K-Means聚類算法
    random 的方式則是完全隨機的方式,一般推薦採用優化過的 k-means++ 方式;algorithm:k-means 的實現算法,有「auto」 「full」「elkan」三種。一般來說建議直接用默認的"auto"。簡單說下這三個取值的區別,如果你選擇"full"採用的是傳統的 K-Means 算法,「auto」會根據數據的特點自動選擇是選擇「full」還是「elkan」。
  • 詳解 kmeans 聚類算法
    也是聚類算法中最簡單的一種了,但是裡面包含的思想卻是不一般。最早我使用並實現這個算法是在學習韓爺爺那本數據挖掘的書中,那本書比較注重應用。看了Andrew Ng的這個講義後才有些明白K-means後面包含的EM思想。聚類屬於無監督學習,以往的回歸、樸素貝葉斯、SVM等都是有類別標籤y的,也就是說樣例中已經給出了樣例的分類。而聚類的樣本中卻沒有給定y,只有特徵x,比如假設宇宙中的星星可以表示成三維空間中的點集。
  • K_means聚類的matlab應用
    本文作者:南海一號在機器學習中,我們往往會遇到很大量的數據的處理,其中有一項就是聚類,即將相似的數據聚到一起,比較基礎的就是K_means聚類算法。聚類是一種無監督學習,不需要訓練樣本有對應的標籤就可以將不同的類分開。利用的就是相同類之間的相似性以及不同類之間的差異性。
  • 機器學習十大經典算法之K-Means聚類算法
    聚類也能用於對Web上的文檔進行分類,以發現信息。諸如此類,聚類有著廣泛的實際應用。K-Means聚類算法簡介K-Means是發現給定數據集的 K 個簇的聚類算法, 之所以稱之為 K-均值是因為它可以發現 K 個不同的簇, 且每個簇的中心採用簇中所含值的均值計算而成。簇個數 K 是用戶指定的, 每一個簇通過其質心(centroid), 即簇中所有點的中心來描述。
  • K-Means聚類講解:算法和Sklearn的實現(附代碼)
    K-Means聚類是機器學習領域中最強大的聚類算法之一。他的原因比較簡單,但得出的結果也非常準確。聚類是理解數據集的非常重要的方式,因此在本文中,我們將討論什麼是聚類,為什麼需要聚類以及什麼是k-means聚類。
  • 基於K-means聚類算法的MATLAB圖像分割
    K-means算法首先從數據樣本中選取K個點作為初始聚類中心;其次計算各個樣本到聚類的距離,把樣本歸到離它最近的那個聚類中心所在的類
  • R語言實現聚類kmeans
    我們比較2個不同包的k-means算法,所得到的分組數據都是一樣的,中心點位置略有一點偏差。雖然我們使用了相同的算法,分組個數也相同,但中心點還有一些不同的。這裡其實就要對聚類的穩定性進行判斷了,有可能是聚類迭代次數過少,就會出現不同的聚類結果,就需要增加迭代次數,達到每次計算結果是一致的。也有可能是因為不同的包,實現的代碼有所區別導致的。k-means算法,也有一些缺點就是對於孤立點是敏感的,會被一些極端值影響聚類的效果。
  • 手把手聚類算法之K-means算法原理及python實現
    所謂無監督學習,就是訓練樣本中的標記信息是位置的,目標是通過對無標記訓練樣本的學習來揭示數據的內在性質以及規律。通俗地說,就是根據數據的一些內在性質,找出其內在的規律。而這一類算法,應用最為廣泛的就是「聚類」。聚類算法可以對數據進行數據歸納,即在儘可能保證數據完整的前提下,減少數據的量級,以便後續處理。也可以對聚類數據結果直接應用或分析。
  • k均值聚類算法(k-means clustering algorithm)
    ——《周易·繫辭上》一、什麼是聚類?1.將有限集合中的對象劃分成個非空子集,使得類內的對象相似、類間的對象不相似。2.訓練樣本的標記信息未知,無監督學習。3.通過對無標記訓練樣本的學習來揭示數據的內在性質及規律,為進一步的數據分析提供基礎。4.無監督學習中,應用最廣的是「聚類」。