原文地址:http://aimotion.blogspot.com/2009/12/playing-with-twitter-data.html
玩转Twitter数据:根据好友的状态信息用python对好友进行聚类/分组
大家好,
正如我在我的上一帖最后说,我会开写一些文章, 内容是在twitter上寻找新用户的一些尝试(一个实时微博和社会化网络的服务, 用户在这里可以发布最多140字符的消息)。目标是建立一个推荐系统,可以找到和我拥有相同的口味和偏好的新用户。
这篇文章将介绍有关数据的聚类分析的一些基本概念 ,聚类分析可用于发现和可视化一组拥有紧密联系的事物, 人,以及观点。为此,文章将会介绍如何收集和准备Twitter提供的数据,以及一些使用常规距离度量的聚类算法。一些图表也将作为图形可视化工具,用于观察聚类算法生成的数据(簇)。实现这些聚类算法的过程, 帮助我了解了如何去设计一个推荐算法. 使用特定距离度量方法去衡量一个用户在社会化网络中的得分.
在探讨这个问题之前,需要先向读者阐述一下有监督学习和无监督学习之间的差异。有监督学习通过数据和预期结果(标注结果),去“学习”如何处理新的数据. 通过当时已经”学”到的内容对新数据生成一个结果.不过,像聚类算法这样的无监督学习和神经网络或者决策树这类有监督学习是不一样的.这类的算法(无监督)不需要用预期的结果(标注数据)去训练。聚类的目的是发现目标数据集合的结构, 而不是去识别数据的模式。具体的说就是利用数据来发现其中存在的独立群组。在这篇和下篇文章中,我们将探讨一些无监督学习,如层次聚类和K-means算法。
现在,先从twitter的用户资料入手, 看看当用户的状态更新时(文本消息), 如何将他们进行分组, 并且可以分到同他们的状态(文字)和用词相匹配的小组中。
下面,我会介绍我是如何获取数据,处理和聚类这些数据, 最终得到一些有意思的结果。
第1步:获取Twitter的数据
第一步是获取所有twitter的数据。对于本文,我决定分析我自己的twitter社会网络。所以我只关注我的资料和我的朋友(我follow的)的资料。我们的目标是确定我和我的朋友如何进行分组。因此,预期的结果是,同我写类似内容的朋友应该获得和我较近的距离,反之写不同类型内容的朋友应该距离远一点。为了获取数据 我用了python-twitter库。它是一个twtter api的开源python接口, 可以非常方便的获取twitter数据。进一步的资料可以查看其官方 项目首页。
在这个实验中,我从twitter中随机选出100个朋友. 把他们twitter中出现的一些特定词的频率作为聚类的数据.现。下表展示了其中的一个子集。
通过用词频率来聚类用户信息,它可能把用户划分成不同的组,在这些组里面用户经常写类似的问题或者风格(如英文或葡萄牙文)。要生成此数据集,你需要下载twitter的用户状态数据,从其中提取出文本,并建立一个词频表。
为了下载Twitter数据,我开发了一个自定义版本的Python-twitter库。在模块里面,我开发了一些新函数,用于获取我的朋友在Twitter中的信息。我建议你下载这个模块,并使用它。要下载 twitterT.py点击这里 。
之后,我已经用Twitter的API,获取了twitter上我的和朋友的状态数据。函数 getFriendsIds 是用来得到包括我在内的Twitter的用户ID。你可以看下面的代码片段。
下一步是创建一个函数,将提取所有用户状态信息中的词。在实验中, 我下载了100个用户的最新100条状态信息。下一个片段显示了如何去完成这件事。
下一步是统计每条微博中每个词使用的次数, 并汇总成词表。因为象’the’这样的词将在几乎到处出现,你可以只选择词表中你认为有实际意义的词, 来减少词汇总量。我创建了一个英语/葡萄牙语的停用词表,包括了那些可以从你的词表里去掉的词。为了获得更好的效果,这步预处理很重要。你可以下载我的停用词列表 在这里 。要使用它只需要像这样导入程序: import stopwords。
最后一步是使用的单词列表和状态列表,创建一个文本文件,包含了一个大矩阵, 其中是每个用户状态的词频。我使用的模块 pickle 来存储这些表。这样做的好处是,你可以很容易地读和写数据,而不会失去对象的类型和避免进一步分析和处理数据。
第2步:聚类算法
本文中的类聚算法选择了层次聚类。它的主要思想是通过不断合并两个最相似的组建立一个有层次结构的组集合。每个组初始状态下只有一个单一的元素,在本实验中,就是一个用户的信息数据。这个方法在每次计算中先计算每两个组之间的距离,最近的合并在一起,形成一个新的小组。不断重复,直到只有一个组。图1显示了这一过程。
图01 - 层次聚类算法在过程
如图,元素的相对位置代表了他们之间的相似程度,两个元素越接近,他们就越类似。你可以看到每两个组(最接近一起)合并组成新的小组,新小组的位置用他们之间的中点来表示。在形成和合并小组的过程中,最后一步将最后剩下的两个小组合并到一块。
下一步是定义紧密度 。在本文中 , 我将使用 Pearson correlation(皮尔逊关联系数) , 以确定两个用户数据的相似程度。由于一些twitter状态信息含有较多的条目或比其他更长的条目,因此将在总体上包含更多的单词,Pearson关联系数就是用来解决这个问题的. 试图确定两组数据在之间的线性距离。请记住,pearson关联系数为1.0时表示两个元素匹配程度完美,接近0.0时表示两者没有任何关系。在这里,我们决定使用1减去Pearson关联系数,因为我们想用小的距离来表示两个元素相似。
对于层次聚类算法, 首先创建一个组群,每个原始元素就是一个组。函数的主循环中, 通过尝试每两个组和计算他们之间的关联程度, 找出最匹配的两个组。最好的两个组被合并到一个单一组当中。这一新组的数据是两个原先组中数据的平均值。这个过程重复进行,直到只剩下一个组。您可以在函数 hcluster 中找到全部层次聚类算法的的代码 。
步骤3:显示结果
树状图可以帮助我们更清楚的解读聚类得到的分组。层次聚类的结果通常都采用树状图,因为树状图可以在一个相对较小的空间内包含大量的信息。树状图是将节点按层次进行组织。对于上面例子的树状图显示在图02。
树状图不仅利用连接来显示元素最终属于哪个分组,而且也用距离来表示元素之间的差异大小。你可以看到了AB簇距离A和B元素要比DE簇到D,E元素的距离近得多。对图的解读可以可以帮助你确定一个分组中各个元素的相似程度,可以认为是一个分组的紧密度。
在这篇文章中 , 我将使用http://pythonware.com提供的Python库(PIL)来绘制树状图并以JPG格式保存
用PIL可以方便的用文字和线条生成图像,绘制一个树状图你所需要做的只是准备好文字和连线。在twitterClustering.py中可以看到如何绘制树状图的源代码。
你可以在图03中看到我的100个朋友(包括我在内)的聚类结果。调用drawdendrogram这个函数,它会产生一个名为twitterclust.jpg的树状图。
图03 - Twitter朋友聚类树状图
第4步:解读结果
- 语言:葡萄牙语x英语
结论:
在这篇文章中我介绍了我第一次尝试对我twitter上的朋友(我follow的)进行聚类分组。为此,我只考虑我朋友的twitter状态信息,并根据他们写的内容(文本信息),用聚类算法将用户进行分组。
这里所使用的算法是无监督学习方法一种, 叫做层次聚类。它的对数据的聚类效果很好,但它的缺点是计算速度非常慢(消耗的时间和计算能力),因为它需要计算所有元素之间的距离。
这里使用的距离度量方法是Pearson关联系数。通过树状图和标签云显示的结果可以给我们一些有趣的结论。算法成功地将用户聚类到分组中
其他技术也同样可以适用于这里。下一篇我将介绍一些其他用于聚类数据的方法, 以及一些功能强大的工具,用于显示分组之间的关系。
要下载源代码。点 这里 。
原文地址: http://nathanmarz.com/blog/hadoop-mathematics/
我希望我在一年前就知道这些。现在,通过一些简单的数学我终于可以回答下面的问题:
- 当机器的处理能力加快一倍, 为什么整个系统运行的速度没有增加一倍?
- 如果故障率增加10%,为什么整体的运行时间增加了300%?
- 为了得到最优的性能和容错表现, 一个计算机群应该部署多少机器?
一个简单的数学公式可以巧妙的回答所有这些问题:
运行时间=系统开销/(1 - (1小时数据量的处理时间) )
我们将在稍后证明这个等式。首先,让我们简要地讨论一下“Hadoop为基础的系统。(分布式系统)”1 Hadoop的一个常规应用是处理一个连续输入的数据流。这种工作流运行在一个“while(true)”循环当中,每一次处理的数据是上一次的运行结果。
接下来的分析可以归纳为一个简单的例子。假设你有一个工作流程需要12小时运行,因此,它每运行一次需要处理数据12小时。现在让我们假设需要做一些额外的计算工作,估计将在现有的工作流上增加两小时处理时间。问题来了。整个系统的运行增加的时间可能会远远多于两小时。它可能会增加10个小时,几百个小时,或者可能失去控制并且每一轮运行越来越慢。
为啥呢?
关键是你将系统需要12小时处理的数据运行时间增加到了14小时。这意味着下一次运行的工作流程,将有14小时的数据需要处理。由于下一个迭代有更多的数据,将需要更长的时间运行。这意味着下一次迭代会有更多的数据,等等。
要确定怎么让运行稳定,让我们做一些简单的数学。首先,让我们写了一个系统运行一次的公式:
运行时间=系统开销+(单机处理1小时数据的运行时间)*(总数据量/单击处理1小时的数据量)
系统开销是指任何常数时间的消耗。例如,启动一个程序的开销。任何运行时间同数据量无关的开销将属于这个“系统开销”这个类别。
“单击处理1小时数据的运行时间”指的是系统中的动态处理数据时间 。这是处理的实际数据量花费的时间,去掉了固定的系统时间开销。如果每个小时数据在系统中需要运行半小时,这个值为0.5。如果每个小时数据需要运行两小时,这个值为2。
对n个元素的数组,一个极简单有效的随机排列算法如下所示:
for(int i = n-1; i > 0; i–){
swap(i,rand()%(i+1));
}
这个算法初看起来并不自然,但其实是很简单的。直观地看,排列过程中,数组分为两部分:排列就绪部分(长度为n-i)和候选元素部分(长度为i)。每次从候选元素部分随机取一元素(rand()%(i+1)),放到排列就绪部分头部,将所占据位置上原来的元素扔进候选元素部分。注意到,候选元素部分的顺序是无关紧要的,因为一个元素无论处于什么位置,下一次被选到的概率都是1/候选部分长度。因此为了算法复杂度低和简单起见,每次都将被占据位置的元素与被选到的元素交换(这两者有可能是同一元素)。简单地说,它的思想就是从一堆元素中随机选出一个来,再从剩下的元素里随机选择,直到选完为止。
严格证明的话,用数学归纳法是简单的,对n进行归纳即可。但好久不做数学题,头脑快生锈了,因此尝试一下复杂一些的证明,证明思想是对原位置i的元素进行跟踪。
一. 先来说说什么是”左”和”右”
1. 左翼(left-wing)和右翼(right-wing)的历史
以左右来划分政治派别, 起源于法国大革命. 在那个叫路易XX为国王的波旁王朝最后掌权的年代, 法国议会的右边坐着保皇党人, 而左边则是激进改革派. 从那时候起, 为政治派别首先划分开了阵营, 便于扎堆和排队, 区分敌友.
2. 传统意义上的”左”"右”二元区分
先来看看, 左右翼阵营划分之初, 两边的区分
| 左翼 | 右翼 |
| 更多的经济干预 | 更多的经济自由 |
| 以消除不平等为目的 | 承认不平等的存在 |
| 绝对意义上的平等 | 获得机会的平等 |
| 自由主义 | 保守主义 |
| 无神论政府 | 宗教政府 |
| 法律支配文化 | 文化支配法律 |
从这个最基本的分歧上, 后续产生了分居两边的各种主义和体系, 社会主义/共产主义/资本主义, 大陆法系/英美法系等等
但”左”"右”的划分和阵营不是一个绝对的划分, 而是相对的概念
当法国大革命轮到罗伯斯比尔和雅各宾派上台的时候, 自由主义的左派在砍了国王的脑袋以后, 也开始为了维护自己的政权疯狂的砍其他异见者的脑袋.这一点上讲, “左”和”右”都可能成为保守派, 只要在他们掌权以后; 同时也都可能是改革派, 那是他们在野的时候.
倾国倾城的典故出自汉武帝
他在四五十岁平定内忧外患并且泰山封禅三年之后面对滔滔江山写了那首《秋风辞》
秋风起兮白云飞,草木黄落兮雁南归。
兰有秀兮菊有芳,怀佳人兮不能忘。
泛楼船兮济汾河,横中流兮扬素波。
萧鼓鸣兮发棹歌,欢乐极兮哀情多。
少壮几时兮奈老何!
一切忧愁源于对时光流逝的恐惧
而男人对时光流逝的恐惧感总是比女人要晚一二十年才出现并且表现点有所差别
女人的恐惧源于时光的蹉跎青春一转眼就不见,却还有那么多事来不及完成那么多欲望来不及满足那么多幸福来不及体验
而男人的恐惧源于在过去的几十年间,埋头苦干外拼事业内辅家庭,把自己的生活带上蓝图之后,一下几十年过去了,却不知道自己真的想干什么
刘彻也是在这个时候心生感慨
不过这个是题外话
阅读全文…
7年前的7月14日,一条名为“淇淇”的白鳍豚在武汉白鳍豚馆度过了22个春秋之后,在这一天孤独的离开了世界。
淇淇是人类见过的最后一条活着的白鳍豚。虽曾于2004年发现过白鳍豚的尸体,然而之后数次大规模的监测活动中却再也没能找到它们的身影。两年前的8月8日,这种我们从小熟知的“长江女神”,“水中大熊猫”,终于被宣告灭绝。
在白鳍豚馆里的22年中,淇淇虽然有过短暂的伴侣,绝大部分时间都是在孤独中度过的。设想一下,如果你是世间幸存的最后一个人,对于你这意味着什 么?是不是旷世的孤独、绝望与无助?这样不幸的事情正发生在它的身上。再也找不到谁与它结伴而游,喜欢结群的它只能在池中独自游弋;任凭它引吭高唱,这世 界上已没有谁能理解它的声音。 阅读全文…
假如你有1000万要办一个网站。下面两种方案:
1,用800万买性能高的服务器,200万雇专业能力一般的技术人员;
2,用200万买性能一般的服务器,800万雇专业能力优秀的技术人员。
哪种更划算呢?
之前想了几次这个问题,但一直没得到一个简便的答案。后来突然想到,这个事情在算法教科书里经常提到。大意就是,假如你的程序使用的算法的复杂度是高于线性的,那么你买一个性能提高了N倍 的机器,你的程序单位时间内处理的数据量并不会提高N倍。
那么机器与人的区别就是,更贵的机器为你的程序带来的性能提升是线性的;而一个优秀的技术人员,通过设计时间复杂度更低的算法,则可能帮你将一个性能较差的程序的性能以平方、立方甚至指数级别提升。如果这样想的话,第2种方案更为划算。
这是一个很开放的问题。这里只是从性能这个角度去考虑,而且纯粹是理论上的。实际中需要考虑的因素更多。大家有何想法呢?
作为一个纯真的少年,心目中的社会模型首先是这样的:
最低级的社会,是森林那样的社会,不需要任何组织和上层建筑,唯一的法则是“弱肉强食”。但是随着社会的进一步发展,弱肉强食的法则显然行不通了,比如我们总不能让相对较弱的妇女儿童随便被“弱肉强食”掉,或者有些人比较有远见、有些人较有智谋,但身体相对较弱,总不能让这些对群体有用的人也被“弱肉强食”掉。因此需要一个统治阶层,形成一套社会组织,来行使更有利于群体发展的社会法则。从这位纯真少年的朴素社会模型来看,统治天然是服务性质的。
但是随着纯真少年年龄的增长和阅历的加深,他变成一个理工男,并且看到了中国社会的很多现象都不符合这个朴素模型,甚至对这个模型进行修正也行不通。好奇的理工男于是慢慢形成了一套新的社会模型,来帮助自己理解新观察到的现象。就像物理模型一样,它摒弃了大量的繁琐的细节(有可能是重要的细节),只留下简单的一个社会过程。
一个模型通常需要定义一些极端简化的实体,这里也不例外。首先,有必要对好人和坏人来做一下定义。好人和坏人并不是两个截然分开的集合,而是数轴上的两个端点。极端的好人倾向于善待社会群体中的其他人,做事更倾向于责任、信仰,而不是受个人利益倾使;坏人则相反,更倾向于通过侵犯他人的利益来最大化自己的利益,做事更倾向于受个人利益趋使。
刚才提到的朴素社会模型,盲点之一在于统治阶层的形成过程。这个形成过程我们希望它是有序的、被有利于群体的法则支配的。但是悖论在于,统治阶层形成之前,新的法则尚不存在,社会基本上仍被“弱肉强身”法则支配,因此这个统治阶层形成的过程就大有问题。在这个新的社会模型中,统治阶层形成的过程中发生了一件重要的事情,与“劣币驱逐良币类似”,那就是“坏人驱逐好人”。
互联网从信息饥渴到信息过载, 几乎是瞬间完成的. web 2.0的普及更是带来了一个信息爆炸的时代.

对于海量数据的网络, 人们有哪些需求?
一种是”找”, 用户知道自己想要什么, 就像从杂物间里面找硬币一样. 另一种是”听”, 我不知道我要什么, 你来告诉我这里有什么好玩的东西, 也许我会感些兴趣.
十几年前, 有种叫搜索引擎的东西被造出来替人们去做第一件事情.但对于第二件事情, 却很难有个聪明的机器去替我们做, 因为机器还没智能到可以在没有任何人类提示的情况下, 从一堆一堆垃圾里面找到精华.
这里面唯一值得一提的就是新闻聚合, 把新闻网站的内容聚出焦点来. 这是一个好的开始, 但还不够.如果我怀着一颗好奇的心, 那么我该去”听”谁的呢? 网络时代之前的做法被沿用了下来.
1) 相信专业: 媒体编辑的职业就是干这活的, 天天看, 天天选. 他先替你一层一层选一遍, 你跟着他混就行了.这招准确率还行, 覆盖率不够. 同时严重依赖编辑的水平和操守, 最可怕的是遇到新闻联播型的媒体.
2) 相信大众: 别人都说好的, 咱也别错过. 这个依赖于群体智慧的整体水平.
3) 相信自己: 把所有东西看一遍, 自己来筛选精华. 这个方法好, 但似乎代价太大了……
“中国文化的核心之一就是一个“仁”字。仁者,二人也(圣人的诠释),换句话说,一个人是不是仁者,是他人决定的,而不是自己。如果大家都认为你是仁者,那么,仁者,便无敌了。”
据传简体中文版, 略有删节, 未找到电子未删节繁体中文版.
http://www.douban.com/subject/1068912/
其实所谓仁者, 往往都是忍者.















