k-means

1 K-means算法

   k-means: 是基于距离的聚类算法,通过选择质心并

计算样本与其之间的距离,然后不断更新质心位置和迭代来完成不同类别的相聚。该算法采用距离作为相似性的评价指标,即认为两个对象的距离越近,其相似度就越大。该算法认为簇是由距离靠近的对象组成的,因此把得到紧凑且独立的簇作为最终目标。

2 K-means的应用场景和优缺点

  应用场景:

  优点:1)解决聚类问题的经典算法,简单、快速;2)当处理大数据集时,该算法保持可伸缩性和高效率 ;3)当簇近似为高斯分布时,它的效果较好

  缺点:1)在簇的平均值可被定义的情况下才能使用,可能不适用于某些应用 ;2)必须实现给出k(要生成簇的数目),而且对初值敏感,即对于不同的初值,可能会导致不同结果 ;3)不适合非凸形状的簇或者大小差别很大的簇 ;4)对噪声和孤立点敏感

3 计算流程

   1)在一组数据中首先,随机确定k个初始点作为质心;2)然后计算数据待每个质心的距离,将距离质心较近的数组化为一组;3)将每个簇的质心更新为该簇所有点的平均值;4)重复2,3两步,如果质心不再变化或者说变化很小,退出循环。

4 具体历程

  4.1 简单的数据分类

from numpy import *

'''
#载入数据函数
  #  fileName :载入数据的路径
'''
def loadDataSet(fileName):      
    dataMat = []                
    fr = open(fileName) #将一行数据按照空格切分
    for line in fr.readlines():
        curLine = line.strip().split('\t')  #将一行数据按照空格切分
        fltLine = map(float,curLine)  #转换成浮点型数据 
        dataMat.append(fltLine)       #将数组拼接到一起
    return dataMat  #返回读取的数据

'''
#计算两个向量的欧氏距离
  #  vecA :向量A
  #  vecB :向量B
'''
def distEclud(vecA, vecB):
    return sqrt(sum(power(vecA - vecB, 2))) #欧氏距离的值

'''
#为给定数据集构建一个包含k个质心的集合
  #  dataSet :数据集
  #  k       :k个质心
'''
def randCent(dataSet, k):
    n = shape(dataSet)[1]    #矩阵的列数
    centroids = mat(zeros((k,n)))  #创建k个质心矩阵
    for j in range(n):   #查找每列
        minJ = min(dataSet[:,j])  #查询每列的最小值
        rangeJ = float(max(dataSet[:,j]) - minJ) #每列最值差范围
        centroids[:,j] = mat(minJ + rangeJ * random.rand(k,1)) #产生k个行的数
    return centroids  #返回k个质心
 
'''
#k-means算法
  #  dataSet    :数据集
  #  k          :k个质心
  #  distMeas   :计算距离
  #  createCent :创建初始的质心
''' 
def kMeans(dataSet, k, distMeas=distEclud, createCent=randCent):
    m = shape(dataSet)[0]  #读取数据的长度
	#创建矩阵存储每个簇的分类结果,一列是簇的索引,一列是存储误差
    clusterAssment = mat(zeros((m,2)))
	#创建k个质心
    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):
		    # 数组过滤得到各个中心所属的样本
            ptsInClust = dataSet[nonzero(clusterAssment[:,0].A==cent)[0]]
			# 按列求平均得到新的中心
            centroids[cent,:] = mean(ptsInClust, axis=0)
    return centroids, clusterAssment # 返回质心和分类结果

   本例程实现简单的数据分类,不过数据k-means计算的距离等之前已经有所叙述,它的改进之处也很多在此就不加详述了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值