共計 2615 個字符,預計需要花費 7 分鐘才能閱讀完成。
這篇文章給大家介紹 K -means 算法如何實現二維數據聚類,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
所謂聚類分析,就是給定一個元素集合 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
##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
聚類結果顯示。將聚類劃分在的不同簇的數據,用不同的顏色和符號進行顯示,同時畫出最終的聚類中心。
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 所示,迭代后的聚類中心用方形表示,其他數據用不同顏色的原點表示。
圖 二維數據的聚類結果
關于 K -means 算法如何實現二維數據聚類就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。