集体智慧编程-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 ...
随机推荐
- sass使用指南
[sass使用指南] http://www.ruanyifeng.com/blog/2012/06/sass.html
- poj3278-Catch That Cow 【bfs】
http://poj.org/problem?id=3278 Catch That Cow Time Limit: 2000MS Memory Limit: 65536K Total Submis ...
- nyoj1076-方案数量 【排列组合 dp】
http://acm.nyist.net/JudgeOnline/problem.php?pid=1076 方案数量 时间限制:1000 ms | 内存限制:65535 KB 难度:2 描述 ...
- 使用Linux之安装jdk 7
工具/原料 jdk7源码安装压缩包 方法/步骤 卸载OpenJDK rpm -qa | grep java rpm -e --nodeps java-1.6.0-openjdk-1.6.0 ...
- php 账号不能同时登陆,当其它地方登陆时,当前账号失效
解决的思路是每当用户登陆时我们必需记录当前的用户id和session_id,如果有人在其它地方用此账号登陆时,我们把此用户id对应的session_id的session文件删除,并重新记录当前的ses ...
- 数据库日志文件——数据库“xxx”的事务日志已满,原因为“LOG_BACKUP”
治标的方案: 参考网址:http://blog.csdn.net/tianlianchao1982/article/details/7388616 http://bbs.51cto.com/threa ...
- cmake重新编译
删除文件夹下的文件 rm CMakeCache.txt 重新编译即可 安装g++ yum install gcc-c++
- [Selenium] jsclick
SeleniumUtil.jsClick(driver, saveButtonEl);
- 原生 JS 实现移动端 Touch 滑动反弹
什么是 Touch滑动?就是类似于 PC端的滚动事件,但是在移动端是没有滚动事件的,所以就要用到 Touch事件结合 js去实现,效果如下: 1. 准备工作 什么是移动端的 Touch事件?在移动端 ...
- $.fn.extend 和$.extend函数
区别和详解:jQuery extend()和jQuery.fn.extend() 首先是简单的概述区别:$.extend()是类方法 $.fn.extend()是原型方法 对象方法和原 ...