Monday, September 26, 2011

What is a good explanation of Latent Dirichlet Allocation

晚上在Quora溜达,看到了个问题,关于LDA的,关于寻找LDA的一个良好的解释

众人合力得到了一个很赞的解释,这里我把最直观的解释翻译(部分翻译,有的部分还是英语表达更好)过来吧,同时来在学习的过程中对概率的一些知识进行了回顾(概率学了居然都忘了,只有模糊的印象)

场景


假设有下面的句子集合



  • I ate a banana and spinach smoothie for breakfast

  • I like to eat broccoli and bananas.

  • Chinchillas and kittens are cute.

  • My sister adopted a kitten yesterday.

  • Look at this cute hamster munching on a piece of broccoli.


LDA是一种自动发现这些句子中包含的主题(topics)的方法。比如,给定这些句子和两个主题,LDA可能会产生下面的这些:




  • Sentences 1 and 2: 100% Topic A

  • Sentences 3 and 4: 100% Topic B

  • Sentence 5: 60% Topic A, 40% Topic B

  • Topic A: 30% broccoli, 15% bananas, 10% breakfast, 10% munching, ... (at which point, you could interpret topic A to be about food)

  • Topic B: 20% chinchillas, 20% kittens, 20% cute, 15% hamster, ... (at which point, you could interpret topic B to be about cute animals)


问题是,LDA如何做发现这些的?


LDA Model


仔细来说,LDA使用混合的主题来代表文档(documents),这些主题将文档中的词(words)按照概率划分到不同的主题。LDA做了如下的假设,当你写文档的是,你会做如下的事情



  • Decide on the number of words N the document will have (say, according to a Poisson distribution).



  • Choose a topic mixture for the document (according to a Dirichlet distribution over a fixed set of K topics). For example, assuming that we have the two food and cute animal topics above, you might choose the document to consist of 1/3 food and 2/3 cute animals.

  • Generate each word in the document by:

  • ....First picking a topic (according to the multinomial distribution that you sampled above; for example, you might pick the food topic with 1/3 probability and the cute animals topic with 2/3 probability).

  • ....Then using the topic to generate the word itself (according to the topic's multinomial distribution). For instance, the food topic might output the word "broccoli" with 30% probability, "bananas" with 15% probability, and so on.


考虑到这种生成(generate)文档的模型,LDA试图从文档追溯一些topics,很可能是这些topics生成了这些文档。


样例


举个例子,根据上述model,当产生某个特定文档D的时候,你会这么做:



  • Decide that D will be 1/2 about food and 1/2 about cute animals.

  • Pick 5 to be the number of words in D.

  • Pick the first word to come from the food topic, which then gives you the word "broccoli".

  • Pick the second word to come from the cute animals topic, which gives you "panda".

  • Pick the third word to come from the cute animals topic, giving you "adorable".

  • Pick the fourth word to come from the food topic, giving you "cherries".

  • Pick the fifth word to come from the food topic, giving you "eating".


上述流程其实就是模拟人写文档的一个过程,这个由LDA model生成的文档为"broccoli panda adorable cherries eating"(LDA是一系列words的模型)


学习(ML)


首先假定有一个文档集合,已经选择了K个topics用于发现,希望使用LDA来学习出每个文档的主题表示(topic representation),以及每个主题相关的词(words)。怎么做呢?一种方法如下(collapsed Gibbs sampling):



  • Go through each document, and randomly assign each word in the document to one of the K topics.(对每个文档,将每个word随机赋予某个topic)

  • Notice that this random assignment already gives you both topic representations of all the documents and word distributions of all the topics (albeit not very good ones).(这种随机赋值也是一种学习的结果,不过我们需要去改进,方法就是迭代)

  • So to improve on them, for each document d...

  • ....Go through each word w in d...

  • ........And for each topic t, compute two things: 1) p(topic t | document d) = the proportion of words in document d that are currently assigned to topic t, and 2) p(word w | topic t) = the proportion of assignments to topic t over all documents that come from this word w. Reassign w a new topic, where you choose topic t with probability p(topic t | document d) * p(word w | topic t) (according to our generative model, this is essentially the probability that topic t generated word w, so it makes sense that we resample the current word's topic with this probability). (Also, I'm glossing over a couple of things here, such as the use of priors/pseudocounts in these probabilities.)(计算文档属于某topic的概率p(t|d)以及word属于topic的概率p(w|t),然后根据这个来计算当把某word w赋予一个新的topic的时候的概率,即p(t|d)*p(w|t))

  • ........In other words, in this step, we're assuming that all topic assignments except for the current word in question are correct, and then updating the assignment of the current word using our model of how documents are generated.(每次计算某word属于某topic概率的时候,假定其他word的topic是确定的,)

  • After repeating the previous step a large number of times, you'll eventually reach a roughly steady state where your assignments are pretty good. So use these assignments to estimate the topic mixtures of each document (by counting the proportion of words assigned to each topic within that document) and the words associated to each topic (by counting the proportion of words assigned to each topic overall).(迭代直到收敛,使用最后的值来表示每个文档的主题表示,以及每个topic 的words表示)



这个学习过程有点多,因此稍稍解释了一下,这个过程和PageRank很像吧,都是开始随机赋值,然后更新值,迭代直到收敛。

相关概率知识


看的过程中发现自己的概率都忘光了,于是看得时候把相应的概念在wiki上翻了出来,虽没都看透,但起码有个感性的理解了


狄利克雷分布是一个连续多随机变量分布,理解这个需要了解下面的知识


先验概率:简称先验,一个不确定量p的先验,是一个人在没有考虑数据的时候对于p的不确定性的判断,是这样一个概率分布。一个简单的例子是,假如p是选民会选A的比例,p的先验概率不能考虑民意调查,即选民不参考其他会影响他的vote的data。

对应的,后验概率如下:


后验概率是把相关的data考虑进去的条件概率,后验概率分布是从一次实验中得到的不确定量p的分布,再进一步,共轭先验。


假如概率先验分布p(θ)和后验分布p(θ|x)的分布是同一种分布,那么这就叫共轭分布,而该先验称为共轭先验。如p(θ)是服从高斯分布的,而p(θ|x)也是服从高斯分布的,那么这两个分布成为共轭分布。

这上述几个概念都是属于贝叶斯统计的


贝叶斯统计是统计的一个分支,在贝叶斯统计中,关于现实世界的真实状态的证据都是用贝叶斯概率http://en.wikipedia.org/wiki/Bayesian_probability来表达的,贝叶斯概率是关于概率的一种不同的解释,属于置信概率的范畴。概率的贝叶斯解释可以看作是逻辑的延伸,使得可以对不确定量进行推理。

参考文献:











Tuesday, August 23, 2011

如何通过不编程成为一个好的程序员

daily hack news看到推荐的一篇文章,原文是比较老的,2007年,How To Become a Better Programmer by Not Programming

摘录里面的几句话:

  • 对于Does accumulating experience through the years necessarily make programming easier?盖茨的回答如下:


    • I think after the first three or four years, it's pretty cast in concrete whether you're a good programmer or not.

    • 3-4年既可以看出来你是否是个好的程序员,编程经验的积累并不能让编程更加容易




  • The older I get, the more I believe that the only way to become a better programmer is by not programming. You have to come up for air, put down the compiler for a moment, and take stock of what you're really doing. Code is important, but it's a small part of the overall process.


    • 你需要离开电脑一会,仔细思量你做的东西,代码很重要,但只是整个过程的一小部分


  • To truly become a better programmer, you have to to cultivate passion for everything else that goes on around the programming.


    • 将热情倾注到编程相关的所有事情上去


  • You won't-- you cannot-- become a better programmer through sheer force of programming alone. You can only complement and enhance your existing programming skills by branching out. Learn about your users. Learn about the industry. Learn about your business.The more things you are interested in, the better your work will be.


    • 加入纯粹靠编程,你不可能成为一个更好的程序员

    • 了解你的用户,了解业界,了解你的生意,你感兴趣的事情越多,你的工作将会越美好


Monday, August 22, 2011

才储分析:您的性格类型倾向为“ ENFP ”

才储分析:您的性格类型倾向为“ ENFP ”(外向 直觉 情感 知觉 倾向度: E70 N52 F83 P52 不假思索指数:19)

热情洋溢、富有想象力。认为生活是充满很多可能性。能很快地将事情和信息联系起来,然后很自信地根据自己的判断解决问题。很需要别人的肯定,又乐于欣赏和支持别人。灵活、自然不做作,有很强的即兴发挥的能力 ,言语流畅。

ENFP型的人充满热情和新思想。他们乐观、自然、富有创造性和自信,具有独创性的思想和对可能性的强烈感受。对于 ENFP型的人来说,生活是激动人生的戏剧。 ENFP型的人对可能性很感兴趣,所以他们了解所有事物中 的深远意义。他们具有洞察力,是热情的观察者,注意常规以外的任何事物。ENFP型的人好奇,喜欢理解而不是判断。 ENFP型的人具有想象力、适应性和可变性,他们视灵感高于一切,常常是足智多谋的发明人。ENFP型的 人不墨守成规,善于发现做事情的新方法,为思想或行为开辟新道路,并保持它们的开放。在完成新颖想法的过程中,ENFP型的人依赖冲动的能量。他们有大量的主动性,认为问题令人兴奋。他们也从周围其他人中得到能 量,把自己的才能与别人的力量成功地结合在一起。 ENFP型的人具有魅力、充满生机。他们待人热情、彬彬有礼、富有同情心,愿意帮助别人解决问题。他们具有出色的洞察力和观察力,常常关心他人的发展。 ENFP型的 人避免冲突,喜欢和睦。他们把更多的精力倾注于维持个人关系而不是客观事物,喜欢保持一种广泛的关系。

您适合的领域有:未有明显的限定领域

您适合的职业有:(倾向度解释、类型盲点及发展建议见MBTI第二步分析)

· 人力资源经理
· 变革管理顾问
· 营销经理
· 企业/团队培训师
· 广告客户经理
· 战略规划人员
· 宣传人员
· 事业发展顾问
· 环保律师
· 研究助理
· 播音员
· 开发总裁
· 广告创意
· 广告撰稿人
· 市场营销和宣传策划
· 市场调研人员
· 公关专家
· 公司对外发言人
· 儿童教育老师
· 大学老师(人文类)
· 心理学工作者
· 心理辅导和咨询人员
· 职业规划顾问
· 社会工作者
· 演讲家
· 记者(访谈类)
· 节目策划和主持人
· 专栏作家
· 剧作家
· 设计师
· 卡通制作者
· 电影、电视制片人

问问自己:我怎样才能更好地服务于人类?回答这个问题并付诸实践。发现你独一无二的天赋,用它来为人类服务,你可以创造出自己所需要的所有财富。当你富有创造里的语言与你的同胞们发生共鸣时,财富就会自动涌现,由潜在的变为实际的,由精神领域的变为物质领域的。

———— 迪帕克

我现在的职业是IT民工,所以只能来计算个相似度了,

· 企业/团队培训师
· 广告客户经理
· 战略规划人员

这些貌似是近的,不过PM之类的我觉得可以有

Saturday, August 20, 2011

下半年要读的几本书

貌似某人说过,要么旅行,要么读书,身体和灵魂,必须有一个在路上。
就我目前的状况,时间和金钱都不允许,于是我只能让灵魂上路,旅行的事情,靠YY了。
入手了如下几本书,预计在下半年看完,提供时间利用率

1.程序员修炼之道,读了前沿等,似乎评价很高,俨然是作为一个IT民工不得不读的书,于是决定拿下,不然说不过去- -,预计耗时2-3周



2.数据挖掘概念与技术,当年学过,可惜没用过,基本上是白瞎了,现在正好可以用到,拾起来最好不过,预计耗时4-5周



3.卓有成效的管理者,该书为老大所赠,被我戏称为effetive management,预计耗时2-3周



4.黑客与画家,这是最近很多人推荐的两本书之一,阮一峰翻译,另一本是浪潮之巅,这个当年在google的黑板报看过部分,有空还是需要拜读一下的。预计耗时2-3周



5.万历十五年,此书为basca和skypath两位同学推荐,目前已经在地铁上看电子书看了一点,主要用来打发零碎的时间,预计耗时几个月

Wednesday, August 10, 2011

LINUX:使用 screen 创建并管理多个Shell窗口

大家平常在linux上开发(通常是开发机或者是测试机)的时候,有没有觉得需要开N多个窗口?a窗口看文件列表,b窗口做代码编辑,c窗口写makefile,d...。每次开始干活的时候都要依次打开这么多窗口,还得进入相应的目录,虽然自动登录和登录后的动作可以部分解决这个问题,但是依然让人不爽。尤其是有的登录处于安全无法完全自动化,而登录后的动作又会经常有所变化。
  使用 GNU Screen 就可以了。screen 可以在一个控制台(如XshellsecureCRT) 登录 shell 中创建和管理多个 shell 窗口。可以从一个 shell 窗口迅速切换到另一个窗口,最重要的是一天的工作完了之后,不必退出这n多shell窗口,而只是将它们detach,然后退出登录,下次登录的时候可以使用screen重新恢复上次连接的多个窗口。可以理解为是一个虚拟的远程主机,假如有一批服务开启了,如果你退出再次登录,他们都还在运行。
  安装就不说了,配置会在后面说,先说下几个简单实用的命令吧,详细的命令man一下吧。

  • screen:第一次使用的时候,输入screen,即新建了一个session,然后默认有一个shell窗口,下面会有状态栏显示窗口的名称,通常是“0 bash”。

  • ctra a + A:假如你想重命名这个窗口,按ctra a,然后A,就可以重命名

  • ctrl a + c:新建窗口

  • screen -t name:新建名字为name的窗口

  • ctrl a + n or p:切换窗口,n next,p previous

  • ctrl a + ":列出所有的窗口,也可以在状态栏观察到

  • screen -S name:新建一个session 名字为name

  • ctra a + d:使得当前的session detached,这个是很重要的一个命令,这个命令使得你临时退出了该session,而下次可以进行重新连接

  • screen -ls:想进行重新连接的时候,你需要知道你的screen session是哪一个,然后使用screen -r id命令,ls列出了所有的screen session的id,当然假如你使用screen -S name创建的session的话,会有一个名字,更便于记忆

  • screen -r id/name:重新连接screen session id/name,即恢复访问你之前打开的诸多窗口

  • exit:退出当前的窗口

  • ctrl a + K:kill当前窗口


  •   这些命令目前对于我来说已经足够了,然后来说说配置,默认的screen的配置是无法在状态栏上显示所有的窗口的,只能显示当前窗口的状态,当然你可以用列表的方式,或者切换来访问其他的窗口。其实可以展示成类似标签的更好的方式,即可以使用状态栏在视觉上进一步区分各个窗口。启动您喜欢的文本编辑器,在主目录中创建包含以下代码的 .screenrc 文件:
    hardstatus on
    hardstatus alwayslastline
    hardstatus string "%{.bW}%-w%{.rW}%n %t%{-}%+w %=%{..G} %H %{..Y} %m/%d %C%a

    然后每个新窗口就会显示在状态栏,包含编号和名称,如“0 econsh”。
      刚刚开始使用screen,虽然只是菜鸟级别,但是确实是个申请神器,因此迫不及待和大家分享一下:)
    参考资料:
    对话 UNIX: 使用 Screen 创建并管理多个 shell
    linux 技巧:使用 screen 管理你的远程会话
    linux下的screen工具配置(针对 string escape)