(上接第二章)

  4.3.1 KMeans 算法流程

  算法的过程如下:

  (1)从N个数据文档随机选取K个文档作为质心

  (2)对剩余的每个文档测量其到每个质心的距离,并把它归到最近的质心的类

  (3)重新计算已经得到的各个类的质心

  (4)迭代(2)~(3)步直至新的质心与原质心相等或者小于指定阀值,算法结束。

  4.3.2 辅助函数

  (1)文件数据转为矩阵:file2matrix

def file2matrix(path,delimiter):
recordlist = []
fp = open(path,"rb")#读取文件内容
content = fp.read()
fp.close()
rowlist = content.splitlines()#按行转化为一维表
#逐行遍历,结果按分割符分割为行向量
recordlist = [map(eval,row.split(delimiter)) for row in rowlist if row.strip()]#eval:字符串转为、矩阵形式
return mat(recordlist)#返回转换后的矩阵形式

  (2)根据聚类中心绘制散点图,以及绘制聚类中心:默认4个聚类中心

def color_cluster(dataindx,dataSet,plt,k = 4):
index = 0
datalen = len(dataindx)
for indx in xrange(datalen):
if int(dataindx[indx]) == 0:
plt.scatter(dataSet[indx,0],dataSet[indx,1],c='blue',marker='o')
elif int(dataindx[indx]) == 1:
plt.scatter(dataSet[indx,0],dataSet[indx,1],c='green',marker='o')
elif int(dataindx[indx]) == 2:
plt.scatter(dataSet[indx,0],dataSet[indx,1],c='red',marker='o')
elif int(dataindx[indx]) == 3:
plt.scatter(dataSet[indx,0],dataSet[indx,1],c='cyan',marker='o')
index += 1
#绘制散点图
def drawScatter(plt,mydata,size = 20,color = 'blue',mrkr = 'o'):
plt.scatter(mydata.T[0],mydata.T[1],s = size,c = color,marker = mrkr)

  (3)欧式距离公式

#欧式距离
def distEclud(vecA,vecB):
return linalg.norm(vecA-vecB)

  (4)随机生成聚类的中心

def randCenters(dataSet,k):
n = shape(dataSet)[1] #初始化聚类中心矩阵:k*n
clustercents = mat(zeros(k,n))
for col in xrange(n):
mincol = min(dataSet[:,col])
maxcol = max(dataSet[:,col])
#random.rand(k,1):产生一个0~1之间的随机数向量:k,1表示k行1列的随机数
clustercents[:,col] = mat(mincol+float(maxcol-mincol)*random.rand(k,1))
return clustercents

  4.3.3 聚类主函数

  第一阶段:导入所需要的库,导入数据集,指定聚类中心k:

  

dataMat = file2matrix("./iris.txt"," ") #从文件构建的数据集
dataSet = mat(dataMat[:,1:]) #转换为矩阵的形式
m = dataSet.shape[0]
k = 4 #外部指定的聚类中心 #与数据等长,共两列。 #:列1:数据集对应的聚类中心k: #列2:数据集行向量到聚类中心的距离 ClusDist = mat(zeros((m,2))) clutercents = randCenters(dataSet,k) #随机生成聚类中心  flag = True #初始化迭代所需的标志位 counter = []

  第二阶段:算法停止迭代,即dataSet的所有向量都能找到某个聚类中心,到此中心的距离均小于其他k-1个中心的距离。

  

while flag:                               #主循环
flag = False #默认设置退出标志(False)

  第三阶段:内循环1遍历dataSet数据集,计算dataSet每行与聚类的最小欧氏距离,并以此更新聚类中心。

  算法停止条件:ClustDist[i,0] == minIndex

for i in xrange(m):
#遍历k个聚类中心,获取最短距离
distlist = [distEclud(clustercents[j,:],dataSet[i,:]) for j in range(k)]
minDist = min(distlist)
minIndex = distlist.index(minDist) if ClusDist[i,0] != minIndex: #找到一个新聚类中心
flag = True #重置标志位True,继续迭代 #更新聚类中心
ClusDist[i,:] = minIndex,minDist

  第四阶段:内循环2遍历每个聚类中心,计算DataSet已聚类的子列均值,并以此更新聚类中心。

  

for cent in xrange(k):
#从ClustDist的第一列筛选出等于cent的行下标
pstInClust = dataSet[nonzero(ClusDist[:,0].A == cent)[0]]
#计算pstInClust各列的均值:mean(ptsInClust,axis = 0):axis=0 #按列计算
clustercents[cent,:] = mean(ptsInClust,axis = 0)

  4.3.4  评估分类结果:
  第五阶段:分类结果可视化。

  

#返回计算完成的聚类中心
print "clustercents:\n",clustercents #根据ClustDist分类和描绘数据点
color_cluster(ClusDist[:,0:1],dataSet,plt)
#绘制聚类中心
drawScatter(plt,clustercents,size=60,color='red',mrkr='D')
plt.show()

  

  

  

  

  

郑捷《机器学习算法原理与编程实践》学习笔记(第四章 推荐系统原理)(二)kmeans的更多相关文章

  1. [Java编程思想-学习笔记]第3章 操作符

    3.1  更简单的打印语句 学习编程语言的通许遇到的第一个程序无非打印"Hello, world"了,然而在Java中要写成 System.out.println("He ...

  2. [Java编程思想-学习笔记]第1章 对象导论

    1.1  抽象过程 Java是一门面向对象的语言,它的一个优点在于只针对待解问题抽象,而不用为具体的计算机结构而烦心,这使得Java有完美的移植性,也即Java的口号"Write Once, ...

  3. JavaScript DOM编程艺术-学习笔记(第二章)

    1.好习惯从末尾加分号:开始 2.js区分大小写 3.程序界万能的命名法则:①不以,数字开头的数字.字母.下划线.美元符号 ②提倡以下划线命名法来命名变量,以驼峰命名法来命名函数.但是到了公司往往会身 ...

  4. [Java编程思想-学习笔记]第4章 控制执行流程

    4.1  return 关键字return有两方面的用途:一方面指定一个方法结束时返回一个值:一方面强行在return位置结束整个方法,如下所示: char test(int score) { if ...

  5. [Java编程思想-学习笔记]第2章 一切都是对象

    2.1  创建新的数据类型:类 通过第一章掌握了面向对象的理论后,我们知道每个对象必定属于一个类型,那么Java如何创建新的数据类型?如下程序所示: class Circle { // 属性 // 方 ...

  6. 《Java编程思想》笔记 第四章 控制执行流程

    1.true和false if--else if--else, while, do--while 都使用条件表达式的真假来决定执行路径. Java不允许数字作为真假判断,C和C++可以非0即真. 2. ...

  7. 《UNIX环境高级编程》(APUE) 笔记第四章 - 文件和目录

    4 - 文件和目录 1. 函数 stat.fstat.fstatat 和 lstat #inlcude <sys/stat.h> int stat(const char *restrict ...

  8. 《简明Python编程》核心笔记(1~5章)

    2014年8月20日 <简明Python编程>核心笔记  (1~5章) 昨天和今天两天时间里.把<简明Python编程>这一本书学完了,包含书上的代码.现把核心笔记记录下来,以 ...

  9. 【C#编程基础学习笔记】4---Convert类型转换

    2013/7/24 技术qq交流群:JavaDream:251572072  教程下载,在线交流:创梦IT社区:www.credream.com [C#编程基础学习笔记]4---Convert类型转换 ...

随机推荐

  1. 区分LocalStorage和偏好数据

    偏好数据类似于web.config或者session,cookie之类的值,一般用于保存一些状态值,不推荐大量的数据通过此方式存储 Local Storage不仅可以寸字符串,还可以寸JSON对象

  2. flash的读写与擦除

    对于flash的认识,比较肤浅,在网上找了些资料,感谢 http://blog.csdn.net/lin364812726/article/details/18815395  的博主, 将其博文转载过 ...

  3. MFC 编辑框中字体大小改变,行高不能改变,只能显示一半的问题,已解决。

    CKagulaCEdit是CEdit的一个继承类,m_edit的CKagulaCEdit类型的一个变量 调用的时候,是这样的: 编辑框中字体大小改变,行高不能改变,只能显示一半的问题,问题如下: 这时 ...

  4. c#全局鼠标事件以及鼠标事件模拟

    最近在编写Max插件时,其主容器FlowLayoutPanel由于隐藏了滚动条,要实现按住鼠标中键上下拖动的功能,因此尝试了全局鼠标事件.以及鼠标勾子,可惜由于Max不争气?都未能实现,于是代码报废, ...

  5. css定位和浮动

    1.css中一切元素皆为框.div.p.h1等为块框:span.strong等为行内框,(在文本中每一行会被自动默认为行框,行框和行内框是不一样的概念).通过display可以改变框的类型,行内框通过 ...

  6. nil与NULL的区别

    首先nil表示无值,任何变量在没有被赋值之前的值都为nil,对于真假判断,只有nil与false表示假,其余均为真.而NULL是一个宏定义,值为0.并且,nil一般赋值给空对象,NULL一般赋值给ni ...

  7. ipython notebook设置工作路径和自动保存.py文件 ipython_notebook_config.py

    在安装完Anaconda,选择了配置环境变量后,打开cmd命令行 1. 打开命令行, 键入 ipython profile create 2. 键入 , 根据这个地址, 打开profile所在的文件夹 ...

  8. JAVAC 命令详解(转)

    本文来自:http://www.cnblogs.com/JeffChen/archive/2008/01/16/1041783.html 结构 javac [ options ] [ sourcefi ...

  9. Josn序列化与反序列化

    using System.Web.Script.Serialization; /// <summary>        /// 序列化器        /// </summary&g ...

  10. js 动态添加行,删除行,并获得select中值赋予 input

    <html> <head>  <title>Ace Test</title>  <script type="text/javascrip ...