最好走的路越走越难,最难走的路越走越容易

Follow guwendong on Web
  • Subscribe to Beyond Search via RSS
  • Join Resys Google Group
  • Follow @clickstone on Douban
  • Follow @clickstone on Twitter

Tag Archives: algorithm

Social Media Algorithm: StumbleUpon

StumbleUpon 是目前互联网上最老牌也最成功的个性化推荐服务。它创办于 2002 年初,目标很简单,“help people discover interesting or informative web content that they wouldn’t have thought to search for.”这里面直接突出了“search”和“discover”的区别,这点我非常同意,当你明确自己需要什么的时候,search 有用,但当你漫无目的的游逛的时候,你需要的是 discover。最近正好看到一篇不错的文章,也是在说这个问题,“Finding, Locating, Discovering”。

在 StumbleUpon 身上有一段儿传奇的经历。2007年5月,eBay 花了 75 个 million 的美刀把 StumbleUpon 收入囊中,而且据说当时 Google 对它也很有兴趣。但在归入 eBay 旗下之后,StumbleUpon 并没有取得预期的更大的发展,反而星光暗淡停滞不前了。其实这倒也没什么,要知道绝大多数类似的收购案例都是差不多的结局。但令人意外的是,差不多一年半以后,StumbleUpon 的两位创始人 Garrett Camp 与 Geoff Smith 又把它从 eBay 手里买了回来!算是拯救自己的孩子于水火了。无独有偶,据报道,eBay 刚刚把它2005年收购的 Skype 又给卖了出去。eBay 不好好搞自己的拍卖,当起了高科技二道贩子,让人无语啊。

好了,言归正传,说说 StumbleUpon 的算法吧。毋庸置疑,算法绝对是 StumbleUpon 的 top secret,外人是不可能知道确切情况的。所以我这里给出的,只是某位高人经过不断实验得到的推测。

具体的推理过程大家可以看那篇 blog,我这里直接给出结果:用来衡量一篇文章在 StumbleUpon 系统内得分的公式。假设 stumbler a 提交了一篇文章 d,d 属于 domain D。

这里面最重要的一个参数,就是 A -“stumbler audience”。stumbler 指的就是使用 StumbleUpon 的用户,所以顾名思义,stumbler audience 大概说的就是一个 stumbler 在 StumbleUpon 系统内的权重,它由下面三个主要因素构成,

  • Number of fans
  • Number of thumbs up and down you have given
  • Stumble thumb bonus – increase to score based on number of thumbs received on a page.

这个公式的大意可以理解为,文章 d 的权重,等于最初的提交者贡献的得分,加上后续 stumble up 用户贡献的得分,再减去后续 stumble down 用户带来的负面影响。
公式具体的解释如下,
1)第一个加号之前的部分,表示 a 的权重,除以 a 在 domain D 内总共提交的文章数。
2)第一个求和部分,表示后续的 stumble up 用户做出的总体贡献。alpha 是 stumble up 操作的调和参数。gamma 表示“organic bonus”,是一个预设值,是对使用了 StumbleUpon Toolbar 的额外加分。delta 表示“nonfriend”惩罚因子,用来减弱无/少 friends 用户的影响力。
3)第二个求和部分与前面这个类似,表示后续的 stumble down 用户对总体得分造成的影响。
5)N,比较奇怪,高人文章里说是一个随机数,不过我没太搞明白为什么要加这么一个参数。

不知道是高人的英文写作水平有问题,还是我的英文阅读能力不行,反正高人的这篇文章看起来非常晦涩,如果我这里的理解有什么问题的话,大家一定帮忙指出来。

延伸阅读:Social Media排序算法的四种模式,旁观者 – 郑昀

最后插一句,汪峰的新专辑《信仰在空中飘摇》,非常之好听,强烈推荐!

 

Social Media Algorithm: Hacker News

我发现 Hacker News 是因为 reddit 的缘故。Hacker News 所属的 Y Combinator 是 reddit 的种子投资公司,后来 reddit 卖给了 Condé Nast,两个团队都赚了一票。

Y Combinator 只关注于最早期的创业团队,在创业团队的起步阶段介入并提供相应的帮助。Y Combinator 会定期举行 Funding Application 的活动,接受创业团队提交的项目资料。项目如果评审通过的话,Y Combinator 会提供一种“$5000 + $5000n”模式的投资,其中 n 指的是愿意参与此项目投资的 Y Combinator 合伙人的人数。比如,如果有 2 个合伙人愿意投资,那么最终的投资额度是 $15000;如果有 3 个的话就是 $20000。作为回报,Y Combinator 将占有创业团队 2% 到 10% 的股份,通常是 6%。钱虽然不多,但在现今创业公司大量使用 open source,AWS 或者 GAE 的情况下,这些钱也确实够展开工作了。

据说 Y Combinator 已经累计投资了 80 多个创业项目,除 reddit 之外,我还算熟悉的另外一个是 Scribd ——“YouTube for Documents”。Y Combinator 最初总共为 Scribd 提供了 $12000 的投资。Scribd 在 2007 年 5 月正式上线,随即就是飞速地增长,上线一个月之后就完成了 $3.5 million 的 A 轮融资,2008 年 12 月又完成了 $9 million 的 B 轮融资,发展得很是不错。一个有意思的事情,Scribd 有一个超级 NB 的用户,Barack Obama,对,现任美国总统!

在 Y Combinator 的合伙人中,我个人比较关注的是 Paul Graham。他写过一篇流传很广的文章,How to Start a Startup。Paul 在 Anti Spam 方面颇有造诣,以前我在研究相关问题时,从他这里学到了很多东西。Paul 是 Lisp 的大牛,另外还是 Arc 语言的设计者,Hacker News 应该就是用 Arc 语言开发的。Paul 始终称自己是一名 programmer,相比于当前乌泱乌泱的架构师,很是洒脱。

下面言归正传,看看 Hacker News 使用了怎么样的算法。

hacker news

Hacker News 所使用的公式非常简单,

    (p – 1) / (t + 2)^1.5

其中,
1)p 表示文章得到的投票数,之所以要使用 (p – 1),应该是想去掉文章提交者的那一票。
2)(t + 2)^1.5, 这个是时间因子。t 表示当前时间与文章提交时间间隔的小时数。但为什么要加 2 之后再取 1.5 的幂,似乎就没什么道理可言了,也许是个 trial-and-error 的结果吧。

总体来讲,Hacker News 的公式不像 reddit 设计的那么巧妙。但是与 reddit 相比,Hacker News 的用户群比较集中,提交的文章更 Focus,质量也相对更高一些,因此实际的效果并不差。其实某些时候,解决问题就是这样,够用就好。

 

推荐系统:关联规则(3) —— FP-Growth 算法

在 1994 年 Rakesh Agrawal 提出了 Apriori 算法之后,关联规则挖掘技术的可用性得到了很大的提高。而且因为关联规则挖掘与生俱来的商业意义,使得它迅速成为了一个非常热门的研究领域,新的算法也不断地涌现出来。这其中,实用性比较强的一个算法,是由韩家玮教授提出的 FP-Growth 算法。FP-Growth 算法在 2000 年发表的这个 paper 《Mining Frequent Patterns without Candidate Generation》里有详细的介绍。读这篇 paper,我个人建议一定要同时把引文也都看一看,2000 年之前与关联规则挖掘相关的重要 paper,基本上都在里面了。

FP-Growth 算法的核心是 FP-Tree(Frequent Pattern Tree,频繁模式树)的构建,这个特殊的数据结构,是 FP-Growth 算法与 Apriori 算法相比,性能显著提高的原因所在。不过,仔细分析一下 FP-Tree 的实现,可以发现它与字符串处理算法中常用的 Prefix Tree 算法,有着异曲同工之妙。FP-Tree 通过合并一些重复路径,实现了数据的压缩,从而使得将频繁项集加载到内存中成为可能。之后以树遍历的操作,替代了 Apriori 算法中最耗费时间的事务记录遍历,从而大大提高了运算效率。详细的理论讲解可以阅读上面的论文,我这里还是把其中的例子翻译一下。

某数据库 DB 里有 5 条事务记录,取最小支持度(min support threshold)为 3,则生成 FP-Tree 的过程如下:

1、扫描一遍数据库,获取所有频繁项,删除频率小于最小支持度的项。在此操作的过程中,还可以得到每个项的出现频率,供后续步骤使用。这一步完成之后,我们得到以下频繁项, { (c:4), (f:4), (a:3), (b:3), (m:3), (p:3) },“:”之后的数字表示对应项的出现频率。这个结果是排好顺序的,首先按照频率从达到小排序,再按照字母顺序排序。需要注意的是这里的排序非常重要,之后每个事务中的项都要按照这个顺序进行排列,这个是有效合并重复路径的前提。

处理之后的数据库记录为:

TID 原始事务数据 处理后数据
100 f, a, c, d, g, i, m, p c, f, a, m, p
200 a, b, c, f, l, m, o c, f, a, b, m
300 b, f, h, j, o f, b
400 b, c, k, s, p c, b, p
500 a, f, c, e, l, p, m, n c, f, a, m, p

2、第二次扫描数据库,在第一次处理完成的结果基础上,构建 FP-Tree。

1) 取出第一条事务数据,构建 FP-Tree 的第一条路径,{ c, f, a, m, p }。注意其中项的排序与第一步中得到的频繁项集合的排序是一致的。
2) 取出第二条事务数据,{ c, f, a, b, m },不难发现,它与第一条路径共享了部分数据{ c, f, a }。因此,可以重复利用已有的路径,只需要将其计数加 1,即{ (c:2), (f:2), (a:2) }。而对于后面不同的部分,我们创建新的路径,{ (b:1), (m:1) },其中,b 为 a 的子节点,m 为 b 的子节点。
3) 取出第三条事务数据,{ f, b },发现没有重复路径存在。但 f 点是存在的,因此,可以重复利用 f 点,新建一个 b 节点,作为 f 的子节点,得到路径{ {f:3}, (b:1) }。注意,之前已经存在的 b 节点无法重复使用,因为其父节点为 a。
4) 取出第四条事务数据,{ c, b, p },发现没有重复路径存在。因此,从现有 c 点出发,构建一条新路径{ (c:3), (b:1), (p:1) }。
5) 取出第五条事务数据,{ c, f, a, m, p },同上原理构建路径,{ (c:4), (f:4), (a:3), (m:2), (p:2) }。

经过两遍数据库扫描,完成了 FP-Tree 的构建。在此例中,c 点为整个 FP-Tree 的唯一根节点,但其实多数情况下,根节点并不是唯一的,即有多棵子树。因此,为了方便树结构的遍历,可以人为添加一个超级根节点,通常标记为 root<null>。参照下图,可以更清楚的理解整个过程。

得到了 FP-Tree 树之后,再遍历整棵树获取满足一定置信度的关联规则,就比较简单了。具体的理论证明,以及与 Apriori 算法的 performance 对比,论文里讲得非常清楚,有兴趣的朋友可以看一下。

关联规则算法系列文章
1)关联规则介绍
2)Apriori 算法
3)FP-Growth 算法,这篇文章和上一篇隔得时间有些长了

 

1. 持续关注 个性化推荐 技术;
2. 持续关注 Semantic Web 技术;
3. 评论与上两项相关的互联网业务与产品;

我相信技术的力量!
wendell.gu@GMail.com

Archives