(上接第二章)

  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. FreeBSD从零开始---安装后配置(三)

    IPFW和IPF   一.IPFW IPFW意思可以理解为ip防火墙,主要作用是拦截设定规则外的ip包.你可以把这个理解为linux下的iptables,但是,ipfw要比iptables简单易用. ...

  2. super语句

    1.super是对当前对象的父类对象的默认引用, 2.super必须出现在子类中(方法或构造函数),而不是其他位置 3.super无法访问private成员属性和方法

  3. Norflash控制器的Verilog建模之三(測試)

    前言:回校了,辦好手續就著手寫測試篇.初步的norflash控制器已經完成,通過硬件測試.目前的norflash完成扇区块擦除.单字节写.单字节读3个功能.博文最后附上源码. 总结:和之前的博文一样, ...

  4. ListFragment创建及其生命周期

    相同的ListFragment 带有一个无参构造 一个有参构造 在该Fragment所依附的Activity视图创建时被实例化一次 方法周期分别为1.无参构造2.onInflate3.onAttach ...

  5. springmvc图片文件上传接口

    springmvc图片文件上传 用MultipartFile文件方式传输 Controller package com.controller; import java.awt.image.Buffer ...

  6. Thinkphp的单字母函数整理

    有人不太喜欢TP这种单字母函数,其实这也是TP的一个特色,如果理解了这些函数的作用,不管是背,还是写,都是非常方便的,接下来我们以字母顺序开始.A函数 B函数 C函数 D函数 F函数 L函数 R函数 ...

  7. 采用UDP协议的PIC32MZ ethernet bootloader

    了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). 经过千辛万苦,今天终于 ...

  8. collection集合框架

    Java类集框架的优势:       1) 这种框架是高性能的.对基本类集(动态数组,链接表,树和散列表)的实现是高效率的.一般很少需要人工去对这些“数据引擎”编写代码.        2) 框架允许 ...

  9. 关于.net Microsoft.Office.Interop.Word组建操作word的问题,如何控制word表格单元格内部段落的样式。

    控制word表格单元格内部文字样式.我要将数据导出到word当中,对于word表格一个单元格中的一段文字,要设置不同的样式,比如第一行文字作为标题要居中,加粗,第二行为正常的正文. 代码如下 publ ...

  10. ES6 学习笔记(1)

    恰逢换工作之际,新公司的是以 ES6 + webpack + vue 为技术栈, 正好ES6是我下个学习目标, 因此买了阮老师的 ES6标准入门,也当是支持阮老师了. 笔记将会照着这本书的阅读展开而做 ...