集体智慧编程-discovering groups
这一章讲的是利用聚集算法对blog进行分类。
首先是构造数据,找到一组blog,每个blog包含一组单词。这样就形成了(blog-name, word*)*的数据结构。
在构造该数据结构的过程中,还需要删除那些出现得太广泛的单词,删除的办法是计算每个词出现的总次数以及blog的总数,两者的比例超出某个特定的数值则表明该单词太泛滥了。
然后是计算blog之间的距离,和前一章一样,存在两种计算的方式。欧氏距离和pearson相关系数。
然后是聚集算法,存在两种聚集的方法,一种是基于row的,另一种是基于column的。
初始化:每个blog都是一个cluster,共计n个cluster,形成clusters的向量;
一次聚集算法:
for 每个cluster
for 每个其它的cluster
计算出它们之间的距离
找出上述距离的最小值,以及形成最小值的pair。
将clusters中的pair对应的元素删除,同时将pair作为一个新的cluster加入clusters中,新的cluster包含pair的两个元素的内容。
通过这个算法,我们就能获得blog之间的相关性,如下图所示:
上图中ab比较接近,而de的距离比dc的距离更近。
这种表示聚集结果的方法叫做dendragram,就是按照层次化的方法展示聚集结果。怎么把一个cluster展示成一个dendragram图呢?一个很重要的结论是,所有的节点都在叶子上,所以叶子节点多少决定了图形的宽度和高度,因此可以得出如下的递归表达式:
如果parent的位置是x,y,up和bot表示上下两个儿子的节点数,并且每个节点的高度为const,并且up-d,bot-d表示儿子离parent的距离;
up的x为parent.x + up-d * 常数
up的y为parent.y + up * 常数 /2
同理算出bot的。这样就能算出整个节点树的形状。
-----------------------------------
上面讲的根据单词找出blog之间的相关关系,但是有时候找出单词之间的关系也是有意思的。如果一个单词出现在blog1,blog2中,另一个单词也出现在blog1,blog2中,那么我们认为这两个单词存在某种联系。
找出这种集群的算法很简单,和上面的算法类似,只是对向量做一个transform。
----------------------------------
然后再来看看kmeans算法。
初始化:随机选出k个点作为中心点,建立best-match:{中心:【中心点附近的点】}
迭代:
遍历所有的向量,
遍历所有中心点,找到该向量最近的中心点x
把向量加入大best-match【x】的集合中
遍历best-match所有的value,每个value是一个集合
找出这个集合的中心点,用它替换旧的中心点
计算对新的best-match的,每个点到其对应中心点的距离的总和;
如果这个总和呈现下降趋势则继续,如果出现上升,则停止;目的是使得这个总和最小。
----------------------------------
分析下,基于row的算法,每次归并1个点,共计n轮,每次计算任意两点的距离n*n,共计n^3复杂度。
kmeans算法,经历的轮数不确定,每次复杂度n*k,k代表集群个数。因此当n很大的时候,kmeans复杂度更低。
----------------------------------
然后怎样把kmeans的计算结果展现到图上呢?假设有n个point,相互之间的真实距离是real(i,j),如何呈现在一个平面图上?
可以使用梯度下降的方法。
首先为每个点随机分配一个位置(xi,yi)for i;
进入迭代:
for每个i
for 每个j
计算平面图上的各个点的距离dist(i,j),将其与real(i,j)进行比较,计算出总体的误差绝对值之和 totalerror;
计算出grad(i,j)表示i到j的向量
调整每个点的位置,如果它和其它某个点的距离太大,则根据grad(i,j)靠近点儿,否则离远点儿。
(可能出现abc一条直线,a离b太远了,但离c太近了,a靠近b了,就使得到c的误差更大了,从而进入死循环吗?如果这样,应该移动b和c距离)
不过梯度下降本来就可能得不到全局最优解。
------------------------------------
就这样,我们可以实现2中聚集算法,并把聚集结果正确显示出来。
集体智慧编程-discovering groups的更多相关文章
- Python 集体智慧编程PDF
集体智慧编程PDF 1.图书思维导图http://www.pythoner.com/183.html p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12. ...
- Note3 :《集体智慧编程》用户相似度计算
欧几里德距离评价: 以经过人们一致评价的物品为坐标轴,然后将参与评价的人绘制到图上,并考察他们彼此之间的距离远近.计算出每一轴向上的差值,求平方之后再相加,最后对总和取平方根. # -*- codin ...
- 《集体智慧编程》第7章代码 Python3执行出错
电子工业出版社,2015年第3版 P153,增加了buildtree函数后执行出错,报错为: ----------------------------------------------------- ...
- 《集体智慧编程学习笔记》——Chapter2:提供推荐
知识点: 1. 协作型过滤--Collaboraive Filtering 通常的做法是对一群人进行搜索,并从中找出与我们品味相近的一小群人,算法会对这些人的偏好进行考察,并将它们组合起来构造出一个经 ...
- 大牛推荐的30本经典编程书籍,从Python到前端全系列。
注:为了方便阅读与收藏,我们也制作了30本书籍完整清单的Markdown.PDF版以及思维导图版,大家可以在实验楼公众号后台回复关键字"书籍推荐"获取. Python 系列(10本 ...
- 豆瓣上9分以上的IT书籍-编程技术篇
在豆瓣上9分以上的IT书籍-编程语言篇中,收集了很多优秀的编程语言书籍,也得到了不少读者的喜欢.不过也有一些读者留言说某某书为什么没有,一种是因为某些书并不算讲某种编程语言的,一种是由于豆瓣9分以上这 ...
- 【Java】编程技术经典书籍列表
这个列表包括了 100 多本经典技术书籍,涵盖:计算机系统与网络.系统架构.算法与数据结构.前端开发.后端开发.移动开发.数据库.测试.项目与团队.程序员职业修炼.求职面试 和 编程相关的经典书籍. ...
- 遗传编程(GA,genetic programming)算法初探,以及用遗传编程自动生成符合题解的正则表达式的实践
1. 遗传编程简介 0x1:什么是遗传编程算法,和传统机器学习算法有什么区别 传统上,我们接触的机器学习算法,都是被设计为解决某一个某一类问题的确定性算法.对于这些机器学习算法来说,唯一的灵活性体现在 ...
- 【机器学习Machine Learning】资料大全
昨天总结了深度学习的资料,今天把机器学习的资料也总结一下(友情提示:有些网站需要"科学上网"^_^) 推荐几本好书: 1.Pattern Recognition and Machi ...
随机推荐
- Redis事务的简单理解
Redis事务的命令如下所示: 先以 MULTI 开始一个事务, 然后将多个命令入队到事务中, 最后由 EXEC 命令触发事务, 一并执行事务中的所有命令 示例如下: //开始一个事务 > MU ...
- cdoj第13th校赛初赛A - AC Milan VS Juventus 【枚举】
http://acm.uestc.edu.cn/#/contest/show/54 A - AC Milan VS Juventus Time Limit: 3000/1000MS (Java/Oth ...
- tf.cast()
一.函数 tf.cast() cast( x, dtype, name=None ) 将x的数据格式转化成dtype.例如,原来x的数据格式是bool, 那么将其转化成float以后,就能够将其转化成 ...
- QT隐式数据共享
QT中许多C++类使用了隐式数据共享,最小化资源拷贝.当作为参数传递时,实际只传递了指针,这是底层完成的,程序员无需担心,即使是在多线程中,从Qt4开始: 记住,尽量使用const迭代器,vector ...
- php 的多进程实践
php的多进程处理依赖于pcntl扩展,通过pcntl_fork创建子进程来进行并行处理. 例1如下: <?php $pid = pcntl_fork(); if($pid == -1) { ...
- python使用ip代理抓取网页
在抓取一个网站的信息时,如果我们进行频繁的访问,就很有可能被网站检测到而被屏蔽,解决这个问题的方法就是使用ip代理 .在我们接入因特网进行上网时,我们的电脑都会被分配一个全球唯一地ip地址供我们使用, ...
- cout<<endl 本质探索
C++中,有一种对象叫操控器(manipulators),专门用来操控stream的对象,在C++标准中,预定义好几种操控器,常见的有: flush 刷新output缓冲区,将内容写入输出设备 end ...
- Netty 源码(一)服务端启动
Netty 源码(一)服务端启动 Netty 系列目录(https://www.cnblogs.com/binarylei/p/10117436.html) ServerBootstap 创建时序图如 ...
- OC和C++混编
msg->mIntArg0 = PDP_TaskTip; NoticeData* noticeData = GET_SYSTEM(DataSystem)->getNoticeData(); ...
- vertical-align和text-align
vertical-align只适用于内联元素. 垂直对齐:vertical-align属性(转) 行高与单行纯文字的垂直居中,而如果行内含有图片和文字,在浏览器内浏览时,读者可以发现文字和图片在垂直方 ...