SQYBI.com

Change is a part of life, and takes part in finding us who we are.

2011年09月27日
by sqybi
5 Comments

你的网站价值几何?让PageRank告诉你答案

本文同时发表在果壳网死理性派栏目,传送门:http://www.guokr.com/article/65304/。因为字数原因,所以编辑对死理性派上发表的文章进行了一定的删减和修正。这里发出的是未删减的版本,表示“太理性了,看不懂”的童鞋们可以来围观此文。 如果你安装过Google工具栏,如果你建立过独立博客或个人网站,那么你肯定和PageRank打过照面。而即使是从未考虑建站的读者,也有很大一部分听说过PageRank,毕竟作为Google搜索结果排序的重要依据[1],这个算法已经被广泛应用于网络的每一个角落。而PageRank值的大小,也早已与网站的SEO[2]成功与否紧密相连。 那么PageRank的名称从何而来?PageRank究竟如何准确表示网页重要度,它的算法又是如何高效准确运行的呢?在PageRank的背后,有什么数学理论的支持?且听笔者为您一一道来。 三个孩子和豌豆游戏 从前有一个死理性派老爸,他有三个孩子。老爸是个懒人,他在家里把三个孩子叫做老大、老二和老三。 一天,三个孩子正在玩游戏,老爸把他们叫到身边。“我这里有三十颗豌豆,”老爸说,“我们来用它们玩一个游戏,游戏结束之后按照游戏结果把豌豆分给你们,好不好啊?” “好!”三个孩子异口同声地答应了。 “你们先在这张纸上写下你们喜欢的人,如果你认为另外两个兄弟你都很喜欢,那就把两个人的名字都写下来。比如我知道老二很喜欢老大,那么老二就在纸上写老大的名字。” 三个孩子很快写好了,然后老爸把纸收了上来。老大的纸上写了老二和老三的名字,而老二写了老大,老三写了老二。三个人互相喜欢的结果如图: 老爸清了一下嗓子,继续向孩子们解释规则:“接下来,我会给你们每个人分十颗豌豆。桌上有三个盘子,分别代表你们三个人,豌豆都放在盘子里。在我喊‘预备’的时候,你们要把盘子里的豌豆全都拿到手里。在我喊‘开始’的时候,你们要把手里的豌豆全部平均分给自己喜欢的人。” 老二举手:“那就是说,我每次都要把自己盘子里的豌豆全部拿起来,然后放到老大的盘子里吗?” “没错,”老爸说,“老三和老大也类似。大家都明白规则了吗?” 三个孩子点头。“好,那游戏开始!” 一开始三个孩子盘子里豌豆的情况如图: “预备!”妈妈喊到,“开始!” 三个孩子开始分配自己手中的豌豆。老二把十颗豌豆都给了老大;老三把十颗豌豆都给了老二;老大则是给老二和老三一人分配了五颗豌豆,如图: 三个孩子很快就麻利地分配好了自己手中的豌豆。这时三个人的盘子变成了这种情况: 老大有点不高兴了:“为什么我的豌豆比老二的还少啊?这个游戏不公平!” 老爸说:“这个游戏还没有结束。接下来我还会继续吹哨,你们也还要继续这个游戏,直到你们盘子里的豌豆数不再变化为止。公平不公平,到时候就能看出来了。” 老大虽然有点疑惑,不过还是点头同意了。 就这样,游戏一直进行下去。在下一轮的交换豌豆后,老大的盘子里有了15颗豌豆,老二有10颗,而老三只有五颗。当然故事在这里还没有结束,不过我们的描述要结束了。因为这个游戏将会持续很长很长时间——这点大概是死理性派老爸没有想到的。当然如果继续分下去,豌豆的数量将不再是整数,这一点我们也不深究了,游戏怎么能进行下去,就留给老爸想办法吧。 那么这个游戏最终的结果是什么样的呢?我们可以用电脑模拟这个过程,得出的结果是:老大和老二的盘子里各有12颗豌豆,而老三的盘子里有6颗豌豆。这时候无论游戏怎么进行下去,盘子里的豌豆数量都不会再变化。 网页排名和PageRank 在互联网刚刚发展的时代,人们曾经为网页的排名问题伤透脑筋。网页排名,顾名思义,就是为互联网上成千上万(当然,现在互联网上的网页数量已经不只是成千上万的程度了)的网页按照重要度进行排序。能够得知哪个网页更重要,对搜索引擎的发展十分有帮助——很显然,搜索引擎应该把重要的网页放到搜索结果中比较靠前的地方。 这个问题看起来很容易,但是解决的方法却没有想象的那么简单。 最初,一些比较流行的网页排名算法都很类似,它们都使用了一个非常简单的思想:越是重要的网页,访问量就会越大。于是,许多大公司就通过统计网页的访问量来进行网页排名。但是这种排名算法有两个很显著的问题:一是因为只能够抽样统计,所以统计数据不一定准确,而且访问量的波动会比较大,想要得到准确的统计需要大量的时间和人力,还只能维持很短的有效时间;二是访问量并不一定能体现网页的“重要程度”——可能一些比较早接触互联网的网民还记得,那时有很多人推出了专门“刷访问量”的服务。 有没有更好的方法,不统计访问量就能够为网页的重要度排序呢?在1999年,一篇以拉里•佩奇(Larry Page)为第一作者的论文[3]发表了。论文中介绍了一种叫做PageRank的算法,这种算法的主要思想是:越“重要”的网页,页面上的链接质量也越高,同时越容易被其它“重要”的网页链接。于是,算法完全利用网页之间互相链接的关系来计算网页的重要程度,终于摆脱了访问量统计的框框。 不过,不知道我们的死理性派老爸是不是了解,实际上刚刚他和孩子玩的游戏,就是PageRank算法的运行过程。 PageRank会给每个网页一个数值,这个数值越高,就说明这个网页越“重要”。而刚刚的游戏中,如果把豌豆的数量看作这个数值(可以不是整数),把孩子们看作网页,那么游戏的过程就是PageRank的算法,而游戏结束时豌豆的分配,就是网页的PageRank值。[4] 随机行走模型和马尔可夫过程 PageRank算法的思想基于“随机行走模型”(Random Walk Model)[5]。实际上,PageRank求解了这样一个问题:一个人在网络上浏览网页,每看过一个网页之后就会随机点击网页上的链接访问新的网页。如果当前这个人浏览的网页x已经确定,那么网页x上每个链接被点击的概率也是确定的,可以用向量Nx表示。在这种条件下,这个人点击了无限多次链接后,恰好停留在每个网页上的概率分别是多少? 在这个模型中,我们用向量Ri来表示点击了i次链接之后可能停留在每个网页上的概率(R0则为一开始就打开了每个网页的概率,后面可以看到R0的取值对最终结果没有影响)。很显然Ri的L1范式[4]为1,这也是PageRank算法本身的要求。 于是,整个浏览过程的一开始,我们有: 其中,A是一个表示每一次点击链接概率的矩阵。A的第i列第j行Ai, j的含义是,如果当前访问的网页是网页i,那么下一次点击链接跳转到网页j的概率为Ai, j。 这样设计矩阵A的好处是,通过矩阵A和向量Rn-1相乘,即可得出点击一次链接后每个网页可能的停留概率向量Rn。例如,令R1=AR0,可以得到点击一次链接后停留在每个网页的概率: … Continue reading

2011年03月16日
by sqybi
12 Comments

[挖坑] DotA英雄的攻击力浮动和暴击对实际输出的影响研究

update: 严酷的魔王神牛对这个问题进行了深入的分析,并得出了初步结论,请看这里:http://blog.programet.org/2011/03/同挖坑dota中对有限血量的目标进行攻击的研究.html 前几天和恩勋讨论到这个问题,然后就一直想写个文章验证一下。 讨论问题之前,先看一下我们的模型:无视一切回血、护甲、miss、攻速、技能等,只考虑攻击力和暴击。 其中攻击力有下界x和上界y(都是整数),每次打出的攻击是x和y之间的某个整数值(包括x和y),x和y之间的每一个值都会等概率地出现。 而暴击则是基于攻击力上的随机攻击加成,包括倍率k和概率p两个属性。 这两个属性表示,在英雄的攻击中,有p的概率会是附带攻击加成的,而这个攻击加成导致此次攻击比没有暴击的相应攻击高出了k倍。 上面的描述是给打过DotA的宅男们写的。可能这种描述对于没有打过DotA的MM还是一头雾水,还是从最基本的原理来解释吧。 当然,我下面的解释都是指这个简化模型,和实际的DotA游戏会有不少区别,如果是想学习DotA陪你的GG打游戏的MM,还是不要看这个了,多打几场才是王道……扯远了。 DotA里,英雄是一个玩家控制的基本的单位。英雄本身会有一定的血量和攻击力,还可以进行攻击。被攻击的英雄会失去相当于对方攻击力的血量。 我们假设有两名英雄,英雄A和英雄B。A的血量是1000,攻击力是20;B的血量是200,攻击力是100。 这样,当A攻击B一下之后,因为A的攻击力是20,所以B会失去20的血量。这时A的血量还是1000,而B的血量减少到了180。 然后,再让B攻击A一下。因为B的攻击力是100,所以A的血量变成了900,而这时B的血量是不变的,还是180。 这就是最简单的攻击模型。 当然,为了进一步简化问题,这个模型是不考虑攻速的。也就是说,每次A和B都会同时进行自己的攻击,所以有可能两个人会同归于尽。 下面基于这个描述,再讲解一下攻击上下限和暴击的问题。 所谓攻击上下限,就是说攻击力并不是一个固定的值,而是可以上下浮动的。比如如果有一个英雄C的攻击力下限是20,上限是25,这说明这个英雄在攻击对手的时候,可能打出的实际伤害有:20、21、22、23、24、25。而这六个数值的出现是等概率的。也就是说,每次攻击伤害的数学期望是(20+25)/2=22.5。 而暴击则更复杂一些。我们用英雄A举例,A的攻击力是20。 如果A有一个20%概率的3倍暴击,那就是说: 1.A有80%的可能不打出暴击,这时A对对手造成的伤害依然是20点; 2.A有20%的可能打出暴击,这时A对对手造成的伤害是:20+20*3=80点。 可以发现,A的攻击输出的数学期望变高了。这时A每次攻击造成伤害的数学期望为:20+20*3*20%=32。 当然,攻击上下限可以和暴击组合起来。这时,会先结算攻击上下限部分,确定一个实际攻击力T;再计算此次攻击有没有出现暴击,如果有,在T的伤害基础上加上暴击的伤害。 可以发现,如果我们有两个英雄X和Y,他们每次攻击造成伤害的数学期望是一样的。那么如果他们的攻击目标Z的血量无限,在经过足够长的时间之后,他们造成的总伤害期望也应该是一样的。 但是实际上,DotA的英雄血量并不是无限的。这时就会有一个问题了,让X和Y对打的话,谁赢的几率大一些? 之所以这篇文章是挖坑,那是因为我还没有为这个问题建立好一个数学模型。但是,我已经写了一个模拟的程序,对以上问题进行实验。实验结果如下: 1.英雄A的攻击力稳定为一个值,英雄B的攻击力上下限浮动较大,双方都没有暴击——此时A胜利的几率会更大。 2.英雄A的攻击力和英雄B的攻击力都稳定为一个值,英雄A没有暴击,英雄B有一定倍率的暴击——此时A胜利的几率会更大。 3.英雄A的攻击力和英雄B的攻击力都稳定为一个值,英雄A有一定倍率p的暴击,英雄B有一定倍率q的暴击,p>q——此时B胜利的几率会更大。 从以上三个实验可以看出一个明显的结论,那就是攻击浮动越小(或者说每次攻击力更接近,或者方差更小)的英雄,有更大几率在PK中获胜。 这是为什么呢?直觉上来说,攻击浮动大的英雄更容易打出“浪费”的伤害,所以更容易输掉。但是这只是“直觉”,具体胜利的概率是多少还有待证明。 当然还有很多其它的问题。比如在我把血量调高之后,上面提到的几个实验,双方胜利场次的差距都会缩小。这个是和我们的直觉一致的——在血量为无穷的时候,两个英雄的输出应该是相等的,前文已经说过了。那么,血量对这个实验的影响又有多大呢? 另外,我还想把暴击和攻击上下限浮动统一到一起。大概方向就是,给定自身的攻击力、暴击概率和暴击倍率以及对方的血量,计算出杀掉对方所需要的次数的数学期望。 好了,这样我就把这个大坑挖好了。欢迎任何宅男们抢在我之前来填坑,我会很高兴的。 或许对数学系的同学们来说是没有什么挑战性的课题?希望不是这样吧……真的是的话也不要bs我这个数学白痴,请大方地给出你的证明吧!

2010年11月22日
by sqybi
5 Comments

我的Milestone里的Android软件推荐

这个题目真纠结>.<。 最近买了一个Milestone,全键盘大屏幕真的很爽。然后也折腾了一下Android系统,还是蛮不错的。入手MS之后的第一件事就是,翻网站找软件,装了还算不少软件。正好前几天Layla也买了MS问我有啥好软件,在这里列个表推荐一下。 列出来的软件都是我的MS里装了的软件,不过不一定都是啥好软件,也有一些真的很难用。还是自己试一下比较好。 包含了买来机器就带的软件。 首先不得不说的就是Android的内存管理。可能很多人都听说过,Android的程序退出后会留在后台不被关闭,于是很多人就找各种各样的进程管理软件,比如我要推荐的这款Advanced Task Killer。但是实际上,频繁地关闭后台程序是没有任何必要的——因为其实这才是Android的内存管理系统强大的地方。 Android会根据需求自动释放内存,关闭后台程序;而除非你的内存真的不够用了而系统没有自动释放,否则根本没有任何必要去手动关闭后台程序,那些程序只是数据被暂存了起来,实际上是没有运行的,并不会占用CPU(当然如果你是按小房子退出到桌面的,那就另说了)。你如果经常手动kill这些进程,不仅会造成更多的耗电,而且会让这些程序再次打开的速度变慢——Android不让这些程序彻底退出的本意,就是加快下次启动的加载速度。 但是,这并不代表我们不需要Advanced Task Killer了。作为一款进程管理软件,它可以说是功能应有尽有。即使自动kill进程的功能我们用不到,它还是一款居家旅行杀人越货无所不能无所不在的必备软件——虽然是Killer,作为Manager的效果也不错。 评分:5/5 顺便提一款和ATK是同一个制作组制作的软件,叫做Startup Cleaner。能够修改开机启动项,对于提升开机速度还是有不小作用的。看了名字大概就能知道软件的功能了,所以就不多说了。 界面稍微有点乱,而且似乎有的启动项检测不到? 评分:3/5  

2010年07月18日
by sqybi
16 Comments

求生物学大牛解释——一件把梦境中的感觉带入现实的事情

真的很神奇,而我在这里也真诚的希望能够得到一个心理学(生物学?)上的正确解释,或者一句“无法解释”的结果。 我要讨论的是,人们的大脑会不会,(如果会的话)为什么会,把梦境中的身体上的疼痛感或者其它感觉当作真实发生的事情。 第一次看到这个问题,是在一本小说中。因为是科幻小说,所以我并没有理会它。或者说,我只是把它当作一个猜测。但是,今天自己亲身经历的事情,却让我对这件事产生了新的疑问和兴趣。 今天下午小睡了一觉,感觉睡眠并不是很深,但睡觉的时候在做梦。 梦的内容略去,但是在梦的最后,我梦见了我右脚的小趾磨出了一个水泡,而且很疼。 这时候,神奇的事情发生了。 因为我妈妈说话声音比较大,我被吵醒了。 说是吵醒了,但是在不到一分钟的时间内我还是持续着半梦半醒的过程。也就是,我在那段时间听见了我妈妈说的每一句话,同时还在继续着自己的梦,虽然可能已经很模糊了。 然后这一分钟过后,我彻底醒过来了。 这时,我的右脚小脚趾那个“磨出了水泡”的地方竟然神奇地还在疼痛。 为了确认是不是因为脚真的疼痛而导致我做出了那个梦,我特意检查了一下,小趾从外观上检查来看没有任何的特别之处,至少没有水泡。 可这疼痛感竟然还在持续,而且一点不比梦里的疼痛感更轻。 直到又过了不到五分钟(或者更短,具体时间无法估量),疼痛感渐渐消失。 再次检查,小趾依旧正常。 故事到此就算结束了,但是却引出了这篇文章。 梦里的感觉,真的会带入现实吗?还是说,我这次经历的事情,是一个什么特殊情况(比如小趾恰好在我睡觉到醒来那一段时间真的疼痛,虽然可能性微乎其微)? 如果我在梦里梦到自己死去的话,会不会真的导致现实中的脑死亡?还是说,我们的噩梦一定能在自己死去前醒来? 做梦做死这种可怕的事情,我可真不希望发生。 好了,问题就是这样。

2009年01月26日
by sqybi
23 Comments

橡皮筋, 硬币, 鸡蛋 -- 怪盗基德的瞬间移动魔术!

update: http://www.dxspjc.cn/thread-1386-1-1.html 刚看到了这个, 发现果然很无聊... 想继续保持魔术的神秘感的请勿点击以上链接. 春晚的确无聊了很多, 除了 Jay Chou 和宋祖英姐姐的那首歌让我笑喷了以外, 剩下比较好的就是这个魔术了. 当时看到上台表演的第一个魔术, 脑子里立刻蹦出了这个词: 怪盗基德的瞬间移动魔术! 嗯... 果然是看柯南看多了呢. 对了对了, 魔术师长得有点像林俊杰诶, 有没有人和我有同样的看法... 魔术有三个, 这里给认为春晚危害生命的同学们介绍一下, 同时说一句, 适量观看春晚有益健康. 由于不太好描述, 不清楚的请自行问身边的不怕死的同学. 首先是橡皮筋, 过程很简单, 把两个橡皮筋交叉起来, 并用两只手的食指和拇指分别撑开两个橡皮筋, 使得它们不能分开. 然后手不松开橡皮筋, 橡皮筋却奇迹般的分开了. 然后是硬币. 一大一小两个杯子, 小的那个正着放在桌子上, 大的那个倒着正好扣在小的上面. 接下来用一枚硬币, 主持人在硬币上签字以确认硬币没有被偷换, 然后魔术师把硬币抓在手里... 硬币突然就从大杯子的里面掉了下来, … Continue reading