Latent Dirichlet Allocation in Python

Shuyo's Weblog

Latent Dirichlet Allocation (LDA) is a language topic model.

In LDA, each document has a topic distribution and each topic has a word distribution.
Words are generated from topic-word distribution with respect to the drawn topics in the document.

However LDA’s estimation uses Variational Bayesian originally (Blei+ 2003), Collapsed Gibbs sampling (CGS) method is known as a more precise estimation.
So I tried implementing the CGS estimation of LDA in Python.

It requires Python 2.6, numpy and NLTK.


$ ./lda.py -h
Usage: lda.py [options]

Options:
-h, --help show this help message and exit
-f FILENAME corpus filename
-c CORPUS using range of Brown corpus' files(start:end)
--alpha=ALPHA parameter alpha
--beta=BETA parameter beta
-k K number of topics
-i ITERATION iteration count
-s smart initialize of parameters
--stopwords exclude stop words
--seed=SEED random seed
--df=DF threshold of document freaquency to cut words

$ ./lda.py -c 0:20 -k 10 --alpha=0.5 --beta=0.5…

View original post 32 more words

Topic modeling made just simple enough.

The Stone and the Shell

Right now, humanists often have to take topic modeling on faith. There are several good posts out there that introduce the principle of the thing (by Matt Jockers, for instance, and Scott Weingart). But it’s a long step up from those posts to the computer-science articles that explain “Latent Dirichlet Allocation” mathematically. My goal in this post is to provide a bridge between those two levels of difficulty.

Computer scientists make LDA seem complicated because they care about proving that their algorithms work. And the proof is indeed brain-squashingly hard. But the practice of topic modeling makes good sense on its own, without proof, and does not require you to spend even a second thinking about “Dirichlet distributions.” When the math is approached in a practical way, I think humanists will find it easy, intuitive, and empowering. This post focuses on LDA as shorthand for a broader family…

View original post 2,048 more words

实用为上

生活中的很多事情,归纳起来,最终都落脚到「实用为上」。

比如手机,比如MP3,从问世到如今,都经历了「从繁至简」,再「从简至繁」。
什么意思?最初的手机功能很简单,只是解决了传呼机只能传递信息却不能即时通讯的问题。后来的手机功能越来越累赘,几乎演变成了「万能机」。而现如今,「优化大师」「清理大师」的流行、iPhone的流行、三星对安卓的改造,都可以归结为一个核心,就是实用为上,易用为主,繁琐的功能不要,这就是「从繁至简」。
MP3演变的过程几乎也一样。
再说博客:博客不流行的时候人们就不写东西么?我想记事本、邮箱应该是用的最多的吧,很「简单」的时代;博客流行的时候,群雄争霸、各路博客服务瞬间涌现,好像博客就是万能的;现如今,Tumblr貌似已经盖过了主流的博客服务,Jekyll和Octopress也很流行,流沙成金,洗去喧嚣繁华,博客功能慢慢返璞归真。这就是记录、分享的工具,仅此而已,还是简单点好。
这么多年,Blogger几乎没有变过。还是写到这里吧。

via Blogger http://nourlcn.ownlinux.net/2013/09/blog-talk.html

不到长城非好汉

image

俗话说「不到长城非好汉」,来北京快3年了,昨天才想起来去爬八达岭长城。

八达岭长城属于延庆,从市区过去有几种选择方案:

  • 到前门坐旅游专列,往返100+元;
  • 到德胜门坐919公交车,单程全价12元,公交卡打折;
  • 到北京北站做S2线,单程6元,可刷公交卡;

我和女朋友选择了坐S2线,一个多小时就到八达岭站了。

需要注意的是,S2列车上的乘务员会推销八达岭的优惠套票,忽悠你省了5元钱还省时间、省路程,实际上不仅没有优惠,反而比八达岭售票处的价格还贵。提醒去八达岭坐S2线路的朋友不要上当。

登城、出城、下山,一共用了不到3个小时的时间。登长城给我的主要感受就是——部分游客还停留在进化未完成的阶段,堪比孙悟空。当然,说的主要是中国游客。

孙悟空跑到五指山,以为自己了不起了,撒泡猴尿再写个「到此一游」。从八达岭长城后山走到前山,绝大部分城砖上面都有各种签名、留言、标记。热门的地方比如烽火台,旧的签名还未褪去,新的签名又覆盖上了几层。

这些写「到此一游」的人都是什么心理呢?装领导题字?还是人无我有的炫耀心理?


内容转自微信公众账号「码农日记」,微信搜索「antdiary」或扫描二维码即可订阅。

image

via 蚂蚁的网络日志 http://blog.ownlinux.net/2013/05/the-great-wall?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+antalk+%28Ant%27s+Log+on+the+Internet%29

晨光BT之死


标题只是个噱头,本文所探讨的内容严谨一点来讲应该是“类晨光
BT的资源交流平台运营模式的建模与(简单)分析”。

 

  • 简介


所谓的“晨光
BT”是一种校园内部(北京交通大学)资源交流平台,最大的特点就是盗版众多、内部使用速度非常快。在这种资源交换环境中,每个用户会给予一定的初始资源(CG中折算下来是20G),而在资源请求的过程中系统逐渐会对用户的“共享率”提出更高的要求。这一要求简单的说就是下载1G的东西需要上传1.5G或者更高。在使用的时候也许很少有人会对这一系统的运营(运行,系统非盈利性)为何能够正常运行感兴趣,本文对这一资源交流平台进行建模并进行了一些讨论。

 

  • 模型及演化


首先对这一问题进行建模:假定系统中有
n个用户,每个用户都拥有无限可被请求的资源,并给予一个起始贡献分值s,用户每下载其它用户的1个单位的资源将消耗ratio分值(在现存系统中ratio > 1,最高为1.5,这里看起来与现行CGBT不一样,但是换个角度,将共享率转换为实际还可以下载的流量就能看出是一致的了)。


演化模型
1:选定cn(如c = 0.1)个用户为资源大户(大家感兴趣的资源都在他们那儿,是流量产出的主要来源)。在以下t步过程中的每一步,任意一个用户(包括资源大户)将以p(如0.9)的概率向大户请求1个单位的资源,以1 – p的概率向其它用户申请资源。


如果将这个系统看作能量交换,那么在没有外部能量注入的情况下,每交换一次资源,系统将损失能量
r-1。很显然,在次之后系统能量将只有初始状态的一半。但这并不是我所关心的,我更关心的是“用户死亡数”与t的关系。在这里选取一个时间点——半数用户处于“死亡”状态(无法再向其它用户申请资源,但是可以由其它用户向这个用户申请资源从而又活过来)的时间。

模型1的演化图 取n = 100,c = 0.1,s =
20.0, ratio = 1.5,p =
0.9,半数用户死亡时间是10(次)。图片是动态的,新浪博客的动态图片需要点“查看原图”才会看到动的。

 


既然系统能量是衰减的,那么什么样的因素能够延缓这一趋势呢?非播种员如果活动的概率较低,系统死亡一半用户的时间又是多少呢?进而可以在加入一个参数的情况下提出——


演化模型
2:与1不同之处在于增加一个活跃系数,设定播种员每一步都会有资源请求,而普通户则以概率access_probability(比如0.3)请求资源。

 

模型2
普通用户的请求概率与半数用户死亡时间的关系


演化模型
3:在2的基础上增加免费流量,另定义用户活动时有较小的概率mp申请免费资源。不再给出相应图表。

 

  •  结论


从上面的实验中可以看出,无论采用何种手段,系统死亡一半用户都是很迅速的。理解了系统的演化模式你就应该能够明白:

1.     

为什么
CGBT中会有多倍上传流量?为什么流量可以“买卖”?为什么经常要进行一些流量奖励的活动?


答:系统中最基本的运行是能量损耗的,必须从外部注入能量才能保持系统的正常运行。共享率越高,用户死得越快,因此我认为提高共享率并不是什么好事。

2.     

半数用户死亡,有这么夸张吗?为什么没有影响到我们的使用?


答:一、这个可以看看自己周围的人中有多少人的账号是不再使用的,最简单实在也是最严谨的是让管理员公布统计数据;二、
CGBT使用的人数基数大,有的人使用率非常非常低,半数用户死亡根本就不影响系统;另外CGBT每年还会有大量新生入驻,也是系统能量的巨大外部注入。

3.     

多数用户会死亡的根本原因是什么?


答:如果不能想清楚这个问题,那么这个实验就是失败的。用户死亡的根本原因就在于资源的集中性。大家感兴趣的资源不在普通手中,而在“播种员”手中,因而积分的流向总是从普通用户流到“播种员”或者“播种员”之间的。值得注意的是共享率只是决定死亡速度,高低并不影响结局。说句更远的,造成贫富差距主要原因之一就是(广义的)资源的集中性。

 

  •  其它
SkyDrive中提供了有相关的模拟实现代码(Python3写的,很简单),图表使用的是Matplotlib绘制,动态图是用Gephi生成然后制作的GIF。

 

  • 写在最后

   
这个演化模型的生命周期完全可以通过数学手段解决,但是我的功底还是太差了,用程序模拟演化有一个好处是可以将中间的演化过程更直观的表达出来。最后说一下做这个实验的初衷:我只是偶尔上
CGBT下点电影什么的,直到有一天我的号被封了,不能下种子,晚上8点以后还不准搜种子,找别人借来的账号下东西还提示“不能同时下载”什么什么的。我开始质疑“共享率”这个东西,像我这种需求不大的人,共享率怎么上得去?我又没有像实验室其它同学一样从来不关机通宵做种,哪里有那么多上传?我说我心疼已经“咔咔”作响的硬盘可以吗?(这种心态其实是不对的)一点点愤怒之余我动用了手上的服务器,整了几百G的东西放在那儿做种,共享率从1变到了6。但是这样做又有什么意义呢,还不如来做做这个实验。仅仅只是对系统的讨论,在这里仍然要感谢辛勤耕耘、无私分享的播种员们,是你们让我这研究生生活丰富了不少。
每当离别的时候我就会想起初一语文老师念到《从百草园到三味书屋》中的“Ade,我的蟋蟀们!Ade,我的覆盆子们和木莲们!”,感谢你们,感谢北交大,临行前来发这处子帖以示告别。

 青春就应该这样绽放  游戏测试:三国时期谁是你最好的兄弟!!  你不得不信的星座秘密

via Back and Forth http://blog.sina.com.cn/s/blog_439371b501018ikr.html

Install PyCharm and JDK on Ubuntu 12.04

Installing Sun JDK 7 on Ubuntu 12.04:
  • Download the sun jdk 7 tar file from here
  • Extract the tar file:
$ tar -xvzf jdk-7u4-linux-x64.tar.gz
  • Move extracted folder to this location:
$ sudo mv jdk1.7.0_04 /usr/lib/jvm/
  • Install new java source in system: 
$ sudo update-alternatives --install \
/usr/bin/javac javac /usr/lib/jvm/jdk1.7.0_04/bin/javac 1 
$ sudo update-alternatives --install \
/usr/bin/java java /usr/lib/jvm/jdk1.7.0_04/bin/java 1 
$ sudo update-alternatives --install \
/usr/bin/javaws javaws /usr/lib/jvm/jdk1.7.0_04/bin/javaws 1
  • Choose default java:
$ sudo update-alternatives --config javac 
$ sudo update-alternatives --config java 
$ sudo update-alternatives --config javaws
  • java version test:
$ java -version
  • Verify the symlinks all point to the new java location:
$ ls -la /etc/alternatives/java*
  • Enable Java plugin for Mozilla Firefox (even for Chrome)
#for 64-Bit jdk 
$ sudo ln -s /usr/lib/jvm/jdk1.7.0_04/jre/\
lib/amd64/libnpjp2.so /usr/lib/mozilla/plugins 
#for 32-Bit jdk 
$ sudo ln -s /usr/lib/jvm/jdk1.7.0_04/jre/\
lib/i386/libnpjp2.so /usr/lib/mozilla/plugins
  • JAVA_HOME configuration:
Some tools require JAVA_HOME variable. You can set JAVA_HOME in Ubuntu so simple: Edit the file .bashrc under your home directory and add the following lines: (if .bashrc is hidden click in Nautilus Menu View > Show Hidden Files)
export JAVA_HOME=/path/your/jdk 
export PATH=$JAVA_HOME/bin:$PATH

Install pycharm on ubuntu 12.04:
$ tar -xvzf pycharm-2.6.2.tar.gz 
$ cd /pycharm-2.6.2/bin/ 
$ ./pycharm.sh &