相关定义
聚类是一种无监督的学习,它将相似的对象归到同一个簇中。聚类方法几乎可以应用到所有的对象,簇内的对象越相似,聚类的效果越好。
K-均值(K-means)聚类是指将数据划分成k个不同的簇,且每个簇的中心采用簇中所含数据的均值计算而成。
聚类和分类最大不同在于,分类的目标事物已知,而聚类不一样。因为其产生的结果与分类相同,而只是类别没有预先定义,聚类有时候也被称为无监督分类。
K-均值聚类算法
K-均值是发现给定数据集的k个簇的算法。簇的个数k是用户给定的,每个簇通过其质心,即簇中所有点的中心来描述。
算法的工作流程如下:首先,随机确定k个初始点作为质心。然后将数据集中的每个点分配到一个簇中。这一步完成后,每个簇的质心更新为该簇所有点的平均值。流程的伪代码如下:
创建k个点作为初试质心
当任意一点的簇分配结果发生改变时:
对数据集中的每个数据点:
对每个质心:
计算数据点与质心直接的距离
将该数据点分配到距离最近的簇
对每一个簇:
更新质心坐标
该段代码涉及到的辅助函数如下:
def create_data(fname): #导入数据
datam=[]
f=open(fname)
for line in f.readlines():
curline=line.strip().split('\t')
floatarr=list(map(float,curline))
datam.append(floatarr)
return datam
def distEclud(va,vb): #计算两点之间的距离
return np.sqrt(np.power(va-vb,2).sum())
def randCen(datas,k): #创建k个随机点当作质点
n=datas.shape[1] #获取数据特征数
centP=np.mat(np.zeros((k,n))) #创建k*n的质点矩阵
for i in range(n): #对于数据每一个特征值
minp=min(datas[:,i])
rangep=float(max(datas[:,i])-minp)
centP[:,i]=minp+rangep*np.random.rand(k,1)