豆豆、摇滚乐和应用数学拯救世界

A.豆豆拯救世界
有个冷笑话太冷,今天也挺冷的,就不讲了。笑话的主角分两类:一类是豆豆,一类是打豆豆的。
打豆豆者分为三类:
第一类是抱着崇高信仰神圣信念,视豆豆为不共戴天之仇人以打豆豆阶级为己任的打豆豆者。此种为少数。
第二类是投机取巧,在各种名目繁多的打豆豆活动中获取势能,在一定时刻便将此间势能释放获取动能达到自己目的。此种最可恨。
第三类是被迫的打豆豆者,因为前两者的存在,不得不选择打豆豆,不然就会被打,于是不得已拿起各种棍棒加入打豆豆之大军中,偶尔甚至会改进用以打豆豆的手段。此种需要多看童话。

豆豆分为三类:
第一类是拯救世界的豆豆,抱着崇高信仰神圣信念,视打豆豆者为不共戴天之仇人以打打豆豆的阶级为己任的豆豆。此种为少数。
第二类是投机取巧,在各种名目繁多的反打豆豆活动中获取势能,在一定时刻便将此间势能释放获取动能达到自己目的。此种最可恨。

第三类是真正经常被打的豆豆。一定条件下会变成打豆豆者中的第三类、或者第一类豆豆,或者是变成B里说的某些人。
关于打豆豆的冷笑话还有三个:
1、打豆豆者其实也是豆豆。
2、打豆豆是一个非零和活动,有时候需要豆豆兼打豆豆,或者打豆豆兼被打,聪明的豆豆和打豆豆者在此消彼长中积累势能,并保持活动的延续。
3、存在打豆豆的困境悖论,原因如2所述。

B.摇滚乐拯救世界

南平出的那事情大家都知道了。
其实我发觉我提起某些一面嘲笑着人类、社会,一面往下跳或者搞破坏或者只是挥着笔杆子敲着打字机的那些反人类、反社会者,都是会从心里生出一点点别样的兴奋感。其实这是很危险的。但这事属于例外,我是没什么兴奋感可言的。
这事还是让我想起了20世纪少年里的’朋友’,于是在此再次推荐一次这个史诗般的神作。我个人觉得大家评价不高的三个电影版我也觉得相当棒啊。
我让某人去看电影版的第一部的前2分钟,还有第三部的最后4分钟。
抛去中间的那大跨度的剧情不谈,就当那是一场梦,从起点到终点,从喇叭里放出T.REX替代了保罗莫里哀开始,就是摇滚乐拯救世界啊。(关于流行文化的音乐的话,Richard、Maksim什么的最讨厌了,Rhapsody、Mayhem之类的重金属摇滚最高啊!)
把摇滚延伸到音乐的话,推荐一个动画就是10年1月的空之音,理由如下:内容简单,作画精良。
另外推荐2个有意思的电影,Defendor和The Men Who Stare at Goats
两个故事都有陀思妥耶夫斯基的《白痴》的影子
一个故事间的是超级英雄故事
一个讲的是new age运动者(萨满?)的故事
故事的结局都如《大鱼》一般烂漫美妙。

C.应用数学拯救世界

说用数学拯救世界自然就是那个夏日大作战吧,不过这里说的是应用数学。

最近开始做的一点东西,还有打算要做的东西都需要一个推荐机制,于是就开始去研究数据挖掘方面的这些东西。
这是一个结合数据库、统计学之类的并不算高精尖的黑科技啊,其中最为重要就是应用数学。国内这方面的研究似乎十分滞后,于是只得在一堆基本看不懂的鸟语中摸爬滚打。台湾似乎都用这种东西来调教小学生的知识掌握情况了,国外有不少公司在提供这方面的解决方案,另外Netflix Prize(http://www.netflixprize.com/)这个赏金比赛在去年的冠军成绩已经比Cinematch高出10.06%了,果然一百万美元才是推动科技进步的源动力-_-
结合总各种开源内容管理、tag聚合系统的代码和一堆完全看不懂头绪的数学公式总算把我需要的东西的搞清楚了一点,鉴于我完全是一个实用主义者,学术上的东西就交给叫兽们去办。下面整理出一些引入简介和我的想法,给有需要的人节省脑细胞,同时整理下脑子里的东西(其实这也算数据挖掘吧)。

首先数据挖掘解决的就是数据过载,信息全无的杯具。用古人的话说就是赐予凡人面对海量数据一目十行百行千万行的能力。

因为我做的社会化方面的东西,比起全自动(非监督式学习)的数据挖掘(搜索引擎、决策支持之类的东西),下面涉及的内容主要是以社会哈的协同过滤为基础的。要实现的就是例如amazon的’买了这XXX的用户还买了YYY’,或者douban的’喜欢XXX的用户也喜欢’这类的东西。

从关联对象出发点来看分为基于用户(User-based)、基于项目(Item-based:http://grouplens.org/papers/pdf/www10_sarwar.pdf),如其名,一种是先找出相似用户,然后再通过相似用户来过滤项目,另一种则是直接通过项目间的相似度来过滤项目。各方面都说Item-based要优于User-based,而且运算需要的时间和空间复杂度都小(其实还是很大,后面我会说),并且可以离线整理关联。

下面就全部以基于项目(用户对项目打分,统计项目和项目之间的相似度)的方法来进行说明。

从过滤方法(IF)来分可以分为基于记忆(Memory-based)和基于模型(Model-based)。
Memory-based主要就是比对记录,整理出临近项之后即可得出结果。我的需求是使用的算法主要用来比对项目间的近似度,研究了一下可用算法包括:
1.曼哈顿距离,在二维体系中是(|x1 – x2| + |y1 – y2|),这个算法最简单,但是基于打分数据,实在不好说清楚对于一个项目x和y甚至是z如何定义,于是我也不知道拿它怎么办-0-所以先pass

2.皮尔逊积差系数,这个用协方差除以标准差,貌似挺简单的,在sql中可以直接用COVAR()和STDDEV求协方差和标准差,用where和join方式同时查询一个表两次列出用户同时评分的A、B项,然后按用户id进行order使A和B序列一致,即可很容易得出相关值,而且可以得到反相关值(相关值<0即反相关咯)。这个是我的首选方案之一。

3.但是在这里找到有个测试:http://www10.org/cdrom/papers/519/node28.html
结果是adjusted cosine(怎么叫这个?校准余弦相似性?),比皮尔逊积差系数和纯余弦相似(http://googlechinablog.com/2006/07/12.html)的准确性高出很多。主要好处是可以过滤掉用户自身的评分基准噪音。
但此算法对我来说相当复杂(两向量差的余弦公式是毛本身我就记不太不清楚,够杯具吧,三角函数什么的最讨厌了- -)。原理大概应该是把每个项目的用户评分看做n维向量,然后两个向量又分别减去用户的平均评分向量,然后求余弦。然后研究了半天没研究出化简后的数学公式是毛样子(如果你不往下看能给出答案你就是数学天才,快去拯救世界吧)。
于是请教了别人之后,整理出的算法是:
[求所有用户的(用对A项评分减去其用户的平均评分乘以对B项其用户的平均评分)的和]
—————-用来除以—————-
{[所有用户(对A项评分减去用户的平均评分的平方)的和]的开方 乘以 [所有用户(对B项评分减去用户的平均评分的平方)的和]的开方}
于是就世界和平了。
由于实在是复杂过头,而且还关系到一个用户的平均评分,这样的计算时间浮渣度比前者高,而且写成sql储存过程之类的需要join太多次或者先查询一次用ave求用户平均评分或者在平时就保存一个用户的平均评分。另外我做梦的时候梦到用户对某个项目的打分等于他平均打分,分母就会变成零,于是杯具出现(更杯具的是一个用户给每个项目都打同样的分数…)。因此,此作为第二方案。

上面就是Memory-based的相似度算法实现。在获取过滤的时候可以直接sql用where id查询然后order一下近似度直接就可以用limit方式过滤出最近的结果。
但是就空间复杂度来说,首先就是你至少需要n(n-1)/2个条数据来储存条目间的近似值({item1_id,item2_id,similarity} item1_id一直小于item2_id),然后我觉得通过遍历方式的优化应该是可以实现把条目数控制在当前存在相关值(相关值0都算)的条目之内。
然后计算复杂度来看,当用户进行一次评分行为之后,相似性就会被改变,至少需要遍历n-1次求出对应相似性之后才能得出具有最新时效性的相似性数据。于是只能是离线异步更新相似性数据了。

以上就是基于Memory-based的协同过滤方式的主要缺点:1.数据稀疏,占用过多空间,大部数据无用。2.记忆数据增量更新困难,无时效性。

然后是Model-based的协同过滤,这个就比较高级了,常用的实现方式,基本原理是奇异值分解(SVD),如贝式网络(Bayesian network)、聚类(Clustering)等,我还时间没仔细一个个去了解。基于模型的方式带来的好处就是可以离线异步进行模式学习,之后实时对未知项目和用户进行预测。目前我做梦稍稍想到一个基于项目聚类的完整的解决方案,先做出k个大类,进行基于记忆的相似度关联,然后再对类中元素进行内部对于k点的range关联,不过需要一开始一点点人工引导。基于此方式甚至可以把聚类做成tree形的-0-。

另外除了amazon和douban使用的协同过滤之外。可以作为社会化网络的推荐系统支持层的还有基于内容的推荐(但是对amazon、douban这种抽象项目不适用,倒是适合文章、blog一类的,我见过一些内容管理系统就是这样),

所以,我目前的想法就是可以像神棍的EVA里那个NERV的三位一体式的决策支持系统,分别对多种统计方式(除了前面一直做例子的用户评分之外,还有发表评论,标注tag等也可以作为数据源)、多套推荐系统的结果进行加权(Weight)、层叠(Cascade)、混合(Mixed),等方式求出最佳结果集。

晚上从sai姐姐说可以给我那传说中10w次otaku们对4k多种动画、漫画、宅书、电视剧的打分。第一步准备就是拿这个作为基准数据做出一套准确的推荐支持系统了。

(某个应用数学的少年赶紧再学点语言知识数据库知识然后来拯救世界吧,我觉得拯救世界什么的我是没希望了的-0-)

完。

Post a Comment

Your email is never published nor shared. Required fields are marked *

*
*

You may use these HTML tags and attributes <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>