郑捷《机器学习算法原理与编程实践》学习笔记(第四章 推荐系统原理)(二)kmeans
(上接第二章)
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的更多相关文章
- [Java编程思想-学习笔记]第3章 操作符
3.1 更简单的打印语句 学习编程语言的通许遇到的第一个程序无非打印"Hello, world"了,然而在Java中要写成 System.out.println("He ...
- [Java编程思想-学习笔记]第1章 对象导论
1.1 抽象过程 Java是一门面向对象的语言,它的一个优点在于只针对待解问题抽象,而不用为具体的计算机结构而烦心,这使得Java有完美的移植性,也即Java的口号"Write Once, ...
- JavaScript DOM编程艺术-学习笔记(第二章)
1.好习惯从末尾加分号:开始 2.js区分大小写 3.程序界万能的命名法则:①不以,数字开头的数字.字母.下划线.美元符号 ②提倡以下划线命名法来命名变量,以驼峰命名法来命名函数.但是到了公司往往会身 ...
- [Java编程思想-学习笔记]第4章 控制执行流程
4.1 return 关键字return有两方面的用途:一方面指定一个方法结束时返回一个值:一方面强行在return位置结束整个方法,如下所示: char test(int score) { if ...
- [Java编程思想-学习笔记]第2章 一切都是对象
2.1 创建新的数据类型:类 通过第一章掌握了面向对象的理论后,我们知道每个对象必定属于一个类型,那么Java如何创建新的数据类型?如下程序所示: class Circle { // 属性 // 方 ...
- 《Java编程思想》笔记 第四章 控制执行流程
1.true和false if--else if--else, while, do--while 都使用条件表达式的真假来决定执行路径. Java不允许数字作为真假判断,C和C++可以非0即真. 2. ...
- 《UNIX环境高级编程》(APUE) 笔记第四章 - 文件和目录
4 - 文件和目录 1. 函数 stat.fstat.fstatat 和 lstat #inlcude <sys/stat.h> int stat(const char *restrict ...
- 《简明Python编程》核心笔记(1~5章)
2014年8月20日 <简明Python编程>核心笔记 (1~5章) 昨天和今天两天时间里.把<简明Python编程>这一本书学完了,包含书上的代码.现把核心笔记记录下来,以 ...
- 【C#编程基础学习笔记】4---Convert类型转换
2013/7/24 技术qq交流群:JavaDream:251572072 教程下载,在线交流:创梦IT社区:www.credream.com [C#编程基础学习笔记]4---Convert类型转换 ...
随机推荐
- CentOS开机无法进入系统,如何查错
开机时按e/F5按钮,进入选择系统界面 会出现 CentOS(2.6.32-...类似的选择列表,选择默认的系统然后按e: 这时会出现 root kernel ... initd... 三个选项,选择 ...
- [转] 主流JS框架中DOMReady事件的实现
在实际应用中,我们经常会遇到这样的场景,当页面加载完成后去做一些事情:绑定事件.DOM操作某些结点等.原来比较常用的是window的onload 事件,而该事件的实际效果是:当页面解析/DOM树建立完 ...
- system verilog的一些总结(从其他博客复制来的)
转载自 http://blog.sina.com.cn/s/blog_e7fec2630101f5t9.html SystemVerilog是一种硬件描述和验证语言(HDVL),它基于IEEE 136 ...
- Chrome和Firefox浏览器执行new Date() 函数传参数得到不同结果的陷阱
某日,同事问到关于new Date() 函数传参数,在火狐浏览器和谷歌浏览器控制台运行,会得到不同的结果,刚开始觉得不可能,后来实际操作才发现此陷阱 var date = new Date('2014 ...
- leetcode 189
189. Rotate Array Rotate an array of n elements to the right by k steps. For example, with n = 7 and ...
- VS2008下,aspx页面设计模式消失,只有黑白字体
版权声明:本文为博主原创文章,未经博主允许不得转载. RT,在工具选项里面重新设定的时候,报错,说一部分文件无法安装. 寻找一晚上,终于有了解决方案,供以后参考. luanwey(大陆响尾蛇)(不做温 ...
- Hive的安装
Hive的安装 第一步:解压并安装:第二步:配置 1)root用户下,解压后,改名为hive,并将hive文件夹赋给hadoop用户 tar -zxvf hive-0.9.0.tar.gz -C ...
- Python自动化 【第十二篇】:Python进阶-MySQL和ORM
本节内容 数据库介绍 mysql 数据库安装使用 mysql管理 mysql 数据类型 常用mysql命令 创建数据库 外键 增删改查表 权限 事务 索引 python 操作mysql ORM sql ...
- 时间服务器:NTP 服务器
15.1 关于时区与网络校时的通讯协议 使得每一部主机的时间同步化. DHCP 客户端/服务器端所需要的租约时间限制. 网络侦测时所需要注意的时间点.刚刚谈到的登录文件分析功能.具有相关性的主 ...
- 使用Gson解析json
前边的博客说过将json解析成java的方法,使用的是 这几个jar包,但是在解析时层遇到一个问题,就是在将时间字符串转换为java的Timestamp对象时会抛出异常,这个问题一直放在哪里没有去解决 ...