所謂聚類分析,就是給定一個元素集合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,點擊閱讀原文即可購買。