三、K-均值聚類算法對未標註的數據分組

1、適用數據類型:數值型數據
k-均值是發現給定數據集的k個簇的算法,簇的個數k是用戶給定的,每一個簇通過其質心即簇中所有點的中心來描述
2、工作流程:首先,隨機確定k個初始點作爲質心,然後將數據集中的每個點分到一個簇中,也就是爲每個店找距離最近的質心,並將其分配到該質心所對應的簇。這一步完成後,每個簇的質心更新爲該簇所有點的平均值。
僞代碼:
創建k個點作爲起始質心(經常是隨機選擇)
當任意一個點的簇分配結果發生改變時
對數據集中的每個數據點
對每個質心
計算質心與數據點之間的距離
將數據點分配到距其最近的簇
對每一個簇,計算簇中所有點的均值並將均值作爲質心
3、訓練算法不適用於無監督學習,即無監督學習沒有訓練過程

K-均值聚類支持函數,也就是k-均值算法中要用到的輔助函數。
from numpy import *

def loadDataSet(fileName): #將文本文件導入到一個列表中
dataMat = []
fr = open(fileName)
for line in fr.readlines():
curLine = line.strip().split(‘\t’)
fltLine = map(float,curLine) #map all elements to float()
dataMat.append(fltLine)
return dataMat

def distEclud(vecA, vecB):
return sqrt(sum(power(vecA - vecB, 2))) #計算兩個向量的歐式距離。

def randCent(dataSet, k):#該函數爲給定數據集構建一個包含k個隨機質心的集合。隨機質心必須要在整個數據集的邊界之內,可以通過找到數據集每一維的最小和最大值來完成。然後生成0到0.1之間的隨機數並通過取值範圍和最小值,以便確保隨機點在數據的邊界之內。
n = shape(dataSet)[1]
centroids = mat(zeros((k,n)))#create centroid mat(質心矩陣)
for j in range(n):#create random cluster centers, within bounds of each dimension
minJ = min(dataSet[:,j])
rangeJ = float(max(dataSet[:,j]) - minJ)
centroids[:,j] = mat(minJ + rangeJ * random.rand(k,1))
return centroids

k-均值聚類算法(計算質心–分配–重新計算)
def kMeans(dataSet, k, distMeas=distEclud, createCent=randCent):
m = shape(dataSet)[0]
clusterAssment = mat(zeros((m,2)))#簇分配結果矩陣包含兩列:一列記錄簇索引值,第二列存儲誤差,誤差是指當前點到簇質心的距離
#to a centroid, also holds SE of each point
centroids = createCent(dataSet, k)
clusterChanged = True#標緻變量,如果爲True,則繼續迭代
while clusterChanged:
clusterChanged = False
for i in range(m):#for each data point assign it to the closest centroid
minDist = inf; minIndex = -1
for j in range(k):#尋找最近的質心
distJI = distMeas(centroids[j,:],dataSet[i,:])#距離函數
if distJI < minDist:
minDist = distJI; minIndex = j
if clusterAssment[i,0] != minIndex: clusterChanged = True
clusterAssment[i,:] = minIndex,minDist**2
print centroids
#遍歷所有質心並更新他們的取值。步驟首先通過數組過濾來獲得給定簇的所有點,然後計算所有點的均值,選項axis=0表示沿矩陣列方向進行均值計算,最後,程序返回所有的類質心與點分配結果。
for cent in range(k):#recalculate centroids
ptsInClust = dataSet[nonzero(clusterAssment[:,0].A==cent)[0]]#get all the point in this cluster
centroids[cent,:] = mean(ptsInClust, axis=0) #assign centroid to mean
return centroids, clusterAssment

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章