- 趣味数学和Python编程
- 赵乘骥编著
- 3714字
- 2025-02-25 16:52:06
1 Python和一个数学天才黑了约会网站的故事
Python从一诞生就吸引了人们的注意,多年来,它的地位一直在稳步上升。2014年,一名黑客改行的新闻工作者凯文(Kevin Lee Poulsen)报道了一名数学家兼黑客克里斯·麦金莱(Chris McKinlay)用黑科技收获爱情的真实故事,并火遍了互联网,让人们进一步认识到原来Python可以这么强大。故事源于2012年6月初的一天凌晨,35岁的加州大学洛杉矶分校(UCLA)数学系博士生克里斯一边用计算机做博士论文研究,一边打开一个新窗口查看他在约会网站OKCupid的收件箱。自从9个月前和女友分手后,他一直试图通过OKCupid寻找一份新的爱情。这个网站以通过算法自动匹配约会对象而出名,但他给那些被OKCupid算法吹嘘为很般配的女孩发了许多短信,大多石沉大海,在9个月的时间里他一共才和6个女孩见了面,都是一次之后就没了下文。这天,当他盯着那份孤独的个人档案,突然间意识到哪里出了问题。
OKCupid会员们需要回答从政治、宗教、家庭到爱情等各种各样的一系列问题。平均而言,会员需要从数千个问题中选出350个问题,对每一个问题,都写出一个自己的标准答案,同时以5分制打分的方式对其他回答进行评价。系统会根据用户对问题的回答,自动计算潜在约会对象间的匹配度并优先推荐匹配度高的人。
但从数学上讲,克里斯与洛杉矶女性的匹配度是非常低的。OKCupid的算法只使用两个潜在约会者都决定回答的问题来进行匹配,而克里斯选择的问题被证明是不受女性待见的。当他滚动搜索匹配对象时,只有不到100名女性出现在90%的匹配指数之上。而洛杉矶大约有200万女性,其中约8万人是OKCupid用户,在一个匹配度等于可见性的网站上,他基本上就是一个幽灵,这就是问题所在。
首先,他必须提高匹配人数。如果通过统计抽样,可以确定哪些问题对他喜欢的女性有重要意义,他就可以建立一个全新的个人档案,诚实地回答这些问题,而忽略其他问题。这样,他就可以匹配到洛杉矶每一个可能适合他的女性,同时自动过滤掉那些不适合的。要达到这个效果,首先他需要数据。为此他建立了12个OKCupid机器人账户,并编写了一个Python脚本来管理它们。Python脚本搜索年纪和他相仿的女性,访问她们的页面,并从她们的个人资料中搜寻种族、身高、吸烟与否、星座等内容。此外,为了找到调查问题的合适的回答,他不得不采取一些非常的手段。OKCupid可以让一个用户看到其他人对某个问题的回复,但前提是该用户也回答过这些问题。于是,克里斯设置了他的机器人随机地、简单地回答每一个问题,因为他并没有使用这些虚拟的机器人资料来吸引任何一个女性,所以机器人的回答本身无关紧要,重要的是要把这些女性的回答收集到一个数据库中。
然而,在收集了大约1000份个人资料后,他遇到了第一个问题。OKCupid已经有一个系统来防止这种数据收集机器人,它可以很容易地发现这些数据收割机。一个接一个地,他的机器人被禁止了。他意识到应该训练机器人模仿人的行为,这样才能防止被禁。
克里斯想起了他的朋友萨姆·托里西,一位神经科学家,托里西当时在教克里斯音乐理论,作为交换,克里斯教托里西高级数学课程。托里西也在OKCupid上有账户,他同意在自己的计算机上安装监视软件来收集他在该网站的使用习惯。有了托里西和自己的这些行为数据,克里斯编程他的机器人,模拟人的点击率和打字速度。他从家里带来了第二台计算机,把它插到数学系的宽带交换机上,这样它就可以24小时不间断地让这些机器人干活。三周后,他从20 000名女性那里收集了600万个问题和回答。这时候克里斯已经顾不上他的论文了,他大多数晚上都睡在自己的小隔间里,要睡觉的时候就在桌子上放一张薄床垫。
拿到数据还只是第一步,他必须在调查数据中找到一种模式,即根据女性的相似性对她们进行大致分组。他尝试了几种不同的方法,在尝试了贝尔实验室发明的一种称为K-mode聚类的算法后终于获得了想要的突破。根据自己的问题和回答,20 000名女性被聚类成7个统计上不同的群体。
他重新给他的机器人分配了任务,这次训练的样本略有差异,机器人收集了5000名在过去一个月登录了OKCupid的洛杉矶和旧金山的女性。然后又用K-mode算法聚类,证实了它们仍然以类似的方式聚类。统计抽样的方法看来是有效的。
现在,所有女性被他分成了7个群体,他只需要决定哪个群体最适合他就行。他查看了每个群体的统计特性。一组太年轻,两组太老,另一组太偏基督教。一组25岁左右的女性群体让他流连忘返,她们是经济独立的音乐家或艺术家,这看起来是个理想的群体。他决定在这里进行淘金。但是,邻近的一个群体的女性看起来也相当酷,她们略微成熟一点,专业从事创造性工作,比如编辑和设计师。最后他决定两个组都试试,为此他把两组分别命名为A、B组,针对这两组,又各优化了一份个人档案。
之后,他又通过文本挖掘这两个类别来了解她们感兴趣的内容,发现教育是一个共同的热门话题,因此他写了一篇突出自己作为数学教授的简介。不过,重要的部分是调查问题。他挑出了在这两组人中最受欢迎的500个问题并诚实地回答了这些问题,他不想未来的情侣关系建立在计算机自动编造的谎言之上。但是他也机灵地让他的计算机计算出每个问题的重要性,使用一种称为自适应增强的机器学习算法得出最佳权重,简而言之,哪个问题重要就回答哪个。
最后,两份个人档案新鲜出炉了,一个封面上他正在攀岩,而另一个封面上,他正在演唱会上弹吉他。对于问题的重要性,他完全遵循计算机的指示。一切设置好以后,他在OKCupid上搜索洛杉矶的女性,并按匹配百分比排序。喔呼!在顶部,满页匹配率为99%的女性,一页又一页,在翻阅了一万名来自洛杉矶各地的女性之后,他的匹配度仍然维持在90%以上。
匹配的女性完全找出来了,他还需要一步——引起她们的注意。在OKCupid上,当有人浏览某会员的网页时,该会员会收到通知,所以他又用Python写了一个新的程序来访问最匹配他的女孩的网页,并按年龄自动循环:
周一是1000名41岁的女性,周二是1000名40岁的女性;两周后,当访问完27岁这个群体的女性后,又循环再来。很快,女孩们回访了他的个人资料,每天约400人,消息随之滚滚而来。一位女士写道:“到目前为止,我还没有遇到任何人拥有这样的匹配度,我觉得你的个人资料很有趣。”
“我想我们有很多共同点,也许不是数学,但肯定还有很多其他有趣的东西!”,另一个人写道。
克里斯的匹配搜索的数学部分已经完成了。现在,他得离开办公室去约会。
6月30日,克里斯在加州大学洛杉矶分校的体育馆淋浴后,开着他那辆破旧的日产汽车穿过城镇,开始了他的第一次数据挖掘出来的约会。希拉是一位年轻的网页设计师。他们在Echo公园的一家咖啡馆共进午餐。但在约会结束时,双方都清楚地意识到,他们之间并无火花。第二天,他约会一个来自B组的迷人的博客编辑。他原计划在Echo公园湖边浪漫散步,但发现湖水正在疏浚,她最近一直在读普鲁斯特的书,对自己的生活感到沮丧。他觉得气氛有点压抑。
第三次约会也是B组的。他在韩国城的一家酒吧里和艾莉森见面了,她是一个正在学习编剧的学生,肩上文着一个斐波那契螺旋线。他们喝了韩国啤酒,聊得似乎很嗨,第二天在自己的小隔间里醒来,克里斯的头仍然很痛,他在OKCupid里给艾莉森发了一条信息,但她再也没有回信。被拒绝让他觉得很不好受,好在他仍然受到很多女性的关注,每天收到20多条主动示好的信息。信息太多,他只对那些表现出幽默感或在简介中显示出有趣特性的人做出回应,其他就只好忽略了。相比以前需要来回交换四五条信息才能成功安排一次约会,现在他只需要一个回复:“你看起来真的很酷,想见面吗?”
刚开始的一些约会他还颇费心思去安排。但是,约会队列中的女孩太多,他不得不提高效率,经常需要一天安排两次约会。他为此制定了一套规则来完成他的马拉松式爱情搜索。比如,不再喝酒,如果不合适就当机立断,不听音乐会,不看电影,保持注意力在彼此,不进行任何会让注意力转移的其他活动,等等。
经过一个月和这两个群体的人不停地约会,他发现自己为了约会东区的女孩群体而花费太多的时间在高速公路上。他删除了他在A组的个人资料。相应地,效率提高了,但结果还是一样。当夏天接近尾声时,他已经进行了55次约会,每次都仔细地记录在实验室的笔记本上。但只有三次约会后续又进行了第二次约会;只有一次导向了第三次约会。克里斯开始怀疑他的算法,也许网撒得有点大?
就在这时,28岁的艺术家、正在UCLA攻读美术硕士学位的克里斯蒂娜·王甜(Christine Tien Wang)发过来了一条消息。她在UCLA附近寻找6英尺(1英尺≈0.3048米)高、蓝眼睛男孩时突然看到了克里斯的资料,他们是91%的匹配。他在校园的雕塑花园约见了她,从那里他们走到一家寿司店。他立刻感觉到了彼此间的电流,他们谈论书籍、艺术、音乐。当她坦白承认在给他发短信之前,她对自己的个人资料做了一些调整时,他把自己的爱情黑客行为都告诉了她。“太黑了,太坏了”,她雀跃地说,“不过我喜欢。”
这是第88号候选人的第一次约会,接着是第二次,然后是第三次,两周后,他们都暂时关闭了他们的OKCupid账户。一年后,克里斯向王甜求婚,她愉快地答应了。
对王甜来说,克里斯的黑客行为是一个有趣的故事,但所有的数学和编码只是他们故事的序幕,一段感情中真正的“入侵”(hacking)发生在相遇之后。克里斯说:“我认为,我所做的只是对网站上所有人所做的事情进行了一个算法化、数据驱动和基于机器学习的改进,每个人都试图创建一个最佳的形象,我只是用Python结合大数据设计了一个。”