K-均值聚类算法

来源:互联网 发布:cad中网络接口怎么画 编辑:程序博客网 时间:2024/05/16 17:03

聚类:是一种无监督的学习,它将相似的对象归到同一个簇中,有点像全自动分类。

1. k-均值聚类算法

分类簇数为K
每个簇的质心为所有点的平均值
原理:
1. 随机选择起始质心(也就是簇的中心点)
2. 任意一个中心点是否发生变化?
3. 每个数据点与K个质心的距离比较,哪个距离短,这个数据点就属于哪个簇。
4. 对分好的每个簇,计算簇中所有点的均值,并将均值作为质心(新的中心点)
5. 重复上面三个步骤,直到中心点没有发生变化。

代码如下:

def kMeans(dataSet, k, distMeas=distEclud, createCent=randCent):    m = np.shape(dataSet)[0]    clusterAssment = np.mat(np.zeros((m,2)))#create mat to assign data points                                      #to a centroid, also holds SE of each point    centroids = createCent(dataSet, k)    clusterChanged = True    while clusterChanged:        clusterChanged = False        for i in range(m):#for each data point assign it to the closest centroid            minDist = np.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[np.nonzero(clusterAssment[:,0].A==cent)[0]]#get all the point in this cluster            centroids[cent,:] = np.mean(ptsInClust, axis=0) #assign centroid to mean    return centroids, clusterAssment

缺点:
k-均值算法收敛到了局部最小值,而非全局最小值。


2. 二分k-均值算法

为了克服k-均值算法收敛于局部最小值的问题,可以使用二分k-均值法。

原创粉丝点击