K-均值聚类算法(K-means)
程序1,随机生成K个样本中心:
#计算两组数据间的欧氏距离
def distEclud(vecA, vecB):
return sqrt(sum(power(vecA - vecB, 2))) #构造质心
def randCent(dataSet, k):
n = shape(dataSet)[1]#求出数据的列数
centroids = mat(zeros((k, n)))#生成k组n列的矩阵,值全为0
for j in range(n):#对每一列的数字随机生成
minJ = min(dataSet[:, j])#读取某列中的最小值
rangeJ = float(max(dataSet[:, j]) - minJ)#某列数据范围
centroids[:, j] = minJ + rangeJ * random.rand(k, 1)#随机矩阵该列的值为最小值+数据范围乘以一个0到1的随机数,rand(k, 1)生成k行1列的随机矩阵
return centroids
程序2,计算kMeans
#计算kMeans,返回K个中心点以及各组数据离中心点的距离
def kMeans(dataSet, k, distMeas=distEclud, createCent=randCent):
m = shape(dataSet)[0]#获取待分组样本总数
clusterAssment = mat(zeros((m,2)))#用于保存各组样本属于哪个簇,同时保存与簇中心的距离
centroids = createCent(dataSet, k)#随机创建k个质心
clusterChanged = True#质心变化标志,初始化为true,在循环中,任何一个质心发生变化,该值就为true
while clusterChanged:
clusterChanged = False
for i in range(m):#对m组样本进行循环
minDist = inf#取正无穷
minIndex = -1#取下标为-1
for j in range(k):#对每个质心进行循环
distJI = distMeas(centroids[j,:],dataSet[i,:])#计算第i组样本离质心j的距离
if distJI < minDist:#若距离比上一步计算的最小距离还小
minDist = distJI#更新该值
minIndex = j#则样本i离质心j最近
if clusterAssment[i,0] != minIndex:#若保存的质心与新计算的质心不一致
clusterChanged = True
clusterAssment[i,:] = minIndex,minDist**2#计算的质心,与质心距离平方
print centroids
for cent in range(k):#对k个中心进行循环
ptsInClust = dataSet[nonzero(clusterAssment[:,0].A==cent)[0]]#将属于第cent个中心的所以样本从dataSet中取出
centroids[cent,:] = mean(ptsInClust, axis=0) #根据簇cent中的所有样本,计算新的质心
return centroids, clusterAssment#返回最终稳定的质心,以及各样本所属质心和距离
程序2的改进
二分K-Means算法
程序3,二分K-Means算法
#二分K-Means算法
def biKmeans(dataSet, k, distMeas=distEclud):
m = shape(dataSet)[0]#获取待分组数据集的数目
clusterAssment = mat(zeros((m,2)))#用于保存各组样本属于哪个簇,同时保存与簇中心的距离
centroid0 = mean(dataSet, axis=0).tolist()[0]#取所有样本各个指标的平均值做为第一个簇的质心
centList =[centroid0] #用于存储所有的质心
for j in range(m):#计算所有样本与初始质心距离的平方
clusterAssment[j,1] = distMeas(mat(centroid0), dataSet[j,:])**2
while (len(centList) < k):#当前质心数小于设定质心数K,则继续二分
lowestSSE = inf#初始SSE为正无穷
for i in range(len(centList)):#循环遍历每一个已有质心
ptsInCurrCluster = dataSet[nonzero(clusterAssment[:,0].A==i)[0],:]#获取i簇中的所有数据
centroidMat, splitClustAss = kMeans(ptsInCurrCluster, 2, distMeas)#将该簇进行二分
sseSplit = sum(splitClustAss[:,1])#计算二分后的SSE
sseNotSplit = sum(clusterAssment[nonzero(clusterAssment[:,0].A!=i)[0],1])#不在该簇中其他点的SSE
print "sseSplit, and notSplit: ",sseSplit,sseNotSplit
if (sseSplit + sseNotSplit) < lowestSSE:#两者相加,若比最低SSE还要低
bestCentToSplit = i#就在第i个质心上
bestNewCents = centroidMat#i簇上的二分质心
bestClustAss = splitClustAss.copy()#返回K个中心点以及各组数据离中心点的距离
lowestSSE = sseSplit + sseNotSplit#最低SSE更新为当前最低值
#每次二分会新增一个质心,,bestClustAss每次都是分成0和1两种情况,
#比如之前有两个质心0和1,发现其中1簇可以继续二分,那么现在就有三个质心,将新的1设置为2,将新的0设置为1,
#那么现在的三个质心分别为0,1,2,原来的0保持不变
bestClustAss[nonzero(bestClustAss[:,0].A == 1)[0],0] = len(centList) #将其中是1的更新为最新增加的簇
bestClustAss[nonzero(bestClustAss[:,0].A == 0)[0],0] = bestCentToSplit#将其中为0的继续保存在之前那个质心编号内
print 'the bestCentToSplit is: ',bestCentToSplit
print 'the len of bestClustAss is: ', len(bestClustAss)
centList[bestCentToSplit] = bestNewCents[0,:].tolist()[0]#将最佳二分的i簇原来的质心替换成新生成的第一个质心
centList.append(bestNewCents[1,:].tolist()[0])#将新生成的第二个质心也追加到最佳质心列表中
clusterAssment[nonzero(clusterAssment[:,0].A == bestCentToSplit)[0],:]= bestClustAss#最佳二分的i簇新的相关信息
return mat(centList), clusterAssment
K-均值聚类算法(K-means)的更多相关文章
- k均值聚类算法原理和(TensorFlow)实现
顾名思义,k均值聚类是一种对数据进行聚类的技术,即将数据分割成指定数量的几个类,揭示数据的内在性质及规律. 我们知道,在机器学习中,有三种不同的学习模式:监督学习.无监督学习和强化学习: 监督学习,也 ...
- K均值聚类算法
k均值聚类算法(k-means clustering algorithm)是一种迭代求解的聚类分析算法,其步骤是随机选取K个对象作为初始的聚类中心,然后计算每个对象与各个种子聚类中心之间的距离,把每个 ...
- 机器学习实战---K均值聚类算法
一:一般K均值聚类算法实现 (一)导入数据 import numpy as np import matplotlib.pyplot as plt def loadDataSet(filename): ...
- 基于改进人工蜂群算法的K均值聚类算法(附MATLAB版源代码)
其实一直以来也没有准备在园子里发这样的文章,相对来说,算法改进放在园子里还是会稍稍显得格格不入.但是最近邮箱收到的几封邮件让我觉得有必要通过我的博客把过去做过的东西分享出去更给更多需要的人.从论文刊登 ...
- K均值聚类算法的MATLAB实现
1.K-均值聚类法的概述 之前在参加数学建模的过程中用到过这种聚类方法,但是当时只是简单知道了在matlab中如何调用工具箱进行聚类,并不是特别清楚它的原理.最近因为在学模式识别,又重新接触了这 ...
- 100天搞定机器学习|day44 k均值聚类数学推导与python实现
[如何正确使用「K均值聚类」? 1.k均值聚类模型 给定样本,每个样本都是m为特征向量,模型目标是将n个样本分到k个不停的类或簇中,每个样本到其所属类的中心的距离最小,每个样本只能属于一个类.用C表示 ...
- 聚类之K均值聚类和EM算法
这篇博客整理K均值聚类的内容,包括: 1.K均值聚类的原理: 2.初始类中心的选择和类别数K的确定: 3.K均值聚类和EM算法.高斯混合模型的关系. 一.K均值聚类的原理 K均值聚类(K-means) ...
- 机器学习实战5:k-means聚类:二分k均值聚类+地理位置聚簇实例
k-均值聚类是非监督学习的一种,输入必须指定聚簇中心个数k.k均值是基于相似度的聚类,为没有标签的一簇实例分为一类. 一 经典的k-均值聚类 思路: 1 随机创建k个质心(k必须指定,二维的很容易确定 ...
- 机器学习理论与实战(十)K均值聚类和二分K均值聚类
接下来就要说下无监督机器学习方法,所谓无监督机器学习前面也说过,就是没有标签的情况,对样本数据进行聚类分析.关联性分析等.主要包括K均值聚类(K-means clustering)和关联分析,这两大类 ...
- 机器学习之K均值聚类
聚类的核心概念是相似度或距离,有很多相似度或距离的方法,比如欧式距离.马氏距离.相关系数.余弦定理.层次聚类和K均值聚类等 1. K均值聚类思想 K均值聚类的基本思想是,通过迭代的方法寻找K个 ...
随机推荐
- ios html5 audio 不能自动播放
//修复ios 浏览器不能自动播放音频的问题 在加载时创建新的audio 用的时候更换src即可 Xut.fix = Xut.fix||{}; if (Xut.plat.isBrowser & ...
- java-反射深度剖析
Java反射是Java语言一个很重要的特征,简单剖析下反射的定义.原理.使用.性能及应用场景. (一)定义 程序运行时,允许改动程序结构或变量类型,这种语言称为动态语言.java不属于动态语言,但提供 ...
- Day 1 Python简单程序
一.高级语言和低级语言 最初的计算机程序都是用0和1的序列表示的,程序员直接使用的是机器指令,无需翻译,从纸带打孔输入即可执行得到结果.后来为了方便记忆,就将用0.1序列表示的机器指令都用符号助记 ...
- 实践详细篇-Windows下使用VS2015编译的Caffe训练mnist数据集
上一篇记录的是学习caffe前的环境准备以及如何创建好自己需要的caffe版本.这一篇记录的是如何使用编译好的caffe做训练mnist数据集,步骤编号延用上一篇 <实践详细篇-Windows下 ...
- Spring消息之AMQP.
一.AMQP 概述 AMQP(Advanced Message Queuing Protocol),高级消息队列协议. 简单回忆一下JMS的消息模型,可能会有助于理解AMQP的消息模型.在JMS中,有 ...
- 深入理解SpringCloud之引导程序应用上下文
tips:我希望通过这篇文章来给对于bootstrap还不理解的朋友带来帮助.当然这篇文章不仅仅是讲解知识,我更希望给广大朋友带来学习与理解官方文档的一种思路.阅读本文前,建议大家对SpringBoo ...
- jQuery 效果 – 滑动
jQuery 滑动方法可使元素上下滑动. 点击这里,隐藏/显示面板 一寸光阴一寸金,因此,我们为您提供快捷易懂的学习内容. 在这里,您可以通过一种易懂的便利的模式获得您需要的任何知识. 实例 jQue ...
- ZooKeeper之(三)工作原理
3.1 系统架构 ZooKeeper集群是由多台机器组成的,每台机器都充当了特定的角色,各种角色在协作过程中履行自己的任务,从而对外提供稳定.可靠的服务. 由上图可知,ZooKeeper集群由多台机器 ...
- 【SSH系列】Hibernate映射 -- 一对一单向关联映射
映射原理 一对一关联映射:两个实体对象之间是一对一的关联映射,即一个对象只能与另外唯一的一个对象相对应.有两种策略可以实现一对一的关联映射: a.主键关联:即让两个对象具有相 ...
- springMVC源码分析--AbstractUrlHandlerMapping(三)
上一篇博客springMVC源码分析--AbstractHandlerMapping(二)中我们介绍了AbstractHandlerMapping了,接下来我们介绍其子类AbstractUrlHand ...