1.聚类定义:无监督学习方法,它将相似的对象归到同一簇中,原型聚类算法的一种。
2.K-Means算法:首先,随机确定K个初始点作为质心(K个簇)。然后为每一个数据点找距离其最近的质心,将其分配到该质心所在的簇中,完成这一步之后,为计算该簇所有点的均值然后将均值更新为每一个簇的质心。迭代上述过程,直至簇分配结果不再改变,这样就算完成了K-Means聚类。
3.定义:
4.K-Means伪代码:
创建k个点作为起始质心(随机)
当任意一个点的簇分配结果发生变化时
对数据集中的每一个数据点
对每一个质心
计算质心与数据点之间的距离
将数据点分配到与其距离最近的簇
对于每一个簇,计算簇中所有点的均值并将均值作为新质心
5.Python实现: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()将所有元素转为浮点型
dataMat.append(fltline)
return dataMat
def distEclud(vecA,vecB):
return sqrt(sum(power(vecA-vecB,2)))
def randCent(dataSet,k):
n = shape(dataSet)[1] #get the colums
cetorids = mat(zeros((k,n)))
for j in range(n):
minJ = min(dataSet[:,j])
rangeJ = float(max(dataSet[:,j])-minJ)
cetorids[:,j] = minJ+rangeJ*random .rand(k,1) #使得质心在数据集范围内
return centorids
def kMeans(dataSet, k, distMeas=distEclud, createCent=randCent): #四个参数:数据集,质心个数,距离和创建质心函数
m = shape(dataSet)[0] #得数据集的行数
clusterAssment = mat(zeros((m,2))) #簇分布结果矩阵(用来存放数据点与质心的距离)
centroids = createCent(dataSet, k) #质心
clusterChanged = True #聚类完成标志
while clusterChanged:
clusterChanged = False
for i in range(m): #对每一个数据点
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
for cent in range(k):#recalculate centroids
ptsInClust = dataSet[nonzero(clusterAssment[:,0].A==cent)[0]]###(.A 得到clusterAssment[:,0]的属性)得到聚类所有的数据点
centroids[cent,:] = mean(ptslnClust,axis=0) #分配均值为质心
return centroids,clusterAssment
6.运行:在命令行中输入import kMeans
from numpy import *
datMat = mat(kMeans.loadDataSet('testSet.txt'))
.....
reload(kMeans) #这一行是如果在此之前已将datMat数据复制过来之后,可以进行这个操作,否则就得重新download.
myCentroids,clustAssing = kMeans.kMeans(datMat,4)
这个是只用作后期复习的笔记
创建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()将所有元素转为浮点型 dataMat.append(fltline) return dataMat def distEclud(vecA,vecB): return sqrt(sum(power(vecA-vecB,2))) def randCent(dataSet,k): n = shape(dataSet)[1] #get the colums cetorids = mat(zeros((k,n))) for j in range(n): minJ = min(dataSet[:,j]) rangeJ = float(max(dataSet[:,j])-minJ) cetorids[:,j] = minJ+rangeJ*random .rand(k,1) #使得质心在数据集范围内 return centorids def kMeans(dataSet, k, distMeas=distEclud, createCent=randCent): #四个参数:数据集,质心个数,距离和创建质心函数 m = shape(dataSet)[0] #得数据集的行数 clusterAssment = mat(zeros((m,2))) #簇分布结果矩阵(用来存放数据点与质心的距离) centroids = createCent(dataSet, k) #质心 clusterChanged = True #聚类完成标志 while clusterChanged: clusterChanged = False for i in range(m): #对每一个数据点 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 for cent in range(k):#recalculate centroids ptsInClust = dataSet[nonzero(clusterAssment[:,0].A==cent)[0]]###(.A 得到clusterAssment[:,0]的属性)得到聚类所有的数据点
centroids[cent,:] = mean(ptslnClust,axis=0) #分配均值为质心
return centroids,clusterAssment import kMeans
from numpy import *
datMat = mat(kMeans.loadDataSet('testSet.txt'))
.....
reload(kMeans) #这一行是如果在此之前已将datMat数据复制过来之后,可以进行这个操作,否则就得重新download.
myCentroids,clustAssing = kMeans.kMeans(datMat,4)
本文详细介绍了K-Means聚类算法的基本原理及其实现步骤,包括如何选择初始质心、数据点与质心间距离的计算、簇的更新等,并提供了Python语言的具体实现代码。
34万+

被折叠的 条评论
为什么被折叠?



