《机器学习实战》1.K-Means聚类算法

来源:互联网 发布:中国招标网软件 编辑:程序博客网 时间:2024/06/06 03:11

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 dataMatdef distEclud(vecA,vecB):return sqrt(sum(power(vecA-vecB,2)))def randCent(dataSet,k):n = shape(dataSet)[1]  #get the columscetorids = 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 centoridsdef 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 = Falsefor i in range(m):           #对每一个数据点minDist = inf;minIndex = -1for 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 kMeansfrom numpy import *datMat = mat(kMeans.loadDataSet('testSet.txt')).....reload(kMeans)     #这一行是如果在此之前已将datMat数据复制过来之后,可以进行这个操作,否则就得重新download.myCentroids,clustAssing = kMeans.kMeans(datMat,4)
这个是只用作后期复习的笔记




原创粉丝点击