溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

K-means算法如何實(shí)現(xiàn)二維數(shù)據(jù)聚類

發(fā)布時(shí)間:2021-11-24 14:39:17 來源:億速云 閱讀:1026 作者:柒染 欄目:云計(jì)算

這篇文章給大家介紹K-means算法如何實(shí)現(xiàn)二維數(shù)據(jù)聚類,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

所謂聚類分析,就是給定一個(gè)元素集合D,其中每個(gè)元素具有n個(gè)觀測屬性,對這些屬性使用某種算法將D劃分成K個(gè)子集,要求每個(gè)子集內(nèi)部的元素之間相似度盡可能高,而不同子集的元素相似度盡可能低。聚類分析是一種無監(jiān)督的觀察式學(xué)習(xí)方法,在聚類前可以不知道類別甚至不用給定類別數(shù)量。目前聚類廣泛應(yīng)用于統(tǒng)計(jì)學(xué)、生物學(xué)、數(shù)據(jù)庫技術(shù)和市場營銷等領(lǐng)域。


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


例如對于常見的二維數(shù)據(jù)集,設(shè)計(jì)K-means聚類方法,對80個(gè)二維數(shù)據(jù)點(diǎn)進(jìn)行聚類分析。K-means算法的Python語言實(shí)現(xiàn)及處理過程如下:

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


K-means算法如何實(shí)現(xiàn)二維數(shù)據(jù)聚類


首先導(dǎo)入必要的模塊:

import kmeans

import numpy as np

import matplotlib.pyplot as plt

from math import sqrt


(1) 從文件加載數(shù)據(jù)集

構(gòu)建數(shù)據(jù)矩陣,從文本中逐行讀取數(shù)據(jù),形成供后繼使用的數(shù)據(jù)矩陣。


dataSet=[]

fileIn=open('testSet.txt')

for line in fileIn.readlines():

    lineArr=line.strip().split('\t')

    dataSet.append([float(lineArr[0]),float(lineArr[1])])


(2) 調(diào)用kmeans算法進(jìn)行數(shù)據(jù)聚類

通過以下命令調(diào)用設(shè)計(jì)的kmeans模塊,進(jìn)行數(shù)據(jù)聚類。


dataSet=np.mat(dataSet)

k=4

centroids,clusterAssment=kmeans.kmeanss(dataSet,k)


kmeans模塊主要包含如下幾個(gè)函數(shù)。


距離度量函數(shù)。這里使用的是歐氏距離,計(jì)算過程如下:

def eucDistance(vec1,vec2):

   return sqrt(sum(pow(vec2-vec1,2)))


初始聚類中心選擇。從數(shù)據(jù)集中隨機(jī)選擇K個(gè)數(shù)據(jù)點(diǎn),用作初始聚類中心。

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 聚類算法。該算法會(huì)創(chuàng)建k個(gè)質(zhì)心,然后將每個(gè)點(diǎn)分配到最近的質(zhì)心,再重新計(jì)算質(zhì)心。這個(gè)過程重復(fù)數(shù)次,直到數(shù)據(jù)點(diǎn)的簇分配結(jié)果不再改變位置。

def kmeanss(dataSet,k):

numSamples=dataSet.shape[0]

    clusterAssement=np.mat(np.zeros((numSamples,2)))

    clusterChanged=True

    ##step1:init centroids

    centroids=initCentroids(dataSet,k)

   

    while clusterChanged:

        clusterChanged=False

        for i in range(numSamples):

            minDist = 100000.0

            minIndex=0

            ##step2 find the centroid who is closest

            for j in range(k):

                distance=eucDistance(centroids[j,:],dataSet[i,:])

                if distance < minDist:

                    minDist=distance

                    minIndex=j

            ##step3: update its cluster

            clusterAssement[i,:]=minIndex,minDist**2

            if clusterAssement[i,0]!=minIndex:

                clusterChanged=True

        ##step4: update centroids

        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


聚類結(jié)果顯示。將聚類劃分在的不同簇的數(shù)據(jù),用不同的顏色和符號進(jìn)行顯示,同時(shí)畫出最終的聚類中心。

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) 聚類結(jié)果顯示

對80個(gè)二維數(shù)據(jù),使用K-means方法進(jìn)行聚類,聚類結(jié)果如圖13-5所示,迭代后的聚類中心用方形表示,其他數(shù)據(jù)用不同顏色的原點(diǎn)表示。


K-means算法如何實(shí)現(xiàn)二維數(shù)據(jù)聚類

圖 二維數(shù)據(jù)的聚類結(jié)果

關(guān)于K-means算法如何實(shí)現(xiàn)二維數(shù)據(jù)聚類就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI