茫茫
身为标准的技术宅,克里斯也有和《生活大爆炸》里的4位主角一样不堪回首的交友经历:
在号称可以用算法找到最佳匹配约会对象的OkCupid网站上,他向数十位女性发送了“求交往”私信,
但只有6个人答应与他见面,而见面结果也不过了了。克里斯认为:这不科学!
其实克里斯曾经闯入过著名的“麻省理工21点小组”的大门,在赌桌上挥霍数学天赋,
这让他发现“数学系学生在很多情况下都可以用到自己的专业”。
而现在,爱情让他重出江湖。2012年6月的一个清晨,克里斯想到,算法其实可以帮助自己寻找真爱,前提是,得是一个足够牛的算法。
既然网站不能提供,于是他决定自己建构一个。
鱼儿不上钩,“抽”出来
克里斯所使用的OkCupid网站是由哈佛大学数学专业的学生在2004年创建的交友网站。它最与众不同的地方在于,它要求会员完成大量的多项选择题,内容包括政治、宗教、家庭、爱、性、智能手机等等方面,根据这些问题结果,网站可以用算法算出最匹配的约会对象。
所有的问题林林总总有数千道之多,但一般来说,用户只需要挑选自己感兴趣的350道问题进行回答。比如“以下哪项最有可能吸引你去看一部电影?”或者“宗教或神对你的生命有多重要?”除了选择问题,用户还可以选择只看有特定回答的对象,并且可以用从1到5的打分方式来表示这道问题对自己的重要性:0代表“不重要”,5代表“必不可少”。
在提交了所有的问题答案和要求后,OkCupid的引擎就开始忙碌工作,整理数据来计算两人的匹配度。分值越高代表越匹配,如果出现了100%,就表示这是每个人梦寐以求的“灵魂伴侣”。可惜的是,克里斯与洛杉矶女性的匹配度着实令人失望,问题在于OkCupid的算法。OkCupid所采用的问题,仅限于双方用户都回答了的问题。不巧的是,克里斯总是剑走偏锋,总喜欢选择冷门问题,这就直接导致了与他匹配的女性基数大为下降。在洛杉矶总共200万女性中,有约8万人在使用OkCupid网站,但克里斯的交友列表上,仅有不到100位用户和他有值得考量的90%的匹配度。
既然鱼不上钩,于是克里斯决定有的放矢,先了解自己的理想型都选择了哪些问题,然后再针对那些问题,修改自己的个人资料。这样的话,所有符合他的眼光的西施们都会出现在匹配列表里,而不符合的东施们则会被剔除在外。但怎样才能做到这一点呢?答案是,统计抽样。
要统计,最基本的就是数据。在灵感突如其来的这天凌晨,克里斯设置了12个OkCupid假账户,并编写了一个Python脚本,用来搜索他的梦中情人。这些潜在用户包括了从25岁到45岁的女性,这些用户的个人页面里的所有可用信息——种族、身高、星座、甚至吸烟习惯,都可以被Python脚本捕捉到,并且反馈给克里斯。
与此同时,为了深入了解芳心,克里斯还编写了一个bot机器人来侦测她们的问卷答案。由于OkCupid的“只有双方都有回答才能被显示”原则,所以bot机器人的工作是管理12个假账户,以这些虚拟身份随机回答每一个问题。反正假账户的存在目的并不是塑造完美先生,而只是探听对方都是怎么回答问题的,所以bot就算在每一个问题后“呵呵”也无关紧要。Bot机器人帮克里斯收集了大约1000份资料,让他初尝了技术在爱情上的威力。
真爱藏在600万条数据里
Bot机器人工作虽然卖力,但到了1000人上头,就被OkCupid网站屏蔽了。原来,OkCupid设置了一个“防套近乎”系统,如果有短时间内连续答题情况出现的话,就会被它毫不犹豫地拉黑。克里斯很惆怅,怎样能让机器人bot看起来不那么像机器人呢?
克里斯找到了他的神经学家朋友山姆?托里西。山姆也是个剩男,也在用OkCupid找女友,听到克里斯的伟大计划,一拍即合。他让克里斯在自己的计算机上安装了一个间谍软件,让这个软件跟踪记录自己使用OkCupid的方式。于是bot模仿了山姆的点击和打字速度,升级成了“山姆2号”,顺利地把OkCupid给骗过去了。
Bot机器人的成功卧底,让克里斯决定马不停蹄地从家里搬来第二台计算机,接上数学系的宽带,让机器人火力全开日夜运行。3个星期后,bot机器人冲出了洛杉矶,走向了全美,从2万女性用户那里搜集来了约600万条问题和答案。
庞大的数据群让克里斯陷入了数学狂欢。他把数学系的小小隔间当成家,像bot机器人一样日夜开工,只有在困得不行的时候,才在办公桌上铺个床垫,打个小盹儿。让克里斯不可自拔的是一个名叫K-Modes的算法,它最早出现在贝尔实验室在1998年对大豆作物的病变分析报告中,特点是可以把具有相似性的数据凝结在一起。克里斯调整了这个算法,使数据结果的粘度变得更为清晰。于是他发现,他的刻度盘把2万女性用户分为了7个在统计学上有明显区别的类型。
这一发现让克里斯“欣喜若狂”。为了证明自己的运算是正确的,他给机器人再次下达指令:搜集5000名在过去1个月内登录过OkCupid的洛杉矶和旧金山女性的问题和答案。这是一个参考样本,同样要被修改过的K-Modes算法进行分类。结果,第二次的样本以分毫不差的方式被分类为同样的7个类型。克里斯的统计抽样法经受住了实践的考验!
“算”出来不等于走在一起
在克里斯分析得到的7个类型里,并不是所有类型都让他怦然心动。比如说有1个类型太萝莉,另2个则太高龄,还有一个类型有着忠诚的基督教信仰,让克里斯望而却步。
克里斯感兴趣的是两款类型:一款是20多岁特立独行的年轻人,大多从事音乐和艺术相关活动;另一款则是熟女,从事创造性工作,比如编辑或者设计师。克里斯采取了“鱼和熊掌兼得”的策略,针对这2种目标人群创建了2份不同的个人资料,一份有他攀岩的照片,另一份则是他在一次演出中弹吉他的照片。
在这2种类型中,克里斯挑选出最常被选择的500道问题,并提交了答案。由于不希望自己未来的爱情建立在谎言上,所以他尽量如实作答。但技术宅的好强心让他没有到此止步。他又找出了一种名为“自适应提升”(adaptive boosting)的机器学习算法,在针对每个问题的重要性的评分上,计算出打几分才是最合适的。比如在“不管未来的计划如何,眼下更吸引你的是什么?是性还是爱情?”这一题中,虽然同样回答“爱情”,但克里斯按照“自适应提升”算法的建议,在针对年轻姑娘的问卷中,给该问题打分为“非常重要”,而对于熟女群,则给该问题打了5分,即“必不可少”。
在用算法全面武装了个人资料之后,克里斯重新检查了一遍自己与洛杉矶女性用户的匹配度,惊人的结果出现了。从前与他达到90%的匹配度的人数不超过100,现在光是匹配度达到99%的用户就已经溢出了第1页的列表。不敢置信的克里斯不停地翻到下一页,发现直到匹配度由高到低的1万名用户列表最后,匹配度仍然保持在90%以上。
即使有超乎常人的高匹配度,这还只是成功了一半,克里斯深知这一点。为了在有着同样匹配度的竞争对手中间让自己显得更加炫酷,克里斯专门写了一个新程序,用来查看与他有着高匹配度的女性用户的页面。这样每当程序浏览了对方页面,对方就会收到来自网站的提醒,自然也就会注意到克里斯的存在。克里斯编写的程序并不是随机浏览的,而是按照年龄顺序:周一浏览1000名41岁女性的页面,周二浏览1000名40岁女性的页面,以此类推,一直到两个星期后,浏览1000名27岁女性的页面。2个星期后,克里斯收到了约400次“被浏览”的消息:他成功吸引了女孩儿们的注意。
与网站发送的消息一道光临的,还有很多“求交往”私信:“我到现在为止还没有遇到过算牌很厉害的人,我觉得你的个人资料很有意思。我想跟你打个招呼。”“嗨,你的个人资料确实打动了我,我想跟你打个招呼。我认为我们之间有相当多的共同点,也许不是数学,但肯定有很多其他方面!”
克里斯一直锲而不舍地用程序和算法寻找女友,期间他经历拒绝与被拒绝,直到第88次约会。女主角是28岁的艺术系学生王婷,她也是克里斯用算法捕获的潜在女友之一。她觉得克里斯用数学找女友的方式很有意思,于是约了他出来。这一次,克里斯没有再找下一位。
到现在,克里斯和王婷的恋爱关系已经维持了一年多。在听完克里斯关于自己用算法找真爱的故事之后,王婷说:“我觉得这有点黑暗,有点玩世不恭,但我喜欢。”不过克里斯本人倒是很谦虚:“跟OkCupid上其他所有用户做的事情相比,我只不过多用了一点算法,活动规模更大一点,还使用了一些机器学习技术。”不过两人都同意的一点是,虽然算法和程序帮助他们走到一起,但序曲结束后的一切,还得靠他们自己。就像克里斯说的那样:“并不是说我们匹配度高,就会有良好的关系。那只是一种让我们走到一起的方式。”在最近的一次Skype通话中,克里斯对着镜头拿出一枚钻石戒指向王婷求婚,而她答应了。不过至于何时结婚,可能还需要再仔细算一下。