(上接第二章)

  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. LeetCode 169. Majority Element

    Given an array of size n, find the majority element. The majority element is the element that appear ...

  2. AX 2012 在Grid 中添加image标识状态

    refer to :http://kiwiaxguy.blogspot.hk/2013/10/displaying-image-on-form-grid-in.html

  3. git 远程仓库 轻松创建

    很多时候,为了方面管理我们写的代码,我们采用git 远程仓库来进行管理和备份.防止代码被他人篡改或删除.那如何来进行创建远程仓库呢? 1.我们必须有一个远程服务器端,在这里可以把任意一台电脑作为服务器 ...

  4. python字典嵌套字典的情况下获取某个key的value

    最近在用python写接口的测试程序,期间用到解析字典获取某个key的value,由于多个接口返回的字典格式不是固定的并存在多层嵌套的情况.在字典的方法中也没有找到可直接达到目的的方法(也可能是我对字 ...

  5. 傻瓜式操作Nagios

    傻瓜式操作Nagios   不少接触Nagios的朋友都会觉得安装配置困难,应用在企业网中所花费的时间成本很高,下面通过OSSIM来搞定它把. 为了节省资源,首先在淘汰的机器上安装一个低版本的OSSI ...

  6. 基于mini2440的Qt移植

    花了很长时间,终于把Qt移植到mini2440开发板上了,不能说完全成功,总算是完成一大步,各中过程心酸,废话不多说,下面正式讲解移植过程. 移植环境: win7系统,虚拟机是ubuntu12.04 ...

  7. struts2原理理解

    1.  由容器创建HttpServletRequest请求,这个请求经过一系列的过滤器,最终到struts2的核心过滤器(FilterDispatch), 2.  核心过滤器会根据url请求获得Act ...

  8. PSP个人(观众界面)

    需求:作为一个观众,我希望了解某一场比赛的比分,以便了解赛况.(满意条件:精确到每一局的结果比分) 需求分析:实现查询数据库中每一局的分数并用界面显示. 生成设计文档: 运用三层架构,实现软件的基本功 ...

  9. jQuery学习笔记(控件位置定位、尺寸大小的获取等)

    想做一个幽灵按钮出来,效果大概如下图: 当点击按钮的时候,会有四根线条从四个方向飞入,经历从“无-有-无”的闪入过程. 那么我的设计想法是,先在HTML中定义一个按钮,然后在jQuery中设计按钮点击 ...

  10. python中x,y交换值的问题

    今天碰到了python和其他语言不同的问题:赋值语句 x,y,z=1,2,3,执行 z,x,y=y,z,x 后,x.y.z 中分别含有什么值? 我想的是 x=2  y=2  z=2 可调试后应该是:x ...