Greenwicher's Blog
Blog
2021-01-01T09:34:31.497Z
http://blog.greenwicher.com/
LIU Weizhi
weizhiliu2009@gmail.com
Hexo
Hello 2021
http://blog.greenwicher.com/2021/01/01/hello-2021/
2020-12-31T16:00:00.000Z
2021-01-01T09:34:31.497Z
<p>日历翻过一页,我们来到了2021,虽然生活并没有质的改变,我们都期望新的一年和2020能有所不一样。可现实是,没有期望,就没有失望。虽然听上去,消极了一些。但与其把目标定的过高,愿望定的太美好,导致与未来的现实有巨大落差,不如放平心态,有智慧做出当下最好的选择,有勇气去接受相应的结果,无论好与坏。尽人事,知天命。不以物喜,不以己悲。</p>
<p>人生当中的每个瞬间都是千年一遇,错过了就不会再重来,也没有机会去修正。2020年真的是太魔幻的一年。新冠疫情最终还是没有控制下来,蔓延到了世界各地。由此引发的经济萧条,美股熔断,原油负价,零利率,黄金比特币美股历史新高,各国停航,奥运延期,还有接下来的通胀。时代的一粒沙,落在每个人的身上,就是一座山。小到生活不便,大到生离死别。身边好多朋友的人生轨迹也因为新冠,发生了很大的变化。</p>
<p>年初的我是幸运的。因为美签被check,去年年底没有成行美国。因为找工作,过年的时候也没有回家,因此躲过了国内的新冠。然后,也顺利的在新冠全球大暴发之前,找到了一家对冲基金的工作。可能人生就是这样,有起有伏。我觉得我之前的人生基本走的都很顺,童年幸福,家庭和睦,本科拿到了美国数学建模竞赛的全球最高奖,博士也发了控制领域的顶刊,现在工作也是我最喜欢的选择。但是人生就像一盒巧克力,你永远不知道下一颗是什么味道。年末的时候,我才体会到什么叫做天塌了。之前有人问我,相不相信平行宇宙,此刻的我却是期盼有所谓的平行宇宙。</p>
<p>12月6号的时候,父亲在他介入手术前一天,告诉我他体检发现有原发性肝癌II B期,肿瘤还比较大。当时的我真的觉得世界失去了原有的色彩,变得灰蒙蒙的,整个人也变得恍惚起来,夜不能寐,茶饭不思。振作起来,发动身边的朋友资源,拿着我爸的检查结果去到处问,想找到当前最好的解决方案。真的非常感谢这些朋友们,有些素不相识,但都非常耐心而且贴心的回答我的各种问题。也非常感谢公司老板和同事,让我能够在中国远程工作。一切交待过后,确定好初步的治疗方案,订了我生日那天的航班从新加坡飞往中国。原本只需几个小时的行程,因为新冠被放大到14天。不过这也是不幸中的万幸,起码还有航班能飞到中国。隔离只剩5天了,加油!</p>
<p>前几天收到了达里奥的邮件,说到因为车祸,他失去了42岁的儿子。白发人送黑发人,这般伤心也必定是刻骨铭心,难以想象的。学校里的教育,很多都没有教到,包括面对死亡,人生的意义。上天是公平的,所有人都是一天24小时,凡人皆有一死。人有悲欢离合,月有阴晴圆缺,此事古难全。但正如达里奥所说的pain+reflection=progress,要向生活这个大课堂需要学习的还有很多。那些杀不死你的,终将使你更强大。一个人可以被毁灭,但不能被打败!</p>
<a id="more"></a>
<audio id="sound" autoplay loop><br><source src="father.mp3" type="audio/mpeg"><br>Your browser does not support HTML5 audio.<br></audio>
<h2 id="2020_u5E74_u603B_u7ED3"><a href="#2020_u5E74_u603B_u7ED3" class="headerlink" title="2020年总结"></a>2020年总结</h2><h3 id="u77AC_u95F4_u6536_u85CF_u5BB6"><a href="#u77AC_u95F4_u6536_u85CF_u5BB6" class="headerlink" title="瞬间收藏家"></a>瞬间收藏家</h3><p><img src="2020_Snapshot.png" alt="2020 Snapshot"></p>
<ul>
<li>图1是在SGH神经内科,还是第一次做CT。有惊无险,只是紧张性头痛,平时运动过少,后来医生开药之后就再也没有痛过了。还记得那天是我第一次面试现在在的这家公司。</li>
<li>图2是去参加新加坡航展,中国八一飞行队带来的表演。当时国内疫情已经很严重了,也辛苦飞行员们不远万里,辛苦训练,给我们带来这么完美的表演。然后F35的垂直升降真的是有点太厉害了,机动控制都很强。</li>
<li>图3是要离开待了快六年的NUS,和博士老板们吃饭。最终还是有挺多学术工作没有完结,估计这辈子应该也没机会再次进入这个领域了吧。</li>
<li>图4是公司三月份在武吉巴督的一片荒地种了一片树,据说可以长到50米,十一月份去看的时候,已经郁郁葱葱了。</li>
<li>图5是加入公司不到一个月,老板同意上线第一个策略。有了自己的book,感觉真的很开心。我的小小目标,global macro bartender更近了一步。</li>
<li>图6是红山社区支援抗疫前线人员,大家开启手机闪光灯,然后合唱Home这首歌。</li>
<li>图7是在家隔离了好一阵子,然后鼓足勇气出去买了些东西,才发现家里周围一大片HDB都被隔离用作安置客工了。</li>
<li>图8、图9是五月天和孙燕姿的演唱会,青年时代的最爱。</li>
<li>图10是师弟要回国内发展了,也不知道有没有教会他游泳。</li>
<li>图11是好朋友的求婚,真的很赞,着实感动了一把。</li>
<li>图12是好巧的知道有个老舅也在新加坡,跟他还有小姑吃了个饭。</li>
<li>图13是前年的照片,爸妈来新加坡参加我的博士毕业典礼。至今,也有1年半没有回家了。想得家中夜深坐,还应说着远行人。</li>
<li>图14是在回国的航班上穿着防护服,因为是第一班直飞郑州的航班,飞机上还好没有太多人。</li>
<li>图15是在隔离酒店经历的第一场雪。</li>
</ul>
<h3 id="u91D1_u699C_u9898_u540D"><a href="#u91D1_u699C_u9898_u540D" class="headerlink" title="金榜题名"></a>金榜题名</h3><h4 id="u7535_u5F71"><a href="#u7535_u5F71" class="headerlink" title="电影"></a>电影</h4><ul>
<li>最百转千回跌宕起伏的电影:<a href="https://movie.douban.com/subject/30334073/" target="_blank" rel="external">调音师</a></li>
<li>最魔幻又让人感动的电影:<a href="https://movie.douban.com/subject/26754233/" target="_blank" rel="external">八佰</a></li>
<li>最压抑的电视剧:<a href="https://movie.douban.com/subject/33447642/" target="_blank" rel="external">沉默的真相</a></li>
<li>设计最巧妙的电影:<a href="https://movie.douban.com/subject/30444960/" target="_blank" rel="external">信条</a></li>
<li>最引人深思的电视剧:<a href="https://movie.douban.com/subject/30181230/" target="_blank" rel="external">我们与恶的距离</a></li>
<li>最后怕的电视剧:<a href="https://movie.douban.com/subject/33404425/" target="_blank" rel="external">隐秘的角落</a></li>
<li>最感动的电影:<a href="https://movie.douban.com/subject/1292001/" target="_blank" rel="external">海上钢琴师</a></li>
<li>最希望我是主角的电影:<a href="https://movie.douban.com/subject/1292064/" target="_blank" rel="external">楚门的世界</a></li>
<li>最震撼的电影:<a href="https://movie.douban.com/subject/27010768/" target="_blank" rel="external">寄生虫</a></li>
<li>最治愈的电影:<a href="https://movie.douban.com/subject/1293359/" target="_blank" rel="external">菊次郎的夏天</a></li>
<li>最骄傲的电影:<a href="https://movie.douban.com/subject/32659890/" target="_blank" rel="external">我和我的祖国</a></li>
<li>最奇幻的电视剧:<a href="https://movie.douban.com/subject/27114935/" target="_blank" rel="external">无心法师</a></li>
<li>年度最佳电视剧:<a href="https://movie.douban.com/subject/30468961/" target="_blank" rel="external">想见你</a></li>
<li>最酷的电视剧:<a href="https://movie.douban.com/subject/30354606/" target="_blank" rel="external">唐人街探案</a></li>
<li>挺期待又最短的电视剧:<a href="https://movie.douban.com/subject/26637615/" target="_blank" rel="external">猎魔人</a><h4 id="u4E66_u7C4D"><a href="#u4E66_u7C4D" class="headerlink" title="书籍"></a>书籍</h4></li>
</ul>
<p>今年看书真的是太少了</p>
<ul>
<li>最引人入胜的书籍:<a href="https://book.douban.com/subject/10593148/" target="_blank" rel="external">Hedge Fund Market Wizards</a></li>
<li>最值得怀念的书籍:<a href="https://book.douban.com/subject/1106259/" target="_blank" rel="external">蓝猫淘气3000问</a><h4 id="u97F3_u4E50"><a href="#u97F3_u4E50" class="headerlink" title="音乐"></a>音乐</h4></li>
<li>最搞笑的音乐:<a href="https://music.douban.com/subject/2326444/" target="_blank" rel="external">ホーホケキョ となりの山田くん</a></li>
<li>循环最旧的专辑:<a href="https://music.douban.com/subject/34892627/" target="_blank" rel="external">想见你想见你想见你</a></li>
<li>最喜欢的旋律:<a href="https://music.douban.com/subject/5331254/" target="_blank" rel="external">Loving Strangers</a><h4 id="u6E38_u620F"><a href="#u6E38_u620F" class="headerlink" title="游戏"></a>游戏</h4></li>
<li>最期待的游戏:赛博朋克2077;虽然听说翻车了</li>
<li>最期待的游戏2:博德之门3<h4 id="u8F6F_u4EF6"><a href="#u8F6F_u4EF6" class="headerlink" title="软件"></a>软件</h4></li>
<li>Gyroscope X:新加坡隔离期间运动少,又点了太多外卖。体重一路飙升到历史最高,用了这款软件,逐步降了11kg,并且培养了一些健康的生活习惯。</li>
<li>MoneyWiz:放弃随手记开始转用MoneyWiz来记账了</li>
<li>RoamResearch:随时随地可以很自己的记录自己的想法,然后和已有的知识连接起来</li>
<li>PyCharm:真的很好用!</li>
<li>HeadSpace:冥想用的软件,每天都会有不同的内容<h4 id="u786C_u4EF6"><a href="#u786C_u4EF6" class="headerlink" title="硬件"></a>硬件</h4></li>
<li>Withings体脂称:之前买的体脂称都是用了没多久就不行了,withings这个还行,就是测心率感觉完全不准</li>
<li>iPhone 12 Pro Max:用了大屏手机感觉有点回不去了<h4 id="u65C5_u884C"><a href="#u65C5_u884C" class="headerlink" title="旅行"></a>旅行</h4></li>
<li>回家!</li>
</ul>
<h3 id="u5DE5_u4F5C"><a href="#u5DE5_u4F5C" class="headerlink" title="工作"></a>工作</h3><p>今年工作还算顺利,加入了一家全球宏观的对冲基金,有了自己的book,开发了几个不同的策略,自己心中的小目标也算完成了,虽然还是挺不完美的。现在的工作还挺开心的,同事人都很不错,老板真的特别厉害,无论是经验能力还是心态,真的要多多学习。现在既有研究的乐趣,又有落地的快感,就是和学术界不一样的是,探索性的工作不会特别多,要尽快的为投资者产生更多实际效益。另外除了量化之外,也要多多培养基本面的分析和直觉能力。</p>
<h2 id="2021_u5E74_u5C55_u671B"><a href="#2021_u5E74_u5C55_u671B" class="headerlink" title="2021年展望"></a>2021年展望</h2><p>执行力还是需要有待提升,削减不必要的事情,集中精力抓主要矛盾。晚睡、被动、不经常运动的坏习惯稍微改进了些。心仪的工作也找到了。CFA Level 2的考试被延期了之后再被延期,因为今年要在中国远程工作,可能暂时不会考虑考下次CFA了。博客去年也是没做什么更新。策略方面,希望今年能做到更多元化,然后稳定成长,和同事前辈多交流,互相学习。然后多花些时间陪陪父母,希望爸爸的病能控制住。自己的人生大事也要早日提上日程了。2021年应该会有更多挑战和不确定性,拥抱变化,拥抱生活。祈祷!</p>
总结2020年,展望2021年
Hello 2020
http://blog.greenwicher.com/2020/01/01/hello-2020/
2019-12-31T16:00:00.000Z
2020-01-01T10:12:19.820Z
<p>今天是21世纪20年代的第一天,可能也是因为这个缘故,昨天才显得格外的特别。毕竟我们告别了又一个十年,迎接下一个十年。初中课本里讲到的2020年中国实现全面小康社会的时间点也将来临,第一批90后也将逐步跨入而立之年。着实会感觉到一些惶恐,莫非这就是中年危机提前到来了嘛。</p>
<p>想着十年前的这个时候,我还在高三,想必刚刚结束数学竞赛和计算机竞赛。记得那一年雪下的尤其的大,我每天的生活基本一成不变,白天上课,晚饭吃个白糖饼夹麻辣串,然后就去学校机房练习算法题了,刷完题再去食堂买个馍夹里脊当做夜宵,睡前看会格言杂志。虽然大家都说高三的生活很苦,但我现在觉得那个时候的生活简单而不乏味。现在的自己虽然每天都会玩会游戏看会视频来放松,但却觉得有些空虚。</p>
<p>五年前的这个时候,我还在博士一年级。当时第一学年秋季学期的7天假期也没有请掉,现在想想还是挺可惜的。然后过一阵子马上又要开学了。想起来第一学期的6002,作业真的是好多,然后当时随机算法课程的大作业也真的是特别有意思。那个时候也刚刚开始了第一个研究工作,做多目标计算仿真资源的最优分配,紧张而兴奋。</p>
<p>三年前的这个时候,我记得当时在实验室改文章跨年。几个好朋友相约去台湾玩,其实还是挺想去的,但是第一篇文章的修稿快要截止了,遂作罢。当然开心的是,这篇文章后来也很快接收了,发表在了控制领域的顶刊上面。那年的我才24岁,想想还是蛮年轻的。</p>
<p>回忆杀就到此结束了,岁月真的催人老啊。前一阵子,有人问我,有没有感觉自己变老了。虽然不想承认,但确实会往这方面想,身体和记忆都大不如从前了,更可怕的是父母也一天天变老,陪在他们身边的时间也越来越少了。像去年一样,也选一首歌作为主旋律吧,虽然跟我没有半毛钱的关系,但真的好感动。这首歌是林俊杰的“将故事写成我们”,今晚就有MV啦,好期待。“这一生,原本一个人。你坚持,厮守成我们。却小小声,牵着手在默认。感动的眼神,说愿意,走进我的人生。进了门,开了灯,一家人。执子之手,如此温柔。天长地久,并肩走。你深情,凝望着我说。幸福,是你,有了我。”</p>
<a id="more"></a>
<audio id="sound" autoplay loop><br><source src="story_of_us.mp3" type="audio/mpeg"><br>Your browser does not support HTML5 audio.<br></audio>
<h2 id="2019_u5E74_u603B_u7ED3"><a href="#2019_u5E74_u603B_u7ED3" class="headerlink" title="2019年总结"></a>2019年总结</h2><h3 id="u77AC_u95F4_u6536_u85CF_u5BB6"><a href="#u77AC_u95F4_u6536_u85CF_u5BB6" class="headerlink" title="瞬间收藏家"></a>瞬间收藏家</h3><p><img src="2019_Snapshot.jpg" alt="2019 Snapshot"></p>
<p>以前看过一本书,叫<a href="https://book.douban.com/subject/1022582/" target="_blank" rel="external">瞬间收藏家</a>,特别喜欢这个名字。一张照片,一段视频,都是某个瞬间,记录某天某地某人的某个故事。绘画、相片、视频,我们都试图想保留点什么,为了弥补我们那差劲的记忆,让我们能够在未来回想曾经。瞬间,时间的瞬间,空间的瞬间,那时的感觉、那时的味觉、那时的听觉、那时的视觉、那时的触觉。似乎有了定格之后,我们就会以为那一刻永远的属于我们,这也是我喜欢live photo的原因,让你保留你喜爱的女生在那一瞬间嘴角的笑容。所以活在记忆里的人啊,其实只是不想让时间流逝。</p>
<ul>
<li>图1是在杨秀桃音乐学院听管弦表演。艺术的表现形式有很多种,有追求感官情感的共鸣,有追求节律赋格上的完美,也有追求机械与自然的和谐。这场音乐会表演了一个音乐小品,通过音乐的节奏音调音色来表达和推进一个故事。别具一格的是,乐团还通过形象的动作表演来让故事的表达更容易理解了。大意是几个男青“争奇斗艳,各显神通”,去追求一个年轻貌美的女子。这场音乐会还展示了一架18世纪的手工钢琴,声音会有些闷,听说保养也特别的精贵。</li>
<li>图2是农历新年大家一起看春晚。师姐师妹们特别喜欢朱一龙,当他出场的时候激动万分,哈哈哈,感觉真的好可爱。自己做了个番茄牛腩和清蒸鲈鱼,味道好像还行。</li>
<li>图3是南京大学的新春聚会,在冶春小江南聚餐。怀念当年在富春茶社吃早茶,然后去瘦西湖看风景。文思豆腐真的是好好吃!</li>
<li>图4是Marron 5的演唱会。有点坑爹的是主唱那天因为塞车迟到了,DJ暖了好久的场又给凉了。本来以为会有中文字幕的,结果后来除了熟悉的几首歌,都是在尬唱。国家体育馆还是不错的,来这边看球应该也非常棒!</li>
<li>图5是WorldQuant的线下聚会。当天随机两人组队,然后在规定时间内开发因子策略,并做报告展示策略的结果和想法。之后,大家去玩了密室逃脱。好像是叫恋爱大行动,以哆啦A梦为主题的,还蛮可爱的。就是当时的找不同的那关实在太费眼了。</li>
<li>图6是Troye Sivan的演唱会。见识到了很多神奇的人,然后也对澳洲英语口音印象深刻。小伙子真的好瘦啊,然后在舞台上蹦来蹦去的,太有活力了。周边感觉都是高中生,我和另外一个老年同学显得有点格格不入。不过真的超级嗨,堪比是个大型的Zouk。</li>
<li>图7是我家楼下的传统文化活动。应该在中国已经很少见了吧,这边经常玉皇大帝的生日、关羽的生日、某个娘娘的生日,都会举办祭典。看着戏子穿着超大的花脸面具,一个扮演王母娘娘还有一个神汉在神神叨叨,确实还是有点新奇。毕竟1元硬币都是自带八卦的国度。</li>
<li>图8是参加新加坡高校乒乓球赛。自己就是个打酱油的,上次打乒乓球可能还是小学的时候,那个时候好像每每下课都会打个十分钟,然后就很开心。自己对乒乓球还是不太熟练,球速有点快,反应还有各种应对有点跟不上。</li>
<li>图9是去看歌剧魅影。特别喜欢那个敲锣的猴子,除了面具和玫瑰,也算是歌剧魅影的一个标志吧。在B站上重温了歌剧魅影25周年纪念版,真的是被那个魅影还有女主给折服了。新加坡的表演还是差的蛮多的。然后当时似乎排了两三个月的场,每天又有两三场,也真是好奇这些演员是怎么适应这么高强度的表演。</li>
<li>图10是去WorldQuant参加alpha交流会,又认识了几个新的consultant。然后WQ的新办公室比以前大了好多,活动室也超级爽。可以看到海,各种xbox,乒乓球、国际象棋还有桌上足球,真的是工作休闲两不误。</li>
<li>图11是参加CFA Level 2的考试。这次真的没怎么准备,第一次考试这么虚。果然最后还是差一点点没有通过,还得今年再考一次了。要记的东西太多了,不好好花时间,还是蛮难通过的。今年报考人数似乎超级多,一级单独设了一天来考。有了去年的前车之鉴,这次没有被冻得感冒。</li>
<li>图12是昶哥来新加坡参加MSOM。我也去这个会当了把志愿者,做OM的人好多牛校的。还认识了一个在MIT读博,DE Shaw实习的博士生。昶哥依旧是那么帅气,刚好那段时间快是新加坡的国庆,昶哥还有幸看到了装甲车阅兵。</li>
<li>图13是参加博士毕业典礼。其实一开始拿到学位证的时候并没有太大的感觉。但是直到毕业这一天,可能周围都是毕业生,在I Was Here那里拍照,和老板和了影,还是挺感动的。哈哈,讲道理,我也是25岁就拿到了博士学位的人。</li>
<li>图14是爸妈来新加坡玩。带他们住了滨海湾金沙酒店,母上大人说下次还要来住。第一眼看无边泳池真的特别震撼,酒店本身的环境倒是一般挺Muji风格的。然后爸妈大概待了一周,当时也没啥时间概念,就是特别粘爸妈,感觉时间过得特别快。爸妈走的时候,还在机场驻留了好久,看着天上一架小黄点,算着时间,应该是他们的飞机,驻足又送了一会。其实新加坡还是有好多好玩的,只能下次再带他们玩了。</li>
<li>图15是无边泳池的剪影。真的是新加坡必来的一处景点啊。貌似现在好多condo顶楼也都有无边泳池了,真是好生羡慕。</li>
<li>图16是每年秋季老板家的聚会。组里的人真是壮大了好多,感觉一个屋子已经很难塞下了。也愿C4NGP,C4NGL两个研究中心,新的一年成果卓著,为新加坡民生作出卓越贡献。</li>
<li>图17是参加LOGMS会议。之前总听师兄师姐说这个会,还是第一次在家门口开。这里也辛苦XJ师兄了,交流访问的大部分时间都在筹备这个会议。虽然不是特别大的会,但前前后后,人事资源调配,都还是蛮费心的。老板还是比较有意思,在最后的gala dinner,献歌一首月亮代表我的心。哈哈哈,然后叫各位学术大佬一起上台唱,场面真的好热闹。谁说学者只会做研究。</li>
<li>图18是空军山芭的猫山王。想想自己因为上火,大概真的有两三年没怎么吃猫山王了。今年吃了好几次猫山王,简直太好吃了。无论是直接吃,还是冻着吃,比其他榴梿不知道好吃了多少倍。榴梿季又到了,是时候再去吃一波猫山王了。记得上次有个阿姨大概是买了20粒猫山王吧,感觉跟过冬一样,实在太可怕了。</li>
<li>图19是个栗子。只是用来举个不明不白的栗子。</li>
<li>图20是去SGH看病。应该是我第一次一个人去医院看病,当时连去哪里看都不知道,SGH又那么大。后来还是从偏门进了急诊室,都不知道在哪里挂号。不得不说这边的医疗效率太低了,等了五个小时,做了些常规的检测,看我是不是偏瘫。然后开了大街随处可以买到的止痛药给我吃了,然后就结束了。不知道是我有病还是啥情况,这边的医疗资源还是太差了。那段时间有了好多第一次,虽然是我人生的低谷期,但也成长了不少,以后还是要长点心啊。</li>
<li>图21是AirPods Pro。这款产品真的是期待已久了,便携又降噪,真的是生活学习当中的一大利器,应该是我今年买的最值的硬件了。大音希声。个头小,降噪稳,贴合高,不易掉。</li>
<li>图22是参加教堂婚礼。参加了不少婚礼,但在教堂还真是头一次。有一说一,唱诗班的歌真的是好好听啊。后面还有管风琴,如果有人能演的话,简直就太棒了。</li>
<li>图23是NUS工学院的年会。台上紫罗兰衣服的是我们系的一位特别德高望重的教授,美国工程院院士。感觉应该有70多岁了吧,还在带学生,和其他学者合作交流。值得一提的是,她是大名鼎鼎的贝尔曼的学生,我也是离dp大神又进了一步。哈哈哈。看着大佬在台上走秀,真是觉得他们心态比我年轻多了,会玩。</li>
<li>图24是新加坡的日环食。印象当中似乎在天文爱好者杂志上看过这次日环食的预告,没想到这个时候的我竟然真的在新加坡。本来以为天气不佳,然后自己最近又有很多面试,就不打算去看了。后来天气非常棒,想了想还是去滨海湾堤坝看了,毕竟下次同一地点是在54年后了,果然还是不错的。而且还看到了大批候鸟。不过论震骇,还是日全食更优秀。看到月亮的影子在大地一扫而过,万物俱籁,特别感动。</li>
<li>图25是昨天的跨年。去了师弟家玩德州扑克。师弟家就是有无边泳池,然后可以看到一片海的,真的是好羡慕啊。德扑还是挺好玩的,虽然借贷了几次,但是最终还是赢了不少。大家笑的就像地主家的傻儿子一样。</li>
</ul>
<h3 id="u91D1_u699C_u9898_u540D"><a href="#u91D1_u699C_u9898_u540D" class="headerlink" title="金榜题名"></a>金榜题名</h3><h4 id="u7535_u5F71"><a href="#u7535_u5F71" class="headerlink" title="电影"></a>电影</h4><ul>
<li>最让人落泪的电影:前任3。那一首体面还有说散就散,还有孟云和林佳的错过,真是让人唏嘘不已。『你们都在等,等对方先放手』</li>
<li>最搞笑的电影:哪吒之魔童降世。哈哈哈,真的是超级搞笑啊,适合全家老小一起看。四川口音也是有点醉。没想到喜剧元素还挺多的,虽然很多套路都能预期到,但依然没有阻碍自己哈哈大笑和再三回味。据传哪吒是宜宾人,所以四川导演就请来了四川配音嘛,太乙真人这样恶搞真的好嘛,哈哈哈。不过真的好搞笑呀,适合全家老小都来看。于此同时还是蛮期待下一部和姜子牙的。之前看一个人说,人生会有三个阶段,一是意识到自己父亲是个普通人,二是意识到自己是个普通人,三是意识到自己的子女是个普通人。希望自己不要过这样的生活吧,难得走一趟,还是要精彩些的。虽然有些鸡汤,但是我命由我不由天,你是谁只有你自己的说了才算。</li>
<li>最名副其实的电影:小丑。没有想象中那么好,负能量略多,男主演技都是满分,没想到他还演过She离的主角,真的是风格差好多啊,一个忧郁,一个癫狂。喜剧都有一个悲情内核。没有对比,也无所谓悲喜。姓名happy,性别男,年龄未知,职业小丑,症状不可控狂笑。一个不知道自己身世,『一出生就成了一家之主,活着的意义就是给别人带来快乐』,想要成为一名谐星,想要成为一名儿子。有的小丑开起了快餐厅走上了人生巅峰,有的小丑拍起了黑白片拥趸无数。而他只是一个普通的小丑,对孩子会很有爱,对女人抱有幻想,对母亲十分孝顺。哥谭市有自己的历史进程,然而他也万万没想到一个人的命运可以如此瞬变。朋友给了一把枪,自己二次被殴,杀了三个金融资本家,心里五味杂陈,谐星梦最终戏剧收场,四个嘉宾走了一个。他是英雄嘛?立场不同,总会有不同判断。剧情比预期的要差一些,但是男主的演技和电影手法真的都非常棒。值得一看,但是还是要理性蒙面,搞好经济发展才是硬道理。</li>
<li>最经典的电影:老友记。今年二刷了老友记,好多人都跟我一样。不知道干嘛的时候,就看看老友记,实在太下饭了。年轻的时候喜欢Ross和Rachel,现在觉得更喜欢钱德勒了。</li>
<li>最有脑洞的动画:瑞克和莫蒂。第一季还觉得一般,不如南方公园的脑洞,但是后面几季真的很精彩。</li>
<li>最期待的电视剧:猎魔人。已经上映了,但最近也没怎么看。毕竟玩了昆特牌这么久了,巫师3也玩了会,还是想再了解下原作的剧情。</li>
<li>最扣人心弦的音乐剧:歌剧魅影。虽然总是让我想到万泉河水清又清,然后魅影带着红军帽子的样子。但也不减那些经典歌曲带来的震撼。</li>
<li>最励志的音乐剧:汉密尔顿。这部剧也是把我看哭了,真的是太好看了。对汉密尔顿的最初印象,应该是从《伟大的博弈》这本书来的,知道他缔造了美国的金融体系,也知道了伯尔后来犯了叛国罪,但不知道汉密尔顿的这一生是多么的精彩。有生之年,一定要看一次现场版。起初只是对一开始的rap风吸引住了,后来听了my shot,被这个年轻汉密尔顿的精神所折服了。整部剧简直要感动的要死,直到后来汉密尔顿失去了妻子失去了大儿子,然后自己决定以死去教会别人how to say goodbye,以至eliza又决定让自己重回史学家的视角记录汉密尔顿的故事和建立纽约第一个孤儿所,简直要泪崩了。人性的光辉为何能如此的耀眼,让我觉得都睁不开眼睛,让我觉得自惭形愧。给五星实在太对不起这部剧了,绝对是人生必看的一部剧。I’m not throwing away my shot!同一首helpless,同一首satisfied,不同场景不同意味。</li>
<li>最让人停不下来的电视剧:庆余年。一堆老戏骨,张若昀也很可爱。<h4 id="u4E66_u7C4D"><a href="#u4E66_u7C4D" class="headerlink" title="书籍"></a>书籍</h4></li>
<li>最有心的书籍:木朵绘本系列。真羡慕有这么一个细腻而且会画画的父亲,实在是太有心了。</li>
<li>最看破生死的书籍:风沙星辰。不知死,焉知生。如果人生可以倒过来,一定是会懂得更多的事,也会纠正更多的错误。人活一个精气神,即使被束缚即使被压抑,内心也一定会在某天存在某种渴望的冲动,然后得以付出实践。行尸走肉的度过这一生,不留一点痕迹,真的是太浪费了,浪费了造物主的一片赤诚,浪费了自己唯一一次机会。所以趁着我们还有机会,努力去探索,热爱这个世界,了解自己,了解他人,连接世界,连接他人。珍惜每一次经历,去迎接更美好的未来。他对天空无限憧憬,最终投入它的怀抱,化作了一条航迹云。</li>
<li>最引人入胜的书籍:Hedge Fund Market Wizards。只读了一半,但是里面各种大佬的故事真的让人激动人心。从这本书第一次知道Edward Thorp,真的是神一样的人物。</li>
<li>最值得期待的书籍:The Man who Solved the Market。还没开始看,但已经摩拳擦掌啦。<h4 id="u97F3_u4E50"><a href="#u97F3_u4E50" class="headerlink" title="音乐"></a>音乐</h4></li>
<li>最喜欢的音乐:将故事写成我们。原来是别人的故事。这首歌太适合在婚礼上用了。</li>
<li>单曲循环最多的音乐:Merry Christmas Mr. Lawrence - FYI。有段时间,一直在听这个。</li>
<li>最励志的音乐:My Shot。汉密尔顿里的一曲。</li>
<li>最感动的音乐:Wonderful Tonight。老友记里钱德勒给莫妮卡订婚的时候用的音乐,也是一首我循环了很久的歌。<h4 id="u6E38_u620F"><a href="#u6E38_u620F" class="headerlink" title="游戏"></a>游戏</h4></li>
<li>玩的最久的游戏:昆特牌。大概是从昆特牌刚回归初心入的坑,大概也就今年7、8月份没怎么玩,其余时间每天都会玩一玩。享受着收集卡牌,组卡组,和人斗智斗勇的过程。新的一年,要再接再厉啊,在职业天梯力争上游。</li>
<li>故事讲的最好的游戏:巫师3。其实玩这款游戏还是蛮能平复心情的,在猎魔人的世界里体会世界的冷暖。没事的时候,也可以打一打上古的昆特牌。游戏里任何一个转瞬转角都会有风景。</li>
<li>组合最多的游戏:Noita。一个非常不错的Rouge-like游戏,随机元素、永久死亡、修改魔杖、各种魔法的组合搭配,让这款游戏超级炫酷。有以撒的结合的感觉,但是应该可以做到更酷炫。</li>
<li>最期待的游戏:Cyberpunk 2077。约莫着还有105天就解锁啦。</li>
<li>最暖心的游戏:Kind Words。有段时间情绪低落,是这款游戏让我熬了过来。<h4 id="u8F6F_u4EF6"><a href="#u8F6F_u4EF6" class="headerlink" title="软件"></a>软件</h4></li>
<li>最聪明的软件:Devonthink 3。虽然这款软件真的好贵,但是那个find also的功能好用的不得了。以前不知道一些不同学科的文献之间还存在着某种联系,用这个软件可以更方便的把所有相关文件都列出来,然后交叉对比。以后会逐步把自己的知识管理系统从zotero转移到Devonthink上来。</li>
<li>最适合零散时间的软件:Reeder 4。买了桌面版和移动版,以后看RSS久非常的方便了。</li>
<li>提高效率最牛逼的软件:Alfred 4。以前用的是盗版,今年入正了。因为发现自己用的频率实在太高了,已然离不开这款软件和macOS的生态系统了。<h4 id="u786C_u4EF6"><a href="#u786C_u4EF6" class="headerlink" title="硬件"></a>硬件</h4></li>
<li>让人安静专心的硬件:AirPods Pro。买了之后,几乎天天上下班还有工作的时候都会带,降噪自然不如头戴的,但是已然很棒了。</li>
<li>用起来最顺滑的硬件:Apple Pencil。买来之后还没用来画画呢,倒是记笔记什么的特别的方便。<h4 id="u65C5_u884C"><a href="#u65C5_u884C" class="headerlink" title="旅行"></a>旅行</h4></li>
<li>二月过年和基友去了泰国,还是挺好玩的。</li>
<li>十二月本来计划去美国,甚至去时代广场跨个年。无奈美国签证又出了点问题,得要推迟行程了。</li>
</ul>
<h3 id="u5DE5_u4F5C"><a href="#u5DE5_u4F5C" class="headerlink" title="工作"></a>工作</h3><p>还在NUS做博后,老板成立了两个研究中心。我在港口那边做些仿真优化的研究,还有APL的集装箱装船优化项目。平时也帮老板师兄师姐打打杂。学校还是清闲,但就是温水煮青蛙,让人欲望变低,有些不开心。最近投了些fund,还是早点出去看看吧,既然MOE的项目已经结束了,自己也无心学术这条路,还是早点入行比较重要。看着同龄人都有了自己的fund,心里还是挺羡慕的。</p>
<h2 id="2020_u5E74_u5C55_u671B"><a href="#2020_u5E74_u5C55_u671B" class="headerlink" title="2020年展望"></a>2020年展望</h2><p>习惯用OmniFocus来计划工作,但是overdue的项目也越来越多。最直接的新年计划可能是把去年的翻出来,然后划掉2019改成2020吧。虽然计划挺好,但是我的执行力却有待提升。新的一年,先从解决自己的一些坏习惯开始吧。比如拖延、晚睡、被动、不经常运动等等,然后找到一份心仪的工作。另外已经拿到新加坡永久居民了,也需要制定下未来的长期规划了。是走是留,还是得早点想清楚。学术工作还是没有完结,也有一些新的研究进来了。但还是离开NUS之前,尽量把文章送审出去吧。CFA Level 2还要再考一下,这次不能马虎大意了,要早点做准备。然后买了个日语学习app的两年会员,打算学一学,今年应该可以安排一下日本的旅行。这个博客更新频率也有点太低了,今年要努力做到更新。2020年应该会有很多挑战和变动,拥抱变化,拥抱生活,也为我的而立之年早日做准备。</p>
总结2019年,展望2020年
Hello 2019
http://blog.greenwicher.com/2019/02/08/hello-2019/
2019-02-08T15:00:00.000Z
2019-02-08T15:03:43.000Z
<p>戊戌年腊月廿七,携基友一人,于暹罗湄南河,乘璀璨珍珠号,品美食,饮佳酿。拾级而上,登甲板。天地之间,浩浩汤汤,忽觉人生之短暂,宇宙之浩瀚。沿河可观大皇宫,卧佛寺,郑王庙,金碧辉煌,奢靡至极。亦有ICONSIAM,RiverCity相伴,不乏LV卡地亚点缀其间。往来之间,千帆竞发,百舸争流。忽闻男女二人曼妙歌声,诉乡情,诉友情,诉爱情。可谓初闻不知曲中意,再闻已是曲中人。愿一曲后来,愿诸君不离不弃,愿莫辜负梦中人。抑或纵使相隔几万里,情若在,成正果;抑或纵使相逢应不识,尘满面,鬓如霜。仿若生死,你在那头,我在这头。</p>
<p>『后来,我总算学会了如何去爱,可惜你早已远去消失在人海;后来,终于在眼泪中明白,有些人一旦错过就不再。那时候的爱情,为什么就能那样简单;而又是为什么,人年少时,一定要让深爱的人受伤。在这相似的深夜里,你是否一样也在静静追悔感伤。如果当时我们能不那么倔强,现在也不那么遗憾。你都如何回忆我,带着笑或是很沉默。这些年来,有没有人能让你不寂寞。永远不会再重来,有一个男孩爱着那个女孩。』</p>
<a id="more"></a>
<audio id="sound" autoplay loop><br><source src="Later.mp3" type="audio/mpeg"><br>Your browser does not support HTML5 audio.<br></audio>
<h2 id="2018_u5E74_u603B_u7ED3"><a href="#2018_u5E74_u603B_u7ED3" class="headerlink" title="2018年总结"></a>2018年总结</h2><p>真是好久没有更新博客了,连本地hexo开启服务器都报错了。从泰国回来之后,整个人都有点懵,查了好久的谷歌,都没有解决报错的问题。但无论如何,肯定是node.js版本问题导致安装的node_modules文件夹有些问题,然后就报错local hexo not found。幸好,机智的从wiki项目下,复制了node_modules文件夹过来,然后问题就解决啦,以后再考虑版本更新的问题吧。</p>
<p>今年的年度总结,来的有些迟。本来想着元旦写,然后一拖就拖到了农历新年。和去年一样,还是用一些瞬间来铭记这一年吧。这些精选的照片只代表了我这365天中的那么几天,尽管大部分时间平淡如水,但过去的回忆就像美酒,时间越长便越浓。愿未来的某一天,让我再饮这一杯酒,一醉方休。</p>
<p><img src="2018_Snapshot.jpg" alt="2018_Snapshot"></p>
<ul>
<li>图1是我在泰拉瑞亚里面搭建房子,真的是太喜欢这款以『挖掘,战斗,探索,建造』为主题的横版像素风游戏了。当时差不多不到一周,就肝了六七十个小时,即使在里面钓鱼,也可以钓个半天。后来发现了无限资源的服务器,拿了好多神装(是的,包括棱镜和彩虹猫之刃),然后就把这游戏给玩坏了,有点索然无味。不过这也开启了我对steam和humble bundle的坑,截至目前,差不多steam有376款游戏了,这还不包括humble bundle上面有些没激活的游戏。然后订阅了两年的humble bundle,感觉自己也是作死,哪有时间玩这么多游戏啊。既然说到游戏,推荐几款今年玩到感觉还不错的。首先是Slay the Spire,一款rogue-like以及card-deck-building游戏,目前推出了战士、刺客和机器人三个角色,250多个卡牌,还有好多遗物可以进行搭配,有很多不同的模式,也开放了mod支持,平衡性也不错。特别喜欢机器人,那种极客感特别强!然后就是泰拉瑞亚了,据说打完肉山之后又成了另外一个游戏,貌似其开放性也是图灵完备的。接下来要推荐的是以撒的结合,这一款应该是非常有名的了,虽然宣传动画有些恐怖甚至恶心,游戏里的场景也是有些低俗,但是各种道具之间的自由组合简直让你玩到嗨,没有做不到只有想不到,各种白嫖赛神仙。然后是欧洲卡车模拟2,推荐这一款的理由是,工作繁忙之后,在游戏里开着卡车,放着乡村音乐,看着窗外的美景,简直不要太放松哦。下一个要推荐的是,神界原罪2,虽然可能是比较过气的角色扮演游戏,但里面的对话精心程度,以及完成任务的自由程度,以及各种元素的搭配程度,让你觉得真是一件艺术品。当然啦,对我这个收集癖而言,也是非常友好的,欢乐堡我也是收集了暴君套装的人哦。接下来是RimWorld,感觉是微缩版的人类模拟器,算是生存+模拟经营类的游戏,各种mod支持也是很牛逼,还有社会与情绪系统。然后再推荐一款解压游戏,Dead Cells,虽然也是rogue-like,但是场景的重复度还是有点严重,而且最bug的是,你收集越多的武器,反而会降低游戏的乐趣和增加难度,但是用手柄玩起来的爽快感,真的是难以置信。 最后再推荐下《巫师之昆特牌》,那个闪卡的精美程度实在是无与伦比,关键还免费,不知道比不到发售一个月进包半价然而我快全卡的刀牌Artifact良心到哪里去。</li>
<li>图2是我在NUS的春招上,看到了DRW的展台。这次春招分两天,上一轮Flow Traders也来了,但是当我到会场的时候,他们就已经撤了,也是醉了,差不多他们提前半天就走了。DRW是家蛮不错的公司,也是什么赚钱什么都做,貌似房地产也有涉及,然后之前在数字货币市场上的表现也很抢眼。当时递交了简历,但是觉得自己还没准备好,而且那个时候恰巧马上有份量化实习,于是想了想还是之后再投。虽然现在差不多一年了,但是觉得自己还是没有怎么好好准备。</li>
<li>图3是受到之前蚂蚁金服的面试官邀请,参加ATEC新加坡大会。面试官也是我当时要去的部门的主管,可惜这次他因为财年的原因,部里有些事情要处理,不能来新加坡。尽管如此,他还是特意嘱咐蚂蚁的HR要好好照顾我。MS前辈人挺好的,我其实打心眼里蛮喜欢蚂蚁这个团队的,当时面试给我的感觉非常好,特别享受那种为技术辩论讨论的感觉,而且他们提供的技术我觉得也非常有正义感。虽然后来由于个人的原因,还是拒绝了这个宝贵的offer,但真心希望有那么一天,有蚂蚁的地方就有蚂蚁金服。我去过的地方不多,但是在拉斯维加斯、曼谷、新加坡、马六甲都看到了支付宝,我自己也申请了一个支付宝的立牌来玩。感谢蚂蚁金服,感谢支付宝,让普惠金融,『无现金』社会,诚信社会成为现实。这次ATEC大会,也见到了部门大老板飚哥,这是我见到的第二个拿了两个博士学位的人,而且他的专业竟然跟我还很类似。另外还见到了蚂蚁的CTO程立大神,恰逢蚂蚁当时收购了巴基斯坦的一家支付机构以及阿里达摩院的成立,还和程大神简单聊了几句。程大神真的一点架子都没有,温润儒雅,真是一代帅才。希望有生之年,我也能拜会马老师一次。</li>
<li>图4是和之前实习公司ADVANCE.AI的同事聚会,当时差不多离开了快半年。有好多新人都不怎么认识,当然也有一些网友过来。哈哈哈,这个网友是因为我司有三个office,新加坡、雅加达还有北京,所以有的时候只是电话或者微信上聊过,但没有线下见过。其实,我也是挺喜欢ADVANCE.AI的。当时Chun搜到了我的个人博客,问我感不感兴趣去他们那边聊聊,然后很神奇的发现他们正在做的一个项目和我本科的毕业设计异曲同工,然后我那时学术的热情有些低,也想感受下业界的氛围。于是就这么去ADVANCE.AI开始了三个月的实习,中间算是做了两个项目。其中一个已经上线了,而且效果还不错,那种成就感还是蛮强的,真的为公司能带来效益,真的为一个健康的商业环境做出贡献。后来17年还去参观了北京的office,见到了久违的TongTong姐,也拿到了return offer。其实我还是挺心动的,因为可以和那个人离的更近一些,同时也能保留新加坡的身份。可是后来还是不了了之了。后来Chun又找我聊过,但是我还是拒绝了,说是想要再gap一年,忙完手里的科研项目,但可能还是放弃了吧。现在ADVANCE.AI发展越来越好了,在成都和上海也开了office,相信印尼市场因为先发优势也应该足够强了吧。祝亲爱的们,看到敲钟那一刻,早日实现财务自由哈。</li>
<li>图5是在Martian Capital实习的时候做的东西。想想自己也是好幸运,遇到了一个好老板。真的非常谢谢JH,有一次凌晨和他电话聊了差不多一个多小时,也不知道有没有耽误他的交易。但那次沟通,确实也让我去思考很多东西,我究竟想要什么,我应该怎么样去做。JH原本是物理系的博士,后来觉得那样的未来不是自己想要的。于是主动quit,去读了MFE。然后毕业那几年,大宗商品的行情比较好,他也顺理成章的去了一家贸易公司,最终做到了主管,实现了财务自由,然后开了自己的资本管理公司。说来惭愧,这次实习我可能实际并没有做出太好的东西,虽然回测了一些策略,三年样本外的夏普还算行,但是最近一年表现比较差,而且这个夏普和JH自己的比根本不值一提,我也比较担心过拟合的问题,生怕这个PnL只是昙花一现。不过好歹搭了一个框架出来,可以基于此再来设计研究其他因子,然后来开发信号回测策略。CZ加油啊,期待你的新策略~</li>
<li>图6是去参加CFA Level 1的考试,真的是被这阵仗吓坏了。比FRM的参加人数不知道多了几倍,两个超级大的仓库基本坐满了人,后悔当时没有带厚衣服,真的是有点被冷气给吹感冒了。中午和羡哥一起吃饭,还被秀了把恩爱。还好后来低空过了一级,不过羡哥二级给挂了,貌似CFA的监考特别严。当时他提前打开卷子,考场上受到了提醒,然后后来才知道分数给作废了。再过四个月,又要去那个鬼地方了。希望一切顺利鸭,这次得好好学习了,毕竟时间和金钱成本都不算低。</li>
<li>图7是我现在住的地方,在Utown同一间宿舍住了四年,临走的时候还是挺不舍的。但是自从搬过来之后,反而喜欢了新的这个地方,虽然离工作的地方有些远。但能尽量融入本地人的生活,而且附近还有超大的游泳池,超大的食阁,24小时全开的Giant,离全岛各个常去的地方也超级近。附近还有好几个超级漂亮的公寓,希望有朝一日自己能有一间吧。</li>
<li>图8是我家里的工作环境,比办公室的是要高级了不少。两台27寸的显示器,1台Dell的4k,1台LG的1080p。真的是用retina屏久了之后,适应不了低分辨率的屏幕了。于是花了大价钱买了这台Dell,虽然还是能感觉到和retina的差距,毕竟27寸苹果标配都是直接上了5K的,但是还是穷啊,而且那台的支架感觉不如Dell的用起来方便。然后也买了一台配了1080ti的主机,本来想着玩一玩深度学习,结果事与愿违了,[无奈脸]。朋友也送了我一台机械键盘,炫彩超级酷,不过不是图上这一把了。还买了一台树莓派,本来打算在上面部署一个简易的交易系统做模拟盘,然而还在吃灰中。</li>
<li>图9是和Citadel的小姐姐的合照。当时学校发来Citadel的宣讲会通知,本来觉得自己没准备好,也没想好要不要去。但是后来想想还是先去了解一下吧,幸运的过了简历关,进入了第一轮面试。然后宣讲会的时候,还答对了一道题,拿到了Citadel的保温杯。最巧的是,在我谷歌面试官背景的时候,竟然发现其中一个面试官是曾经改变我人生轨迹的人。Daisy姐,noLove项目的开发者,我曾经fork这个项目到love.greenwicher.com。有点惭愧,当时只是改了一些文字内容,改了背景音乐,并没有做太多其他改动。但是很幸运的被我的前女友看到,然后把她感动哭了。虽然这个网页已经不在了,但是那时还是觉得冥冥之中有股力量让我得以见到Daisy姐,去当面感谢她。中午的时候,还在期求着下午能被她面试。然后真的是她作为我的面试官,只能怪自己一点都没有准备,感觉Daisy姐问得问题都很基础。其中一道算法题,差不多一年前CM同学还问过我,但是一年后我的回答和当时几乎一样,只是知道可以用heap来解决,但是具体怎么做我当时也没有细想,错过了一个机会,也是自己太不自信了。后来发现这道算法题,有更快的解决算法,而且是以好几个大牛的名字一起冠名的,简直太有意思了。回到正题,面试结束的时候,跟Daisy姐说了noLove项目的事情。然后幸运的征得她的同意,和她还有一直联系我的HR一起合了照。希望,有朝一日,我可以去Citadel,和Daisy姐共事。</li>
<li>图10是去WorldQuant签合同时留的照片。其实差不多一年前的时候,就已经有资格成为Research Consultant了。但是苦于当时新加坡office受到MAS的监管,还不能招人。借助去年的IQC,新加坡的office也开始招兼职的Research Consultant。我在Websim平台上也回测了很多策略(或者说因子),有些异常的不错,而且还很稳定。自从WQ推出fast expression,可以回测历史10年的数据之后,提交新的因子变得比以前有些困难了,但是那种成就感却反而更强了。而且,随着成为Research Consultant,可以接触到更多新的数据,更多的思路。WQ也提供了一些培训课程,新加坡的team也很支持。不过还是希望自己能有更体系化的方式来开发与优化因子吧,之前很多策略都是靠直觉和拍脑袋做出来的,不是太可持续。</li>
<li>图11是我的博士论文答辩。其实吧,对自己的学术不是太有信心,因为花的功夫不是太多,觉得自己的贡献其实真的微乎其微,还有很多有意思的想法没有做。差不多我的论文内容都是博士前两年半就已经做好的了,最后一年又忙于各种实习。本来想着再完结另外一个工作,但是后来发现时间不是特别多,主要还是太拖延了。还是得要谢谢叶老师和Prof. Ng能放我一马。然后自己也特别幸运,从递交论文,到收到修改意见,然后答辩,最终到拿到学位授予函,只花了差不多三个月的时间,简直神速。当时之所以来NUS读博的目标,可能只完成了其中一半,最重要的那一半想了想还是在原地踏步。</li>
<li>图12是受YC兄邀请,去参加高岛屋20周年庆,在新加坡唯一的米其林二星中餐厅用餐。这次体验还蛮不错的。这次的菜都是由四川饭店的三代掌门人亲自做的,每上一道菜,厨师都会非常热情的介绍这道菜的由来和大致做法。想一想,厨师这个职业可能苦了些,但用心选食材,用心烹饪还是蛮有趣的。配图是陈氏父子现场演示陈家两种风味的麻婆豆腐的制作工艺,真的是特别香,而且特别下饭,以后我也要用麻婆豆腐作为我的招牌菜!</li>
<li>图13是和昊哥在西安古城墙上骑自行车。这个城墙真的是比南京城墙大了好多,主要可能是保存比较完好。而且城墙里还只是古长安的内城,可想当时的长安是多么的繁华。想起了白居易的一首诗,『百千家似围棋局,十二街如种菜畦。遥认微微入朝火,一条星宿五门西。』真的是在南方待久了,实在对西安的美食不可恭维,又油又咸,也就只有肉夹馍符合我的口味了。可惜这次没有去华清池看表演,没有看烽火台和捉蒋亭。不过看到了江哥和TF兄,真的是好久没见到他们了。江哥估计得要有6年了,TF兄差不多也四五年了,还是蛮羡慕他们在国内的生活的,另外国内的支付宝真的是好用的很啊。</li>
<li>图14是去芭提雅玩真枪实弹。芭提雅这个地方真的是有点说不上来,感觉泰国人民真的是生活在水深火热之中,大部分地方都感觉很落后。而且穷乡僻壤出刁民,双条车和突突车都各种宰人,真的是不想做生意么还是把外地游客当傻子,明显打车都来的更便宜些。不过打枪还是挺好玩的,图上的这把步枪配了.22毫米的子弹,一点后坐力都没有,打的很准,声音也不大。整体而言,舒服!还看了蒂芙尼人妖秀和三合一秀,三合一有点太低俗了,但是蒂芙尼秀真的特别棒,无论灯光舞美,就是人妖们都是假唱有点别扭(当然,必须得是假唱,要不然就尴尬了)。还被老司机带去了Go Go Bar,听到了陪酒女郎的悲惨故事,给了她300泰铢小费,希望她未来或者下辈子能好好过吧。另外Terminal 21这个商场真的是设计不错,比新加坡的要有意思多了,芒果糯米饭也是好吃要哭了。</li>
<li>图15是在曼谷的卧佛寺。曼谷待的时间比较短,感觉可能也不是特别好玩。就是湄南河上的夜景还蛮不错的,特别喜欢SIAM的发音,还是暹罗好听一些啊,为什么要叫泰国。在考山路找了好久的大象玩偶,找不到和之前一模一样的了。最后,在机场买了一只小白象和Tosakan的T恤。啥时候,在四面佛下许的愿成真了,再去一趟泰国还愿以及玩玩玩吧!</li>
</ul>
<p>去年大概就这个样子吧,找工作进度有点慢了,然后过的也是越来越自闭了,以后要开朗鸭!</p>
<h2 id="2019_u5E74_u5C55_u671B"><a href="#2019_u5E74_u5C55_u671B" class="headerlink" title="2019年展望"></a>2019年展望</h2><p>今年买了果壳的物种日历,一共52张精美的动植物插图。新加坡这个地方,可以说没有四季,穿着同样的衣服,每天固定的通勤路线,实在有些单调了。所以感到时间特别容易从指缝里溜走,真的是直到觉得身体差了,才感叹到,『啊,原来我也老了,原来未来是属于他们的』。</p>
<p>今年希望能早点完结掉之前的科研工作,然后为之后找工作尽快做准备,不能在学校里继续温水煮青蛙了。看了很多鸡汤书,希望能更好的认识自己,以及更多的为未来去思考。短期的话,希望六月份的CFA Level 2顺利,以及早日拿到新加坡的永久居民,有时间的话想学一学简单的日语然后去日本旅行。</p>
<p>人去雁沓,舞停歌歇,该亏欠的都将偿还,该放下的也不再留恋。时间很长,相遇才不过一瞬,勿惦勿念。抑或伤抑或折翅抑或死,都无关你,你不用内疚无需难过,只要你的记忆有我一点的印记,我会欣慰,默默祝福,希望你的他一回眼就感受到你的深情,你为他焦簇的眉,你们一定会幸福相拥。再见,在也不见。</p>
总结2018年,展望2019年
Hello 2018
http://blog.greenwicher.com/2018/01/01/hello-2018/
2018-01-01T04:57:38.000Z
2018-01-01T07:47:17.000Z
<p>2017年阳历的最后一天,大雨一直浸蚀着整个新加坡,带走了这一年的点点滴滴。无论是开心的,亦或是悲伤的,都随着这涓涓细流消失在四面八方。一大早我便去了实验室,希望新的一年也能像今天这样,工作努力,懂得知足。实验室里的人,零零散散。来了一个,又走了一个。每个人都在自己的人生节点里做出种种选择,或大或小。就这几天,我们这些90后们还分分晒自己18岁的照片。因为到了2018年,00后们也都渐渐的成年了。时代的洪流冲刷着我们每个人的命运,冲散了我们曾经以为的海誓山盟。既要不忘初心,也要拥抱变化。</p>
<p>2018年阳历的第一天,雨停了,虽然天仍旧是灰蒙蒙的。除了四周春意盎然的花草树木,但这一丝丝凉意也竟让我想起了故乡的秋天。一层秋雨一阵凉,一瓣落花一脉香。一样流年自难忘,一把闲愁无处藏。2018年,对我而言有太多变数,也有太多的人生选择。相信多少年过后再回首,一定会铭记这一年所做出的努力与决定。虽然现在的我依旧迷茫,但毕竟路都是人走出来的。我也要迈着坚实的步伐,度过一个个难关,向着美好走去!</p>
<a id="more"></a>
<h2 id="2017_u5E74_u603B_u7ED3"><a href="#2017_u5E74_u603B_u7ED3" class="headerlink" title="2017年总结"></a>2017年总结</h2><p><img src="2017_Snapshot.jpg" alt="2017_Snapshot"></p>
<p>一月的新春音乐会『犹在耳边』</p>
<p>二月的埃舍尔画展『历历在目』</p>
<p>三月的FooBar比赛『依旧让我兴奋不已』</p>
<p>四月的植物园生姜花『绽放娇艳』</p>
<p>五月的比赛『尤其的多』</p>
<p>六月的实习『起了个头』</p>
<p>七月的沈老师『依旧那么帅』</p>
<p>八月的文章『终于见刊』</p>
<p>九月的那一天『值得铭记』</p>
<p>十月的南大聚餐『人丁兴旺』</p>
<p>十一月的红牛与FRM考试『苦不堪言』</p>
<p>十二月的美国与北京之行『收获颇丰』</p>
<p>2017年,可能我过的并不开心。焦虑、抑郁、甚至越来越不自信、越来越迷茫都是我日常生活的表现。可能我这个年纪并不像别人所说的一无所有吧,需要做的决定慢慢多了起来,而自己从幼稚到成熟的转变也需要一定的时间。更多的时候,没有真正认清自己想要做的事情,自己所珍视的价值。所谓时间管理其实是优先级管理,没时间只是说明不在乎。去年的计划完成也是妥妥的被打脸,自从实习之后,就变得有些懈怠了(或者说有了懈怠的理由了)。简单的总结下自己做计划或者目标管理的一些心得吧,</p>
<ul>
<li>制定计划<ul>
<li>计划分长短,短期的好做,长期的难把握。</li>
<li>长期计划应该避免量化,而要作为一个行动的方向或者目标或者愿景。这方面可以参考OKR原则。在长期计划或者目标的基础下,设置几个关键成果作为中短期的计划予以执行并实现。</li>
<li>短期计划应该尽量量化,最终需要拆分,并且落到行动上可以按天为单位。计划最小可以按周为单位,行动最大可以按天为单位(项目除外)。</li>
<li>关键结果的量化可以分多个档次,比如合格、优秀、卓越。</li>
</ul>
</li>
<li>实施计划<ul>
<li>要有专门的工作时间块和个人时间块,除非任务未完成,尽量不要各自干扰。</li>
<li>今日事,今日毕。所以合理安排今日事很重要,要留有缓冲。</li>
<li>多个独立的中长期计划尽量不要并行完成,容易分散精力。还是各个击破比较好一点,步步为营,稳扎稳打。</li>
<li>万事开头难,先从容易的慢慢来,熟悉之后逐渐增加难度。</li>
<li>认识到优先级。</li>
</ul>
</li>
<li>结果反馈<ul>
<li>对于不熟悉的任务,要通过逐步反馈,来调整一开始的计划。</li>
<li>解决实施计划中的绊脚石。</li>
<li>计划并不是一成不变的,需要根据情况来调整。所以在制定计划的时候,就应该考虑到未来的多变性。</li>
<li>进度落后的时候不能气馁,反而更应该一鼓作气,避免焦虑的最后办法就是解决问题。</li>
<li>和时间做朋友。</li>
</ul>
</li>
</ul>
<h2 id="2018_u5E74_u5C55_u671B"><a href="#2018_u5E74_u5C55_u671B" class="headerlink" title="2018年展望"></a>2018年展望</h2><p>今年不会像去年那样把计划公开出来,大的目标和去年并没有太多的变化,唯一的差别可能是今年希望能顺利毕业,拿到心仪的工作。更重要的是中短期计划的制定和实行,会按照OKR原则来进行安排。从周计划的制定、实施与反馈,逐渐的适应更长期计划的安排,甚至未来5年、10年的人生轨迹。希望慢慢的,大目标的轮廓也会越来越丰满起来。也祝各位好友2018年顺风顺水,能实现自己的小目标!</p>
总结2017年,展望2018年
QuantCon@SG,你想知道的所有细节都在这里了
http://blog.greenwicher.com/2017/10/06/2017-QuantCon-SG/
2017-10-06T13:35:00.000Z
2017-10-06T13:35:20.000Z
<p>本科的时候就听说XJC师兄想要从零开始搭建一套量化交易系统,当时也是特别佩服。虽然周围金工的同学或多或少也在用SAS然后连接Wind来开发与回测投资策略,少部分同学也试着实盘去操作,但真正从一砖一瓦去搭建整个量化交易系统就是另一回事了。 后来大概在我大四的时候,<a href="http://www.yucezhe.com/" target="_blank" rel="external">预测者网</a>诞生了。一开始其核心在于抓取大V以及分析师们的预测观点并进行评级,之后逐步开始卖量化投资策略和高频数据。 之所以以这个引子开头,是为了契合Quantopian这次的量化投资大会。一来,随着2016年国内各大量化策略平台(RiceQuant, Uqer, JoinQuant, 果仁网)雨后春笋般的出现,人人皆为宽客的时代已然来临,预测者网虽然没有很快的转型,但也是这波浪潮的冲锋号。二来,alternative data近来也比较火,正如有着GIC九年工作经验的keynote主讲人Yi Li大神提到用分析师数据来预测宏观市场状态,预测者网也有试图整合所有分析师的预测观点来最大化集体智慧。三来,机器学习/人工智能也算是在各个行业都大放异彩,这次<a href="quantconsingapore2017.splashthat.com">QuantCon</a>有很多演讲都和机器学习、增强学习有关。另外,文末有福利放送哦~</p>
<a id="more"></a>
<h2 id="QuantCon@SG"><a href="#QuantCon@SG" class="headerlink" title="QuantCon@SG"></a>QuantCon@SG</h2><p><img src="QuantCon@SG.JPG" alt="QuantCon@SG"></p>
<p>最早接触QuantCon是在2015年,当时Dr. Anthony NG在和Quantopian一起打算在新加坡筹办一次短期的workshp(<a href="http://twiecki.github.io/bayesian_risk_perf_v3.slides.html#/" target="_blank" rel="external">Probabilistic Programming in Quantitative Finance</a>)。但是觉得离学校太远,就懒得没去。再后来,和BL兄一起参加了WorldQuant的全球量化投资交易比赛(特别巧的是这次会议还碰到了新加坡WorldQuant的CEO,没想到他还记得我)。当时BL兄提到了16年首届新加坡QuantCon,觉得还不错。于是今年我就报了名,打算了解下业界目前的热点,顺便认识认识各种大神。</p>
<p>今年的会议分成了三个部分,先是28号的三场workshop(顺便推荐下<a href="https://www.quantopian.com/lectures" target="_blank" rel="external">Quantopian的Lecture</a>,感觉比国内类似平台做的详细些),然后29号的正式会议,最后30号有个Hackathon。正式会议的议程安排还是蛮紧张的,总共两个主旨演讲,还有20个报告(具体细节请看最后一部分),覆盖了Quant职业生涯建议、机器学习、另类数据、投资组合优化、投资模型以及金融市场。总的来说,考虑到今年只是第二届,参会体验已经很不错了。另外QuantCon也有在纽约举办,YouTube上有2015、2016年的会议视频。</p>
<p>虽然是在新加坡的会议,但无论是报告人还是参与者,很多都是从海外专门打飞的过来。甚至碰到了和我同岁目前在北京做Quant的JCM同学,刚来新加坡不到一周的韩国大哥Harold,之前在读书会遇到的师弟SZH,以及专门从外蒙古飞过来的今年纽约Hackathon的冠军。正如一位报告人所讲,这么多人从五湖四海同聚一堂,短时间高密度的交流,确实是难得的机会。更何况量化投资本身就像武林秘籍一样,各家『流派』能够互相交流学习,更新信息,实属不易。虽然参会那一段时间睡眠不足,导致开会那天整个人昏昏沉沉的,感觉没有特别深刻的收获,但还是总结一二,以期日后有新的领悟。</p>
<h2 id="u89C1_u95FB"><a href="#u89C1_u95FB" class="headerlink" title="见闻"></a>见闻</h2><h3 id="u5BFB_u627E_u963F_u5C14_u6CD5"><a href="#u5BFB_u627E_u963F_u5C14_u6CD5" class="headerlink" title="寻找阿尔法"></a>寻找阿尔法</h3><blockquote>
<p>投资者把钱交给基金经理的唯一原因,是经理可以给予投资者比市场更好的回报。而这个更好的回报,我们就把它称之为超额回报,简称阿尔法。</p>
</blockquote>
<p>Fama三因子模型提出股价会受到市场系统风险、市净率以及公司规模的影响,从此越来越多的因子模型被提出来来解释股价。据说WorldQuant内部就有很大的因子库,覆盖了流动性、动量、质量、市值、价值、波动性、成长性以及宏观状态各个方面。所以当大部分因子都为人所知的时候,下一步该怎么做?最直接的思路便是提出新的因子,而产生新因子的最直接办法就是用别人从来都没用过的数据(alternative data)。比如像下图,实际可以收集以及利用的数据有很多。</p>
<p><img src="alternative-data.gif" alt="alternative-data"></p>
<p>这次会议也有人问GIC目前为什么要用卫星数据,一个简单的场景就是通过卫星地图来探查某一个地方的石油产量或者矿产产量。通过分析拍照时太阳的位置,存储罐内外阴影大小及其地理位置来计算石油储存量。也可以分析港口物流的繁忙程度来提前预测宏观经济景气程度。</p>
<p><img src="Planet-Labs-Mailiao-Refinery.png" alt="Planet-Labs-Mailiao-Refinery"></p>
<p>其实这个思路并不新,像谷歌很早就用搜索数据来预测流行病的爆发。但难点在于另类数据的获取,以及从中提取有用的因子出来。其中一位演讲者Emmett Kilduff创办了另类数据提供商公司Eagle Alpha,在其网站上有详细的<a href="https://s3-eu-west-1.amazonaws.com/ea-paperclip-production/attachments/files/000/001/652/original/Alternative_Data_Report_-_Version_2.pdf?1506338903" target="_blank" rel="external">白皮书</a>。其实从本质上讲,投资就是利用信息不对称来获取收益,无论这种信息是靠才智或者内幕或者金钱获得的。但由此带来的问题是,如果alternative data变得普遍,容易获得了,实际也就没什么意义了。因此,另类数据提供商其实面临一个很艰难的抉择,如果定价高,那么客户少,但至少因子被少部分人使用,因而保持有效;但如果定价低,那么客户多,导致alternative data不那么另类,那么产品也就没什么价值了。所以这些另类数据提供商似乎得要像石油输出国组织一样,控制另类数据的释放,以保证其有效性。</p>
<h3 id="u673A_u5668_u5B66_u4E60"><a href="#u673A_u5668_u5B66_u4E60" class="headerlink" title="机器学习"></a>机器学习</h3><p>很多报告也提到了机器学习在量化投资中的应用,包括如何用深度增强学习来优化下单、实时投资情绪分析、策略参数优化、基于供应链网络扩散模型来预测上下游收益影响。主旨演讲Yi Li大神也是一位kaggler,这次的报告主要是讲用ensemble approach来预测宏观经济状态,并且减少高频和低频数据之间的鸿沟。虽然听部分朋友说目前机器学习在业界还处于研究阶段,甚至有些基金经理吐槽机器学习完全没用,但至少正如一位CIO所说,机器学习在量化投资界俨然是一种趋势。虽然个人觉得金融市场过于复杂,信噪比过低,而且一直在变化;但总归参与者要么是人,要么是机器,一定是有规律可寻的,只不过可能要从另一个层次或者角度上去看问题。下图中Dr. Anthony NG总结了各类机器学习方法适用的投资决策问题(或者反过来说),也可以关注下他的<a href="http://www.algo-hunter.com" target="_blank" rel="external">个人博客</a>。</p>
<p><img src="ml1.png" alt="1"></p>
<p><img src="ml2.png" alt="2"></p>
<p><img src="ml3.png" alt="3"></p>
<h3 id="u6295_u8D44_u7EC4_u5408_u4F18_u5316"><a href="#u6295_u8D44_u7EC4_u5408_u4F18_u5316" class="headerlink" title="投资组合优化"></a>投资组合优化</h3><p>听JCM同学说国内目前做投资组合优化的还比较少,可能会是一个好的方向,这次会议也有四个相关的报告。基本含义是马科维茨的均值方差模型虽然漂亮,但均值方差很难准确估计,其次高阶矩的信息有所损失。由此带来的方案是,如何构建更鲁棒的投资组合,如何利用整个分布信息来优化投资组合(Dr. Li Haksun基于此改进了夏普比率)。值得一提的是,Quantopian目前也提供了Optimization的API。</p>
<h3 id="u4EBA_u4EBA_u7686_u4E3A_u5BBD_u5BA2"><a href="#u4EBA_u4EBA_u7686_u4E3A_u5BBD_u5BA2" class="headerlink" title="人人皆为宽客"></a>人人皆为宽客</h3><p><img src="open-source-quantitative-trading.png" alt="open-source-quantitative-trading"></p>
<p>这个其实也没什么好说的。现在国内各种量化交易平台,提供了数据、回测、研发、实盘交易一条龙服务。整个量化投资的门槛低了好多,只要会写python,很容易能设计一些[有效利用噪声的]策略。而且像vn.py, tushare, rqalpha, zipline这些开源工具,也极大方便了Quant们的二次开发。这里不得不吐槽,Quantopian的回测速度实在是太慢了(也有可能是调用了optimization api,并且第一次用Quantopian的平台,有很多东西还不太熟悉)。其实感觉这次WorldQuant的CEO来听报告,一个很重要的因素是这些平台和他们本身的websim平台有些重叠。</p>
<h2 id="u9898_u5916_u8BDD"><a href="#u9898_u5916_u8BDD" class="headerlink" title="题外话"></a>题外话</h2><h3 id="u4E2D_u56FD_u5E02_u573A_u7684_u673A_u4F1A"><a href="#u4E2D_u56FD_u5E02_u573A_u7684_u673A_u4F1A" class="headerlink" title="中国市场的机会"></a>中国市场的机会</h3><p>先放陈晓优大神的观点,在中国市场做量化交易未来很光明。虽然很多人觉得国内是政策市,而且监管严重,可交易品种不多。但与其忽视中国市场,不如去想如何利用这些特点来设计策略,当时陈总提到了幻方的一个策略,但现在有些记不大清了。另外,国内市场股票(3300只)、ETF(160只)、期权(1个股指、2个商品)、期货(43个商品、3个股指、2个债券)应有尽有,而且也可以做空。最关键的是,机构投资者相对较少,市场有效性还可以进一步提高。据说Citadel在中国曾经一个月的利润占了整个公司年利润的1/3,而且越来越多的HF也要进驻中国市场了。</p>
<p><img src="opportunity_china_market.png" alt="opportunity_china_market"></p>
<h3 id="u673A_u5668_u5B66_u4E60_uFF0C_u7136_u540E_u5462_uFF1F"><a href="#u673A_u5668_u5B66_u4E60_uFF0C_u7136_u540E_u5462_uFF1F" class="headerlink" title="机器学习,然后呢?"></a>机器学习,然后呢?</h3><p><img src="analytic-value-escalator.png" alt="analytic-value-escalator"></p>
<p>其实说白了,机器学习就是为了让我们更好的认识这个世界,而从数据中生成的模型。好的模型能够解释过去以及预测未来,但更进一步模型作为客观世界的替代,需要能够更好的优化我们的决策或者行为。这样的模型可以是基于数据提取(机器学习、统计模型),也可以基于假设进行仿真(系统动力学、离散事件仿真、multi-agent),但最终的落脚点都是在于优化我们的决策。这也是为什么我觉得深度增强学习(其实还应该把仿真加进去,无论是产生已有或者未知的数据)未来一定会有更广泛的应用。</p>
<h3 id="u7ADE_u4E89_u4F18_u52BF"><a href="#u7ADE_u4E89_u4F18_u52BF" class="headerlink" title="竞争优势"></a>竞争优势</h3><p>想要在量化投资界存活,其实很简单。要么比别人聪明,要么比别人快,要么比别人敢作弊(并且不被发现)。后来听朋友说,这是大空头里面的话,感觉还要再看一遍回忆下。。总而言之,随大流就只能成为大流了。</p>
<h3 id="u5B58_u5728_u662F_u5426_u5B58_u5728"><a href="#u5B58_u5728_u662F_u5426_u5B58_u5728" class="headerlink" title="存在是否存在"></a>存在是否存在</h3><blockquote>
<p>这正如地上的路;其实地上本没有路,走的人多了,也便成了路。</p>
</blockquote>
<p>其实存在也分客观和主观。我感觉一个策略如果赚钱或者说有价值,要么是先于别人发现了客观存在的真理(比如某种规律、制度上的漏洞或者套利),要么是引导了主观的存在(比如各种虚拟货币、对敲、巴菲特这种大V)。但身在金融市场中,投资者受到金融市场这个存在的影响,同时其观测以及操作认为的存在会进一步导致金融市场的存在,这也就是索罗斯所说的反身性。</p>
<h2 id="u798F_u5229"><a href="#u798F_u5229" class="headerlink" title="福利"></a>福利</h2><p>以下是这次会议各个报告的slides,部分还是蛮有价值和启发的。</p>
<ul>
<li>Building a Career in Quant Finance<ul>
<li><a href="http://quantopian.us5.list-manage1.com/track/click?u=4c1d0cf4959586b47ef210e9c&id=a911950f93&e=3e97cada6b" target="_blank" rel="external"><strong>“Quant Trading for a Living – Lessons from a Life in the Trenches”</strong> </a> by Andreas F. Clenow, Chief Investment Officer for ACIES Asset Management</li>
<li><a href="http://quantopian.us5.list-manage1.com/track/click?u=4c1d0cf4959586b47ef210e9c&id=9d3cb58738&e=3e97cada6b" target="_blank" rel="external"><strong>“How to Run a Quantitative Trading Business in China with Python”</strong></a> by Xiaoyou Chen, Head of Option Trading at Shanghai Junzhi Asset Management Ltd.</li>
</ul>
</li>
<li>Machine Learning<ul>
<li><a href="http://quantopian.us5.list-manage1.com/track/click?u=4c1d0cf4959586b47ef210e9c&id=73bcfb333d&e=3e97cada6b" target="_blank" rel="external"><strong>“Applied Reinforcement Learning in Trading Algorithms”</strong></a> by Pierre Maarek, Vice President, Linear Quantitative Research at J.P. Morgan</li>
<li><a href="http://quantopian.us5.list-manage.com/track/click?u=4c1d0cf4959586b47ef210e9c&id=7d97acc9aa&e=3e97cada6b" target="_blank" rel="external"><strong>“A Machine Learning Odyssey”</strong></a> by Anthony Ng, Senior Lecturer</li>
<li><a href="http://quantopian.us5.list-manage.com/track/click?u=4c1d0cf4959586b47ef210e9c&id=47dba09348&e=3e97cada6b" target="_blank" rel="external"><strong>“Real-Time Machine Learning Architecture and Sentiment Analysis Applied to Finance”</strong></a> by Dr. Juan Cheng, Data Scientist at InfoTrie</li>
<li><a href="http://quantopian.us5.list-manage.com/track/click?u=4c1d0cf4959586b47ef210e9c&id=0fbd10d2e1&e=3e97cada6b" target="_blank" rel="external"><strong>“Deep Reinforcement Learning for Optimal Order Placement in a Limit Order Book”</strong></a> by Ilija Ilievski, Ph.D. Candidate, NUS</li>
<li><a href="http://quantopian.us5.list-manage.com/track/click?u=4c1d0cf4959586b47ef210e9c&id=4767f4edfb&e=3e97cada6b" target="_blank" rel="external"><strong>“Demonstration of Machine-Learning Based Strategy Parameter Selection in Python”</strong></a> by Dr. Thomas Starke, Quantitative Trader at Vivienne Court</li>
</ul>
</li>
<li>Alternative Data<ul>
<li><a href="http://quantopian.us5.list-manage.com/track/click?u=4c1d0cf4959586b47ef210e9c&id=cec5f742bb&e=3e97cada6b" target="_blank" rel="external"><strong>“Three-Dimensional Time: Working with Alternative Data”</strong></a> by Kathryn Glowinski, Engineer at Quantopian</li>
<li><a href="http://quantopian.us5.list-manage1.com/track/click?u=4c1d0cf4959586b47ef210e9c&id=2dc45119a5&e=3e97cada6b" target="_blank" rel="external"><strong>“Alpha from Alternative Data”</strong></a> by Emmett Kilduff, Founder and CEO of Eagle Alpha</li>
</ul>
</li>
<li>Portfolio Optimization<ul>
<li><a href="http://quantopian.us5.list-manage1.com/track/click?u=4c1d0cf4959586b47ef210e9c&id=522d2fbe77&e=3e97cada6b" target="_blank" rel="external"><strong>“Beyond Markowitz Portfolio Optimization”</strong></a> by Haksun Li, Founder and CEO of NM LTD.</li>
<li><a href="http://quantopian.us5.list-manage1.com/track/click?u=4c1d0cf4959586b47ef210e9c&id=c5c1e82dc8&e=3e97cada6b" target="_blank" rel="external"><strong>“Seeking Alpha Through Asset Rotation: An Alternative Way of Applying Modern Portfolio Theory”</strong></a> by Danielle Jiang, Founder and CEO of Hedga Technology</li>
<li><a href="http://quantopian.us5.list-manage1.com/track/click?u=4c1d0cf4959586b47ef210e9c&id=71cef8ed7e&e=3e97cada6b" target="_blank" rel="external"><strong>“Portfolio Optimization When You Don’t Know the Future (Or The Past)”</strong></a> by Rob Carver, Independent Systematic Futures Trader, Writer, and Research Consultant</li>
<li><a href="http://quantopian.us5.list-manage.com/track/click?u=4c1d0cf4959586b47ef210e9c&id=a044668c5d&e=3e97cada6b" target="_blank" rel="external"><strong>“From Alpha Discovery to Portfolio Construction: Pitfalls and Solutions”</strong></a> by Dr. Oleg Ruban, Executive Director And Head of Analytics Applied Research for Asia Pacific At MSCI</li>
</ul>
</li>
<li>Models, Forecasts, and Factors<ul>
<li><a href="http://quantopian.us5.list-manage2.com/track/click?u=4c1d0cf4959586b47ef210e9c&id=655c3cc026&e=3e97cada6b" target="_blank" rel="external"><strong>“Supply Chain Earnings Diffusion”</strong></a> by Josh Holcroft, Head of Quantitative Research, Asia at UBS Investment Bank</li>
<li><a href="http://quantopian.us5.list-manage.com/track/click?u=4c1d0cf4959586b47ef210e9c&id=aceb53ac41&e=3e97cada6b" target="_blank" rel="external"><strong>“Behavioral Factors and Their Performance in Emerging Markets: An Illustration Using China A-Shares Data”</strong></a> by Dr. Jason Hsu, Founder and CIO of Rayliant Global Advisors</li>
<li><a href="http://quantopian.us5.list-manage.com/track/click?u=4c1d0cf4959586b47ef210e9c&id=28291820fa&e=3e97cada6b" target="_blank" rel="external"><strong>“Fundamental Forecasts: Methods and Timing”</strong></a> by Vinesh Jha, CEO, ExtractAlpha</li>
<li><a href="http://quantopian.us5.list-manage.com/track/click?u=4c1d0cf4959586b47ef210e9c&id=6c951f8eeb&e=3e97cada6b" target="_blank" rel="external"><strong>“How Much Do You Pay for the Price Impact of Your Trade?”</strong></a> by Dr Christopher Ting, Associate Professor of Quantitative Finance Practice at SMU</li>
<li><a href="http://quantopian.us5.list-manage1.com/track/click?u=4c1d0cf4959586b47ef210e9c&id=ddc5bdb635&e=3e97cada6b" target="_blank" rel="external"><strong>“Maximize Alpha with Systematic Factor Testing”</strong></a> by Cheng Peng, Software Engineer at Betterment</li>
</ul>
</li>
<li>Markets<ul>
<li><a href="http://quantopian.us5.list-manage1.com/track/click?u=4c1d0cf4959586b47ef210e9c&id=3cde64cdb1&e=3e97cada6b" target="_blank" rel="external"><strong>“Market Insights Through the Lens of a Risk Model”</strong></a> by Olivier d’Assier, Head of Applied Research, APAC for Axioma</li>
<li><strong>“Order & Randomness in Asian Market Microstructure”</strong> by Kerr Hatrick, Executive Director of the Electronic Trading Strategist Group at Morgan Stanley</li>
</ul>
</li>
</ul>
Quantopian2017年新加坡会议总结
Codeforces科学刷题指南,一图一表便够了
http://blog.greenwicher.com/2017/01/03/codeforces-problemset/
2017-01-03T00:00:00.000Z
2017-01-03T10:06:15.000Z
<p>
无论做什么事,多尝试、找套路、然后刻意练习都是至关重要的。对信息科学竞赛(Olympiad in Informatics)爱好者来说,找套路的关键就是多刷题。然而题海茫茫,单以Codeforces来说,截止2017年1月3日,总共有3206道题。换言之,如果一个人足够勤奋,能够一天刷三道题,那也得快三年才能把题目刷完,而且题目数量还在扩充。所以盲目的刷题简直是浪费生命,本人从16年上半年一直按照题目解决人数从高到低排序,不断的刷水题。显然易见,刷水题的后果就是没有长进,熟悉的还是熟悉,不懂的还是不懂,唯一让自己开心的就是刷题数量的累积。所以科学刷题的本质在于不断挑战新高度,在一个平台练习足够久足够熟练之后,就要进入下一个难度平台。为了方便大家,我把Codeforces上截止2017年1月3日的所有题目的基本信息用爬虫收集了下来,并存储到excel里。更进一步,本文试图分析不同算法在不同难度等级上的出现频率分布,以及不同算法在不同难度等级上被解决次数的分布。最后,我会简要介绍的我的刷题观,以及如何爬取Codeforces上的信息。
</p>
<a id="more"></a>
<div id="outline-container-sec-1" class="outline-2">
<h2 id="sec-1">先说结论</h2>
<div class="outline-text-2" id="text-1">
</div><div id="outline-container-sec-1-1" class="outline-3">
<h3 id="sec-1-1">一张图</h3>
<div class="outline-text-3" id="text-1-1">
<p>
<div class="figure"><p><center><img src="Codeforces_Algorithms_Tag_Frequency.jpg" alt="Codeforces_Algorithms_Tag_Frequency.jpg" width=" 80%"><figcaption>Codeforces_Algorithms_Tag_Frequency.jpg</figcaption></center></p></div>
上面这张图反映了不同算法(第一列)在不同问题难度(第一行)上的频率分布,基于该图,大概就可以知道在什么样的水平下应该掌握什么样的算法。不过这里我没有区分Div1和Div2之间的差别,仅仅是按照题号(A、B、C等等)来推断难度。可以看到对简单的A题而言,大部分都是考察基本的编程功底,诸如implementation(大概就是题目说什么,你做什么就是了),math(四则运算、取模取整等等)以及brute force(暴力枚举)。而随着难度的增加,比如说E题,主要就在于考察对dp(动态规划),data structures(数据结构)。当然了,从图中也可以看出,高难度题目主要在math,geometry(计算几何),shortest path(图论)以及games(博弈)上。下面再免费附送领一张图,反映了不同算法在不同问题难度上被解决次数的频率分布。
</p>
<p>
<div class="figure"><p><center><img src="Codeforces_Algorithms_Tag_Solved.jpg" alt="Codeforces_Algorithms_Tag_Solved.jpg" width=" 100%"><figcaption>Codeforces_Algorithms_Tag_Solved.jpg</figcaption></center></p></div>
</p>
</div>
</div>
<div id="outline-container-sec-1-2" class="outline-3">
<h3 id="sec-1-2">一张表</h3>
<div class="outline-text-3" id="text-1-2">
<p>
<div class="figure"><p><center><img src="Codeforces-ProblemSet.jpg" alt="Codeforces-ProblemSet.jpg" width=" 80%"><figcaption>Codeforces-ProblemSet.jpg</figcaption></center></p></div>
然后祭上刷题目录,也就是这一张表,汇总了截止2017年1月3日Codeforces题目上的所有算法题。基于这张表,一来可以按照解决人数来进行刷题,二来可以按照题目难度进行刷题,三来还可以进行主题刷题。具体的文件下载链接请见文末。
</p>
</div>
</div>
<div id="outline-container-sec-1-3" class="outline-3">
<h3 id="sec-1-3">我的刷题观</h3>
<div class="outline-text-3" id="text-1-3">
<p>
这里搬来我在知乎上的回答,详见 <a href="https://www.zhihu.com/question/36738189/answer/128101002" target="_blank" rel="external">LeetCode按照怎样的顺序来刷题比较好?</a>
</p>
<ul class="org-ul">
<li><b>如果想提升自己的思维能力</b> ,可以按照AC率或者解决人数由低到高二分查找匹配自己当前水平难度的题目,然后适当挑战高难度题(二分时间复杂度是 \(O(\log N)\) ,至少比从易到难的 \(O(N)\) 节省时间)
</li>
<li><b>如果想巩固某一专题</b> ,那自然应该按照tag来刷题,但是因为所用的方法在求解前已知,不太利于思维能力的提升
</li>
<li><b>如果什么都不懂</b> ,那么建议随机刷题,一来可以涨见识,二来进步空间比较大
</li>
<li><b>如果想提高AC率或者增加自信</b> ,那么建议刷水题
</li>
<li><b>混搭以上策略</b> ,比如针对某一专题,然后用二分查找来选择问题求解
</li>
</ul>
<p>
再有个建议,题目如果太难超过自己当前能力的话,尝试一定时间后还是老老实实看题解吧,人与人之间还是有天赋差别的,但区别在于经验可以慢慢积累。特别是即使做对题之后,还要想尽办法看有没有提高的余地,并参考别人的代码,看如何精简代码以及精简时间空间复杂度。
</p>
<p>
<div class="figure"><p><center><img src="tourist.jpg" alt="tourist.jpg" width=" 80%"><figcaption>tourist.jpg</figcaption></center></p></div>
据说大神们的刷题量都是上万的,所以正式比赛里可以看到诸多大神不到一分钟就秒了一道题,手速太快。对Competitive Programming而言,把题目做对是基本要求(题目太难则另当别论),用更快的速度求解才是顶尖高手之间的核心区别。如果说真的有天赋存在的话,那我们也无能为力;但希望能像卖油翁一样说出,『无他,但手熟尔』。
</p>
</div>
</div>
</div>
<div id="outline-container-sec-2" class="outline-2">
<h2 id="sec-2">如何用爬虫获取信息</h2>
<div class="outline-text-2" id="text-2">
</div><div id="outline-container-sec-2-1" class="outline-3">
<h3 id="sec-2-1">必要的库</h3>
<div class="outline-text-3" id="text-2-1">
<div class="org-src-container">
<figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="number">1</span>: <span class="keyword">import</span> re</span><br><span class="line"><span class="number">2</span>: <span class="keyword">import</span> urllib.request</span><br><span class="line"><span class="number">3</span>: <span class="keyword">from</span> bs4 <span class="keyword">import</span> BeautifulSoup</span><br><span class="line"><span class="number">4</span>: <span class="keyword">import</span> os</span><br><span class="line"><span class="number">5</span>: <span class="keyword">import</span> csv</span><br><span class="line"><span class="number">6</span>: <span class="keyword">import</span> time</span><br></pre></td></tr></table></figure>
</div>
</div>
</div>
<div id="outline-container-sec-2-2" class="outline-3">
<h3 id="sec-2-2">爬取Codeforces的所有算法题</h3>
<div class="outline-text-3" id="text-2-2">
<div class="org-src-container">
<figure class="highlight python"><table><tr><td class="code"><pre><span class="line"> <span class="number">1</span>: <span class="comment">#%% retrieve the problem set</span></span><br><span class="line"> <span class="number">2</span>: <span class="function"><span class="keyword">def</span> <span class="title">spider</span><span class="params">(url)</span>:</span></span><br><span class="line"> <span class="number">3</span>: response = urllib.request.urlopen(url)</span><br><span class="line"> <span class="number">4</span>: soup = BeautifulSoup(response.read())</span><br><span class="line"> <span class="number">5</span>: pattern = {<span class="string">'name'</span>: <span class="string">'tr'</span>}</span><br><span class="line"> <span class="number">6</span>: content = soup.findAll(**pattern)</span><br><span class="line"> <span class="number">7</span>: <span class="keyword">for</span> row <span class="keyword">in</span> content:</span><br><span class="line"> <span class="number">8</span>: item = row.findAll(<span class="string">'td'</span>)</span><br><span class="line"> <span class="number">9</span>: <span class="keyword">try</span>:</span><br><span class="line"><span class="number">10</span>: <span class="comment"># get the problem id</span></span><br><span class="line"><span class="number">11</span>: id = item[<span class="number">0</span>].find(<span class="string">'a'</span>).string.strip()</span><br><span class="line"><span class="number">12</span>: col2 = item[<span class="number">1</span>].findAll(<span class="string">'a'</span>)</span><br><span class="line"><span class="number">13</span>: <span class="comment"># get the problem title</span></span><br><span class="line"><span class="number">14</span>: title = col2[<span class="number">0</span>].string.strip()</span><br><span class="line"><span class="number">15</span>: <span class="comment"># get the problem tags</span></span><br><span class="line"><span class="number">16</span>: tags = [foo.string.strip() <span class="keyword">for</span> foo <span class="keyword">in</span> col2[<span class="number">1</span>:]]</span><br><span class="line"><span class="number">17</span>: <span class="comment"># get the number of AC submissions</span></span><br><span class="line"><span class="number">18</span>: solved = re.findall(<span class="string">'x(\d+)'</span>, str(item[<span class="number">3</span>].find(<span class="string">'a'</span>)))[<span class="number">0</span>]</span><br><span class="line"><span class="number">19</span>: <span class="comment"># update the problem info</span></span><br><span class="line"><span class="number">20</span>: codeforces[id] = {<span class="string">'title'</span>:title, <span class="string">'tags'</span>:tags, <span class="string">'solved'</span>:solved, <span class="string">'accepted'</span>:<span class="number">0</span>,}</span><br><span class="line"><span class="number">21</span>: <span class="keyword">except</span>:</span><br><span class="line"><span class="number">22</span>: <span class="keyword">continue</span></span><br><span class="line"><span class="number">23</span>: <span class="keyword">return</span> soup</span><br><span class="line"><span class="number">24</span>: </span><br><span class="line"><span class="number">25</span>: codeforces = {}</span><br><span class="line"><span class="number">26</span>: wait = <span class="number">15</span> <span class="comment"># wait time to avoid the blocking of spider</span></span><br><span class="line"><span class="number">27</span>: last_page = <span class="number">33</span> <span class="comment"># the total page number of problem set page</span></span><br><span class="line"><span class="number">28</span>: url = [<span class="string">'http://codeforces.com/problemset/page/%d'</span> % page <span class="keyword">for</span> page <span class="keyword">in</span> range(<span class="number">1</span>,last_page+<span class="number">1</span>)]</span><br><span class="line"><span class="number">29</span>: <span class="keyword">for</span> foo <span class="keyword">in</span> url:</span><br><span class="line"><span class="number">30</span>: print(<span class="string">'Processing URL %s'</span> % foo)</span><br><span class="line"><span class="number">31</span>: spider(foo)</span><br><span class="line"><span class="number">32</span>: print(<span class="string">'Wait %f seconds'</span> % wait)</span><br><span class="line"><span class="number">33</span>: time.sleep(wait)</span><br></pre></td></tr></table></figure>
</div>
</div>
</div>
<div id="outline-container-sec-2-3" class="outline-3">
<h3 id="sec-2-3">标记已解决的算法题</h3>
<div class="outline-text-3" id="text-2-3">
<div class="org-src-container">
<figure class="highlight python"><table><tr><td class="code"><pre><span class="line"> <span class="number">1</span>: <span class="comment">#%% mark the accepted problems</span></span><br><span class="line"> <span class="number">2</span>: <span class="function"><span class="keyword">def</span> <span class="title">accepted</span><span class="params">(url)</span>:</span></span><br><span class="line"> <span class="number">3</span>: response = urllib.request.urlopen(url)</span><br><span class="line"> <span class="number">4</span>: soup = BeautifulSoup(response.read())</span><br><span class="line"> <span class="number">5</span>: pattern = {<span class="string">'name'</span>:<span class="string">'table'</span>, <span class="string">'class'</span>:<span class="string">'status-frame-datatable'</span>}</span><br><span class="line"> <span class="number">6</span>: table = soup.findAll(**pattern)[<span class="number">0</span>]</span><br><span class="line"> <span class="number">7</span>: pattern = {<span class="string">'name'</span>: <span class="string">'tr'</span>}</span><br><span class="line"> <span class="number">8</span>: content = table.findAll(**pattern)</span><br><span class="line"> <span class="number">9</span>: <span class="keyword">for</span> row <span class="keyword">in</span> content:</span><br><span class="line"><span class="number">10</span>: <span class="keyword">try</span>:</span><br><span class="line"><span class="number">11</span>: item = row.findAll(<span class="string">'td'</span>)</span><br><span class="line"><span class="number">12</span>: <span class="comment"># check whether this problem is solved</span></span><br><span class="line"><span class="number">13</span>: <span class="keyword">if</span> <span class="string">'Accepted'</span> <span class="keyword">in</span> str(row):</span><br><span class="line"><span class="number">14</span>: id = item[<span class="number">3</span>].find(<span class="string">'a'</span>).string.split(<span class="string">'-'</span>)[<span class="number">0</span>].strip()</span><br><span class="line"><span class="number">15</span>: codeforces[id][<span class="string">'accepted'</span>] = <span class="number">1</span></span><br><span class="line"><span class="number">16</span>: <span class="keyword">except</span>:</span><br><span class="line"><span class="number">17</span>: <span class="keyword">continue</span></span><br><span class="line"><span class="number">18</span>: <span class="keyword">return</span> soup</span><br><span class="line"><span class="number">19</span>: </span><br><span class="line"><span class="number">20</span>: wait = <span class="number">15</span> <span class="comment"># wait time to avoid the blocking of spider</span></span><br><span class="line"><span class="number">21</span>: last_page = <span class="number">10</span> <span class="comment"># the total page number of user submission</span></span><br><span class="line"><span class="number">22</span>: handle = <span class="string">'Greenwicher'</span> <span class="comment"># please input your handle</span></span><br><span class="line"><span class="number">23</span>: url = [<span class="string">'http://codeforces.com/submissions/%s/page/%d'</span> % (handle, page) <span class="keyword">for</span> page <span class="keyword">in</span> range(<span class="number">1</span>, last_page+<span class="number">1</span>)]</span><br><span class="line"><span class="number">24</span>: <span class="keyword">for</span> foo <span class="keyword">in</span> url:</span><br><span class="line"><span class="number">25</span>: print(<span class="string">'Processing URL %s'</span> % foo)</span><br><span class="line"><span class="number">26</span>: accepted(foo)</span><br><span class="line"><span class="number">27</span>: print(<span class="string">'Wait %f seconds'</span> % wait)</span><br><span class="line"><span class="number">28</span>: time.sleep(wait)</span><br></pre></td></tr></table></figure>
</div>
</div>
</div>
<div id="outline-container-sec-2-4" class="outline-3">
<h3 id="sec-2-4">输出爬取信息到csv文本</h3>
<div class="outline-text-3" id="text-2-4">
<div class="org-src-container">
<figure class="highlight python"><table><tr><td class="code"><pre><span class="line"> <span class="number">1</span>: <span class="comment">#%% output the problem set to csv files</span></span><br><span class="line"> <span class="number">2</span>: root = os.getcwd()</span><br><span class="line"> <span class="number">3</span>: <span class="keyword">with</span> open(os.path.join(root,<span class="string">"CodeForces-ProblemSet.csv"</span>),<span class="string">"w"</span>, encoding=<span class="string">"utf-8"</span>) <span class="keyword">as</span> f_out:</span><br><span class="line"> <span class="number">4</span>: f_csv = csv.writer(f_out)</span><br><span class="line"> <span class="number">5</span>: f_csv.writerow([<span class="string">'ID'</span>, <span class="string">'Title'</span>, <span class="string">'Tags'</span>, <span class="string">'Solved'</span>, <span class="string">'Accepted'</span>])</span><br><span class="line"> <span class="number">6</span>: <span class="keyword">for</span> id <span class="keyword">in</span> codeforces:</span><br><span class="line"> <span class="number">7</span>: title = codeforces[id][<span class="string">'title'</span>]</span><br><span class="line"> <span class="number">8</span>: tags = <span class="string">', '</span>.join(codeforces[id][<span class="string">'tags'</span>])</span><br><span class="line"> <span class="number">9</span>: solved = codeforces[id][<span class="string">'solved'</span>]</span><br><span class="line"><span class="number">10</span>: accepted = codeforces[id][<span class="string">'accepted'</span>]</span><br><span class="line"><span class="number">11</span>: f_csv.writerow([id, title, tags, solved, accepted])</span><br><span class="line"><span class="number">12</span>: f_out.close()</span><br></pre></td></tr></table></figure>
</div>
</div>
</div>
<div id="outline-container-sec-2-5" class="outline-3">
<h3 id="sec-2-5">分析题目难度以及算法分类的关系</h3>
<div class="outline-text-3" id="text-2-5">
<div class="org-src-container">
<figure class="highlight python"><table><tr><td class="code"><pre><span class="line"> <span class="number">1</span>: <span class="comment">#%% analyze the problem set</span></span><br><span class="line"> <span class="number">2</span>: <span class="comment"># initialize the difficult and tag list</span></span><br><span class="line"> <span class="number">3</span>: difficult_level = {}</span><br><span class="line"> <span class="number">4</span>: tags_level = {}</span><br><span class="line"> <span class="number">5</span>: <span class="keyword">for</span> id <span class="keyword">in</span> codeforces:</span><br><span class="line"> <span class="number">6</span>: difficult = re.findall(<span class="string">'([A-Z])'</span>, id)[<span class="number">0</span>]</span><br><span class="line"> <span class="number">7</span>: tags = codeforces[id][<span class="string">'tags'</span>]</span><br><span class="line"> <span class="number">8</span>: difficult_level[difficult] = difficult_level.get(difficult, <span class="number">0</span>) + <span class="number">1</span></span><br><span class="line"> <span class="number">9</span>: <span class="keyword">for</span> tag <span class="keyword">in</span> tags:</span><br><span class="line"><span class="number">10</span>: tags_level[tag] = tags_level.get(tag, <span class="number">0</span>) + <span class="number">1</span></span><br><span class="line"><span class="number">11</span>: <span class="keyword">import</span> operator</span><br><span class="line"><span class="number">12</span>: tag_level = sorted(tags_level.items(), key=operator.itemgetter(<span class="number">1</span>))[::-<span class="number">1</span>]</span><br><span class="line"><span class="number">13</span>: tag_list = [foo[<span class="number">0</span>] <span class="keyword">for</span> foo <span class="keyword">in</span> tag_level]</span><br><span class="line"><span class="number">14</span>: difficult_level = sorted(difficult_level.items(), key=operator.itemgetter(<span class="number">0</span>))</span><br><span class="line"><span class="number">15</span>: difficult_list = [foo[<span class="number">0</span>] <span class="keyword">for</span> foo <span class="keyword">in</span> difficult_level]</span><br><span class="line"><span class="number">16</span>: </span><br><span class="line"><span class="number">17</span>: <span class="comment"># initialize the 2D relationships matrix</span></span><br><span class="line"><span class="number">18</span>: <span class="comment"># matrix_solved: the number of AC submission for each tag in each difficult level</span></span><br><span class="line"><span class="number">19</span>: <span class="comment"># matrix_freq: the number of tag frequency for each diffiicult level</span></span><br><span class="line"><span class="number">20</span>: matrix_solved, matrix_freq = [[[<span class="number">0</span>] * len(difficult_list) <span class="keyword">for</span> _ <span class="keyword">in</span> range(len(tag_list))] <span class="keyword">for</span> _ <span class="keyword">in</span> range(<span class="number">2</span>)]</span><br><span class="line"><span class="number">21</span>: </span><br><span class="line"><span class="number">22</span>: </span><br><span class="line"><span class="number">23</span>: <span class="comment"># construct the 2D relationships matrix</span></span><br><span class="line"><span class="number">24</span>: <span class="keyword">for</span> id <span class="keyword">in</span> codeforces:</span><br><span class="line"><span class="number">25</span>: difficult = re.findall(<span class="string">'([A-Z])'</span>, id)[<span class="number">0</span>]</span><br><span class="line"><span class="number">26</span>: difficult_id = difficult_list.index(difficult)</span><br><span class="line"><span class="number">27</span>: tags = codeforces[id][<span class="string">'tags'</span>]</span><br><span class="line"><span class="number">28</span>: solved = codeforces[id][<span class="string">'solved'</span>]</span><br><span class="line"><span class="number">29</span>: <span class="keyword">for</span> tag <span class="keyword">in</span> tags:</span><br><span class="line"><span class="number">30</span>: tag_id = tag_list.index(tag)</span><br><span class="line"><span class="number">31</span>: matrix_solved[tag_id][difficult_id] += int(solved)</span><br><span class="line"><span class="number">32</span>: matrix_freq[tag_id][difficult_id] += <span class="number">1</span></span><br></pre></td></tr></table></figure>
</div>
</div>
</div>
</div>
<div id="outline-container-sec-3" class="outline-2">
<h2 id="sec-3">下载本文源代码以及分析结果</h2>
<div class="outline-text-2" id="text-3">
<p>
本文源代码以及分析结果请见 <a href="https://github.com/Greenwicher/Awsome-Project/tree/master/Codeforces%20Guide" target="_blank" rel="external">我的Github</a> ,或者点击链接下载: <a href="https://pan.baidu.com/s/1o7P8oT8" target="_blank" rel="external">https://pan.baidu.com/s/1o7P8oT8</a> 密码: 8dcb。
</p>
</div>
</div>
简要介绍如何科学地刷算法题,来提高自己解决问题的能力,并利用爬虫抓取Codeforces的题库,来分析题目难度以及算法分类的关系
Hello 2017
http://blog.greenwicher.com/2017/01/01/hello-2017/
2017-01-01T00:00:00.000Z
2018-01-01T07:55:31.000Z
<p>
计划、组织、领导、控制,这恐怕是学过管理的人都耳熟能详的四个词。凡事预则立,不预则废。我想目标还是讲出来、写出来的比较好,一来有个靶子知道自己要做什么,二来心里可以惦记着也算是一种鞭策,三来也有个监督立flag的意味。其实大部分的目标,无外乎就是靠时间来换取结果,有个阶段性的计划也好对抗自己的拖延症,要不就陷入自己的舒适区无法前进。就像鲤鱼跃龙门一样,跨过了这个槛,才能有新的平台和视野。感觉毕业两年半,周围的同学都在大踏步的前进,而我还在原地踏步,实在是太惭愧了。在这里列出我2017年的小目标,通过每个季度的追踪以及校正,希望在新的一年能有所收获吧。
</p>
<a id="more"></a>
<div id="outline-container-sec-1" class="outline-2">
<h2 id="sec-1">大红FLAG高高挂</h2>
<div class="outline-text-2" id="text-1">
<p>
<div class="figure"><p><center><img src="make-it-happen.jpg" alt="make-it-happen.jpg" width=" 80%"><figcaption>make-it-happen.jpg</figcaption></center></p></div>
</p>
<ul class="org-ul">
<li>规划日:<span class="timestamp-wrapper"><span class="timestamp"><2017-01-01 Sun></span></span>
</li>
<li>验收日:<span class="timestamp-wrapper"><span class="timestamp"><2018-01-01 Mon></span></span>
</li>
</ul>
<hr>
<!--<input type='checkbox' onclick='return false;' checked>-->
<input type="checkbox" onclick="return false;" checked> 每一天的瞬间,都有照片来收藏 <br>
<input type="checkbox" onclick="return false;" checked> 培养一辈子的兴趣爱好 (比如围棋、音乐鉴赏)<br>
<input type="checkbox" onclick="return false;" checked> 尝试世界的多种可能性,走出自己的舒适区 <br>
<hr>
<input type="checkbox" onclick="return false;" checked> 每两周阅读一本书,也就是全年26本书,并且要对读过的书做适当总结<br>
<input type="checkbox" onclick="return false;"> 培养看报刊杂志新闻的习惯 (离线周刊、经济观察报、WIRED等)<br>
<input type="checkbox" onclick="return false;"> 依靠个人博客坚持写作<br>
<input type="checkbox" onclick="return false;"> 尝试创作一些短篇小说<br>
<hr>
<input type="checkbox" onclick="return false;" checked> 学术上,争取完成两项研究,并达到期刊的水准,为毕业答辩做准备<br>
<input type="checkbox" onclick="return false;" checked> 参加12月份在拉斯维加斯的Winter Simulation Conference
<hr>
<input type="checkbox" onclick="return false;" checked> 开始系统的学习C++ <br>
<input type="checkbox" onclick="return false;"> 重新系统的学习Python <br>
<input type="checkbox" onclick="return false;"> 尝试一门函数式编程语言 <br>
<input type="checkbox" onclick="return false;"> 参与到开源项目中,为Google Summer of Code做准备 <br>
<input type="checkbox" onclick="return false;"> 努力学习算法与数据结构,争取在Codeforces上稳定进入Div1,当然<font color="red">飘红</font>是最好的<br>
<input type="checkbox" onclick="return false;"> 在博客上开设《算法与数据结构》系列 <br>
<hr>
<input type="checkbox" onclick="return false;"> 完结《深度增强学习》以及《机器学习》系列 <br>
<input type="checkbox" onclick="return false;" checked> 基于Kaggle的101训练,来学习基本的机器学习算法,并试着参加一场Kaggle的比赛<br>
<input type="checkbox" onclick="return false;"> 在Open Universe或类似平台上,试着实施业界领先的增强学习算法<br>
<hr>
<input type="checkbox" onclick="return false;"> 找一个开源项目(比如说tushare,zipline,vnpy,pyalgotrate,rqalpha等),学习其架构<br>
<input type="checkbox" onclick="return false;"> 实施经典的量化交易策略并能综合的对其进行评价比较<br>
<input type="checkbox" onclick="return false;"> 在博客上开一个《经典投资策略》系列 <br>
<hr>
<input type="checkbox" onclick="return false;"> 早睡早起,方能养生 <br>
<input type="checkbox" onclick="return false;"> 培养跑步的习惯 <br>
<input type="checkbox" onclick="return false;"> 学会自由泳 <br>
<input type="checkbox" onclick="return false;"> 多多打羽毛球 <br>
<hr>
</div>
</div>
<div id="outline-container-sec-2" class="outline-2">
<h2 id="sec-2">一季度规划</h2>
<div class="outline-text-2" id="text-2">
<ul class="org-ul">
<li>规划日:<span class="timestamp-wrapper"><span class="timestamp"><2017-01-02 Mon></span></span>
</li>
<li>验收日:<span class="timestamp-wrapper"><span class="timestamp"><2017-03-31 Fri></span></span>
</li>
</ul>
<p>
转眼间,一年的四分之一就过去了,然而记忆只有十秒钟的我还觉得一切才开始呢。好吧,我承认一季度已经过去了,而且又被打脸了。制定规划的时候觉得没啥太大意外应该都能完成,但忽略了这学期的一些杂事。比如说IE6001的助教任务相对往年大幅度增加,虽然选的人比去年少了五个,但主要还是setup time时间比较大啊,而且每周都有作业了。其次,好几个没完成的任务(算法总结、增强学习总结、量化交易总结)我都是安排在周末去做的,难免偶尔有些事情就又拖到下一周,久而久之,迈出第一步的动力就弱了。再者,对任务的复杂度以及所需时间预计不准,比如说想要把动态规划、二分搜索、深度/宽度优先搜索都总结一遍,倒不是说不可能,除非一门心思花在这些事情上面,要不然与其走马观花的随便总结,实在有些形式主义了。最后,还是对自己的定位不够清楚,觉得自己啥都可以做,但之后的任务安排还是尽量集中些,要不然什么都想做什么但都做不了而且做不精。
</p>
<ul class="org-ul">
<li><a href="https://zh.wikipedia.org/wiki/%E5%9B%B4%E6%A3%8B%E6%9C%AF%E8%AF%AD" target="_blank" rel="external">维基百科</a> 上关于围棋结构基本单位讲的还是蛮清楚的;与此同时看了几集<a href="http://list.youku.com/albumlist/show?id=17827429&ascending=1&page=1" target="_blank" rel="external">世纪风云-吴清源传奇</a> ,也是敬佩段祺瑞对民国围棋做出的贡献。
</li>
<li>有人说小棋盘上就是做死活题,感觉自己还是有点浮躁,即使小棋盘都不愿多算几步;只是兵来将挡,水来土掩,感觉这样会很难体会到围棋的乐趣。凭借着SmartGo Kifu的提示,侥幸解锁了13x13棋盘。
</li>
<li>听了几场古典音乐会和讲座,参观了埃舍尔的画展。发现这些艺术作品有一个共同之处,就是对结构美以及层次感的追求,以此来达到新的体验。
</li>
<li>推荐一本《寻路中国》,外国人的视角看中国,写的很不错;《撒哈拉的故事》也让我看到了别样的人生,一生哪怕一次冲动。
</li>
<li>列了一大堆信息源列表,但愧于眼拙,暂时还没能选出优质的信息源,估计只能随大流了。
</li>
<li>MOPRS的数值实验现在还不错,就是理论上的有限时间表现并没做太多工作,以后有时间和经验了再看看。
</li>
<li>有了之前MOCBA的基础,这篇Robust Ranking & Selection的工作做的很快,之后还有很多细节需要琢磨一下。
</li>
<li>关于《Accelerated C++》的总结很早就完成了,但仅仅是总结,基本没太多实践,书后的习题现在也懒得做了。
</li>
<li>刷了刷Leetcode上关于二分搜索、深度/宽度优先搜索的题;通过了Google FooBar Challenge;也练习了几次Google APAC Test。感觉主要还是用Python吧,PyPy蛮快的,虽然对C扩展支持不太好。至于C++,还是通过其他项目熟悉熟悉。
</li>
<li>起初有打算写复杂度分析和二分搜索的介绍,但后来看到Topcoder上的<a href="https://www.topcoder.com/community/data-science/data-science-tutorials/" target="_blank" rel="external">Tutorial</a> 写的都蛮全的。自己理解也不深,还是不要班门弄斧了,先努力刷题提高姿势水平为王道。
</li>
<li>学懂倒是没啥问题,就是用自己的逻辑再去表达一遍感觉还是有点不清晰,而且一拖延就一直拖着了。。
</li>
<li>同学推荐<a href="https://book.douban.com/subject/1695059/" target="_blank" rel="external">《Active Portfolio Management》</a>,待读。参加了WorldQuant的比赛,感觉有点感觉了。
</li>
</ul>
<hr>
<input type="checkbox" onclick="return false;" checked> 熟悉围棋的专业术语以及基本棋型,能大致听得懂围棋解说,完善http://wiki.greenwicher.com/2016/02/16/博弈-围棋入门/<br>
<input type="checkbox" onclick="return false;" checked> 解锁SmartGo Kifu 13x13的人机博弈<br>
<input type="checkbox" onclick="return false;" checked> 参加若干场艺术活动,比如埃舍尔的展览 <br>
<hr>
<input type="checkbox" onclick="return false;" checked> 至少阅读6本关于旅行方面的书,观世界 <br>
<input type="checkbox" onclick="return false;"> 筛选信息源,并形成固定时间的阅读习惯 <br>
<hr>
<input type="checkbox" onclick="return false;" checked> 完成MOPRS的初稿,理论数值结果更进一步 <br>
<input type="checkbox" onclick="return false;" checked> 开始新的一项研究,为WSC的投稿做准备 <br>
<hr>
<input type="checkbox" onclick="return false;" checked> 完成对《Accelerated C++》第6-11章的总结,详见http://wiki.greenwicher.com/2016/04/19/编程-Accelerated_C++/ <br>
<input type="checkbox" onclick="return false;" checked> 同时用Python和C++练习Codeforces等OJ平台上的算法题 <br>
<input type="checkbox" onclick="return false;"> 在博客上总结算法复杂度分析、动态规划、二分查找、深度优先搜索以及宽度优先搜索的思路以及练习题 <br>
<hr>
<input type="checkbox" onclick="return false;"> 在博客上总结David Silver增强学习公开课的Lecture2-7<br>
<hr>
<input type="checkbox" onclick="return false;"> 找到一本量化交易策略的书,然后实施若干经典投资策略,进行回测,并在博客上总结<br>
<hr>
</div>
</div>
<div id="outline-container-sec-3" class="outline-2">
<h2 id="sec-3">二季度规划</h2>
<div class="outline-text-2" id="text-3">
<ul class="org-ul">
<li>规划日:<span class="timestamp-wrapper"><span class="timestamp"><2017-04-02 Sun></span></span>
</li>
<li>验收日:<span class="timestamp-wrapper"><span class="timestamp"><2017-06-30 Fri></span></span>
</li>
</ul>
<p>
还没转眼间,一年的一半就过去了,开学之后我就要博士四年级了。幸运的话,明年这个时候差不多可以交毕业论文然后准备毕业了(求不打脸)。所以二季度主要思考了毕业之后的方向,其实无外乎是找教职、做数据科学家、做码农或者做矿工。虽说还是犹豫了很长时间,但很显然最吸引我的还是矿工这份工作。一方面和自己的技能树重叠比较高,其次市场变化快回馈也快,再者就是有挑战,更不用说高回报了,感觉是个越走越宽的行业。编程虽然喜欢,但感觉一方面技术更迭太快,可能会越走越窄;另一方面,肯定是很难和科班出身的竞争啦;最好的出路可能是创业,但感觉自己对资源的整合并不在行,这个路径估计即使出现也会是好多年后了。教职实际上是最让我放不下的,一方面无论是从本科到现在博士,感觉自己还是有能力做好的;但自己更向往的是要么纯基础的研究,要么是纯应用的研究,感觉目前所在的学科夹在中间,有的时候为了发论文而发论文不太喜欢;再者就是自己不太喜欢写作,加上审稿周期太长,很多时候会让自己感到一种迷茫,感到自己是否真正创造了价值。从趋势而言,无论哪个行业,数据科学家的需求都会越来越大,矿工也不例外;但如果非要选一个行业的话,我想还是利润再分配的第一层好些吧。不过即使这样,矿工依然是一个很大的行业。自己也和一些卖方做衍生品定价的Quant,还有中低频至高频做策略的买方Quant聊了聊,感觉还是后者更适合更吸引我些;不过这二者其实都对编程要求都很高,金融也不能太差。主要的区别在于数学上面,一个是侧重随机分析、偏微分方程、随机过程以及各种数值仿真方法的Q Quant,一个是侧重统计分析、计量、特征工程等统计机器学习方法的P Quant。二者的业务模式差别还是很大的,而且即使P Quant里的中低高频,也分别有各自的业务模式。言归正传,开学之后,如果还是继续带三门simulation课的助教,感觉会更忙。第二季度实在是有些没有控制好,还有好多事情没有做,好多事情因为拖延因为焦虑而给延误了。其实想想,可能我自己加法做的太多了,有的时候少即是多,就像我坚信的『It's best to do one thing really, really well.』
</p>
<ul class="org-ul">
<li>围棋的话,基本这个季度没做什么
</li>
<li>参观了NUS Baba House(峇峇住宅),惊叹其设计的精巧,羡慕其生活的自得其乐
</li>
<li>CELC的口语训练营还蛮推荐的,而且没想到我们组拿了双料冠军
</li>
<li>读了7本投资方面的书,还是有些少了,还有好几本想读的没有看;有一个半月的时间花在了《金融炼金术》上,虽然还是没有看太懂,感觉要对当时的历史事件以及宏观经济理解比较深再去看会好些
</li>
<li>信息源基本是《经济观察报》、《财新周刊》、《财经》、《第一财经周刊》、《Wired》、《Economist》还有各种微信公众号吧,还是有些多,切记少即是多
</li>
<li>MOPRS的文章已经投到IEEE Transactions on Evolutionary Computation,希望有好的结果吧
</li>
<li>PR-OCBA的文章已经被WSC接收了,理论和数值部分的工作还得继续精细化
</li>
<li>下一个研究应该是多目标优化和梯度的结合,另外PR-OCBA的研究会考虑一些衡量风险的测度
</li>
<li>《Accelerated C++》一周目结束,感觉内容已经很全了,下一步要多实践实践
</li>
<li>依旧是刷LeetCode,但进度有些慢了
</li>
<li>增强学习的公开课今年一定要搞定!
</li>
<li>经典投资策略的实施想想还是算了,自己还没把握尽善尽美,而且即使实施了也没想好下一步怎么办;所以尽量写一篇综述的文章,介绍各种策略吧
</li>
<li>依旧是蛙泳。。
</li>
</ul>
<hr>
<input type="checkbox" onclick="return false;"> 看完《世纪风云·吴清源传奇》<br>
<input type="checkbox" onclick="return false;"> 赢得Crazy Stone 9x9的25个medal challenge<br>
<input type="checkbox" onclick="return false;"> 做完Smart Go Kifu 15k(包括)之前的所有死活题<br>
<input type="checkbox" onclick="return false;" checked> 参加若干场博物馆展览 <br>
<input type="checkbox" onclick="return false;" checked> 参加CELC的Oral Communication Camp<br>
<hr>
<input type="checkbox" onclick="return false;" checked> 至少阅读6本关于投资方面的书 <br>
<input type="checkbox" onclick="return false;" checked> 筛选信息源,并形成固定时间的阅读习惯 <br>
<hr>
<input type="checkbox" onclick="return false;" checked> 把MOPRS的工作投出去 <br>
<input type="checkbox" onclick="return false;"> 完善PR-OCBA的理论和数值工作 <br>
<input type="checkbox" onclick="return false;" checked> 明确之后的研究方向,并进行初步探索 <br>
<hr>
<input type="checkbox" onclick="return false;" checked> 完成对《Accelerated C++》第12-16章的总结 <br>
<input type="checkbox" onclick="return false;" checked> 同时用Python和C++练习Codeforces等OJ平台上的算法题 <br>
<hr>
<input type="checkbox" onclick="return false;"> 在博客上总结David Silver增强学习公开课的Lecture2-7<br>
<hr>
<input type="checkbox" onclick="return false;"> 总结各大平台的投资策略,尝试新的策略 <br>
<input type="checkbox" onclick="return false;"> 实施若干经典投资策略,进行回测,并在博客上总结<br>
<hr>
<input type="checkbox" onclick="return false;"> 学会自由泳 <br>
<hr>
</div>
</div>
<div id="outline-container-sec-4" class="outline-2">
<h2 id="sec-4">三季度规划</h2>
<div class="outline-text-2" id="text-4">
<ul class="org-ul">
<li>规划日:<span class="timestamp-wrapper"><span class="timestamp"><2017-06-30 Fri></span></span>
</li>
<li>验收日:<span class="timestamp-wrapper"><span class="timestamp"><2017-12-18 Mon></span></span>
</li>
</ul>
<p>
转眼间四季度都要结束了,我才迟迟的验收三季度的目标,然而所完成的也远远低于预期。主要还是自己的执行力太差了,『明日复明日,明日成蹉跎』,想想国内的同学们每天拼搏的样子,自己在学校也是越来越懈怠了。每天定的计划都有些延迟,难免大的目标也难以实现。7月份的时候通过这个博客认识了Chun,后来便拿到了ADVANCE.AI的实习,开始了三个多月的兼职实习生活。实习中,也确实学到了不少东西,认识了一帮有趣的家伙。虽然因此导致科研、FRM复习的进度变得特别缓慢,但究其原因还是自己没有掌握好时间、没有认识到优先级。这学期的助教任务也是有些重,带了三门课,差不多总共快200来号人。不过以后终于不用再带这门课了。国内校招也参加了几个,拿了几个offer,虽然最终的结果可能还是回到原点,当然这也是最初的想法了。还是要再多努力一下,为了不让未来的自己后悔。四年前可谓已经是吃过类似的亏了,这次无论如何也要试一下。到了人生的十字路口才体会到之前某人的无奈,未来的轨迹如何也确实有些迷茫,还是挂念的东西太多,一直在过去的记忆里苟且偷生,逃避现实。快而立之年的我,需要承担的责任也越来越大,感觉自己辜负的事情已然很多了。期待下一个五年,能有所成绩,有能力保护好自己珍视的人。
</p>
<ul class="org-ul">
<li>围棋的话,基本好久没碰了,只是看到师弟下的很开心,我也感到很开心
</li>
<li>参观了国大博物馆、盖蒂中心、加州科技中心、洛杉矶自然历史博物馆
</li>
<li>只看了《文明之光》前三册和《智能时代》
</li>
<li>新闻报刊基本也很少看了
</li>
<li>MPRS的文章已经投出去了,希望有好的结果
</li>
<li>PR-OCBA的文章在WSC上讲了下,还有许多东西要做
</li>
<li>MGOS也有点落下进度了
</li>
<li>C++还是得多写多练
</li>
<li>LeetCode刷的有点没动力了
</li>
<li>学习RL的拖延症也是有点大
</li>
<li>尝试了一个虚拟股票预测大赛,虽然觉得没学到少
</li>
<li>QuantCon上也见到了陈晓优大神,各种安利国内的大好前景
</li>
<li>投资策略还有比特币交易系统基本没怎么看过。。。
</li>
<li>FRM Part 1已经考过了,比想象中的全面很多
</li>
<li>绿宝书还是得继续看
</li>
<li>自由泳还没尝试过
</li>
<li>跑步有段时间没跑了,体重一直飙升
</li>
</ul>
<hr>
<input type="checkbox" onclick="return false;"> 赢得Crazy Stone 9x9的20~25个medal challenge<br>
<input type="checkbox" onclick="return false;"> 做完Smart Go Kifu 15k(包括)之前的所有死活题<br>
<input type="checkbox" onclick="return false;" checked> 参加若干场博物馆展览,至少逛逛国大博物馆 <br>
<hr>
<input type="checkbox" onclick="return false;"> 阅读吴军博士的《文明之光》前三册、《智能时代》、《数学之美》以及《浪潮之巅》 <br>
<input type="checkbox" onclick="return false;"> 时间充足的话,至少阅读每周《财新周刊》的头条<br>
<hr>
<input type="checkbox" onclick="return false;" checked> 试着用MOPRS的文章来申请ICS Student Paper Award<br>
<input type="checkbox" onclick="return false;"> 【优先】完善PR-OCBA的理论和数值工作,并考虑风险测度 <br>
<input type="checkbox" onclick="return false;"> 【优先】明确MGOS的研究问题 <br>
<hr>
<input type="checkbox" onclick="return false;" checked> 【优先】借助QF5204的课程内容实践C++,至少完成各类期权的二叉树定价模型,如有时间可以考虑完善implied volatility surface,甚至local volatility model <br>
<input type="checkbox" onclick="return false;"> 用Python完成LeetCode上所有Easy题目(目前至少125道),50道Medium题目 <br>
<hr>
<input type="checkbox" onclick="return false;"> 在博客上总结David Silver增强学习公开课的Lecture2-7,不求高质量,但至少要推进起来 <br>
<input type="checkbox" onclick="return false;" checked> 【优先】试着参加一场Kaggle的比赛或者练习赛 <br>
<hr>
<input type="checkbox" onclick="return false;" checked> 听陈晓优讲vn.py的过去、现在和将来<br>
<input type="checkbox" onclick="return false;"> 【优先】先借助开源软件,调研比特币自动交易系统构建可行性,再尝试构建 <br>
<input type="checkbox" onclick="return false;"> 【优先】在博客上写一篇对各种投资策略的综述,重点在尽量全,有分析,有参考延伸资料 <br>
<input type="checkbox" onclick="return false;" checked> 【优先】备考FRM Part 1,并把重点脉络记录在我的个人维基<br>
<input type="checkbox" onclick="return false;" checked> 【优先】刷绿宝书 <br>
<hr>
<input type="checkbox" onclick="return false;"> 学会自由泳 <br>
<input type="checkbox" onclick="return false;" checked> 【优先】慢跑24~48公里 <br>
<hr>
</div>
</div>
<div id="outline-container-sec-5" class="outline-2">
<h2 id="sec-5">四季度规划</h2>
<div class="outline-text-2" id="text-5">
<ul class="org-ul">
<li>规划日:<span class="timestamp-wrapper"><span class="timestamp"><2017-12-18 Mon></span></span>
</li>
<li>验收日:<span class="timestamp-wrapper"><span class="timestamp"><2018-01-01 Mon></span></span>
</li>
</ul>
<hr>
<input type="checkbox" onclick="return false;" checked> 看完《数学之美》以及《Principles》精简版 <br>
<input type="checkbox" onclick="return false;" checked> 参加若干场博物馆展览 <br>
<hr>
</div>
</div>
我的2017年规划
Good Bye 2016
http://blog.greenwicher.com/2016/12/31/good-bye-2016/
2016-12-31T00:00:00.000Z
2018-03-29T03:42:11.000Z
<p>
风过留声,雁过留痕。一天又一天,一年又一年,总觉得小时候的时光很漫长,而越长越大却觉得时间飞逝,稍不留神自己就老了。关于这个时间相对性,有人这样解释道,假如你今年 \(N\) 岁,那么这一年相当于你人生中的 \(1/N\) ,自然年龄越大对时间流逝的敏感也就越来越小(见<a href="http://www.maximiliankiener.com/digitalprojects/time/" target="_blank" rel="external">这里</a>)。 换句话讲,时间对人的效用是边际递减的。年少时一无所知,用20%时间学习了80%的源头知识;长大后有所攻,用80%的时间学习或者提出了20%的扩展性知识。尽管如此,抛开数字而言,这2016年无论对谁而讲,都是鲜活的一年。就像每个人都是一本书,有了酒,有了观众,便有了故事。赶在这2016年的尾巴上,让我做一回瞬间收藏家,用光影来记录我的2016年。谢谢2016年我遇到的所有人,如果没有你们,这也不会成为我的2016年。
</p>
<ul class="org-ul">
<li>年初约定要发论文,经过半年的审稿再四个月的修改希望一切能遂愿吧,另外一篇QE结束之后就没怎么管了。
</li>
<li>年初说但求虐狗,也从一份友情收获到了真挚的爱情,虽然有着各种阻隔,但还是谢谢你给我的快乐时光。
</li>
<li>年初说要开发量化交易系统,虽然没有实现,但也借着今年初露锋芒的各大量化平台实现了几个还凑活的策略。
</li>
<li>年初想着在codeforces上再进一步,刷了半年题直到年尾重新拾起,发现自己只是在舒适区划水。
</li>
</ul>
<a id="more"></a>
<audio id="sound" autoplay loop>
<source src="Angel_of_the_Morning.mp3" type="audio/mpeg">
</audio>
<div id="outline-container-sec-1" class="outline-2">
<h2 id="sec-1">一月·美食</h2>
<div class="outline-text-2" id="text-1">
<p>
<div class="figure"><p><center><img src="2016-01-04_清华仿真优化研讨会.jpg" alt="2016-01-04_清华仿真优化研讨会.jpg" width=" 40%"><figcaption>2016-01-04_清华仿真优化研讨会.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-01-04,没有霾的北京可以如此美好
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-01-10_新加坡的第四年.jpg" alt="2016-01-10_新加坡的第四年.jpg" width=" 40%"><figcaption>2016-01-10_新加坡的第四年.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-01-10,四年前,那是我第一次来新加坡
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-01-19_第一次做蛋挞.jpg" alt="2016-01-19_第一次做蛋挞.jpg" width=" 40%"><figcaption>2016-01-19_第一次做蛋挞.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-01-19,被小师妹做的蛋挞惊艳到了,于是自己也试着做了一番
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-01-27_满天都是小星星.jpg" alt="2016-01-27_满天都是小星星.jpg" width=" 40%"><figcaption>2016-01-27_满天都是小星星.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-01-27,上一次吃杨桃,大概还是小学的时候吧
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-01-31_第一次做斑兰戚风蛋糕.jpg" alt="2016-01-31_第一次做斑兰戚风蛋糕.jpg" width=" 40%"><figcaption>2016-01-31_第一次做斑兰戚风蛋糕.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-01-31,我最爱的斑兰蛋糕,看着它膨胀,看着它坍缩
</p>
</blockquote>
</div>
</div>
<div id="outline-container-sec-2" class="outline-2">
<h2 id="sec-2">二月·团聚</h2>
<div class="outline-text-2" id="text-2">
<p>
<div class="figure"><p><center><img src="2016-02-06_牛车水张灯结彩迎春节.jpg" alt="2016-02-06_牛车水张灯结彩迎春节.jpg" width=" 40%"><figcaption>2016-02-06_牛车水张灯结彩迎春节.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-02-06,除夕前夜,三人行,吃得很撑,黄瓜很脆
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-02-07_除夕羊肉汤.jpg" alt="2016-02-07_除夕羊肉汤.jpg" width=" 40%"><figcaption>2016-02-07_除夕羊肉汤.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-02-07,猴年春晚真是无味,就像这羊肉汤
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-02-08_斑兰戚风蛋糕再次失败.jpg" alt="2016-02-08_斑兰戚风蛋糕再次失败.jpg" width=" 40%"><figcaption>2016-02-08_斑兰戚风蛋糕再次失败.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-02-08,为她准备的生日礼物,但是西式蛋糕总是做成中式大饼
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-02-11_这个Flag有点大.jpg" alt="2016-02-11_这个Flag有点大.jpg" width=" 40%"><figcaption>2016-02-11_这个Flag有点大.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-02-11,是的,92本书,是的,没读完
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-02-13_老板家聚会.jpg" alt="2016-02-13_老板家聚会.jpg" width=" 40%"><figcaption>2016-02-13_老板家聚会.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-02-13,有的人来了,有的人又走了
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-02-14_死侍.jpg" alt="2016-02-14_死侍.jpg" width=" 40%"><figcaption>2016-02-14_死侍.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-02-14,Angel of the Morning
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-02-15_新版个人网站.jpg" alt="2016-02-15_新版个人网站.jpg" width=" 40%"><figcaption>2016-02-15_新版个人网站.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-02-15,阔别一年,个人网站重新上线
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-02-21_新山灵魂画师.jpg" alt="2016-02-21_新山灵魂画师.jpg" width=" 40%"><figcaption>2016-02-21_新山灵魂画师.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-02-21,是的,我就是灵魂画师
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-02-22_她的生日.jpg" alt="2016-02-22_她的生日.jpg" width=" 40%"><figcaption>2016-02-22_她的生日.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-02-22,多了个2,少了个我做的蛋糕
</p>
</blockquote>
</div>
</div>
<div id="outline-container-sec-3" class="outline-2">
<h2 id="sec-3">三月·围棋</h2>
<div class="outline-text-2" id="text-3">
<p>
<div class="figure"><p><center><img src="2016-03-04_Written-Qualifying-Examination.jpg" alt="2016-03-04_Written-Qualifying-Examination.jpg" width=" 40%"><figcaption>2016-03-04_Written-Qualifying-Examination.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-03-04,博士第一次资格考试
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-03-07_围棋雪耻.jpg" alt="2016-03-07_围棋雪耻.jpg" width=" 40%"><figcaption>2016-03-07_围棋雪耻.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-03-07,我把GNU GO搞坏啦
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-03-08_USS半年卡.jpg" alt="2016-03-08_USS半年卡.jpg" width=" 40%"><figcaption>2016-03-08_USS半年卡.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-03-08,祭奠这位吃灰过多致死的同志,不是我!是卡
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-03-09_日偏食.jpg" alt="2016-03-09_日偏食.jpg" width=" 40%"><figcaption>2016-03-09_日偏食.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-03-09,打开日偏食的另一种方式,日月同辉
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-03-12_AlphaGo.jpg" alt="2016-03-12_AlphaGo.jpg" width=" 40%"><figcaption>2016-03-12_AlphaGo.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-03-12,人机大战,都以为谷歌是来送钱的,没想到是来要命的
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-03-14_IEEE-TAC-Submission.jpg" alt="2016-03-14_IEEE-TAC-Submission.jpg" width=" 40%"><figcaption>2016-03-14_IEEE-TAC-Submission.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-03-14,一波三折,终于把论文送审了
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-03-16_NestedPartition.jpg" alt="2016-03-16_NestedPartition.jpg" width=" 40%"><figcaption>2016-03-16_NestedPartition.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-03-16,算法的魅力
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-03-20_刁曼岛.jpg" alt="2016-03-20_刁曼岛.jpg" width=" 40%"><figcaption>2016-03-20_刁曼岛.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-03-20,那些年,我们一起举过的剪刀手
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-03-25_树搜素.jpg" alt="2016-03-25_树搜素.jpg" width=" 40%"><figcaption>2016-03-25_树搜素.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-03-25,一次成功,生命苦短,我用python
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-03-26_老板家聚会.jpg" alt="2016-03-26_老板家聚会.jpg" width=" 40%"><figcaption>2016-03-26_老板家聚会.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-03-26,大海航行靠舵手
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-03-28_MacBook背光灯.jpg" alt="2016-03-28_MacBook背光灯.jpg" width=" 40%"><figcaption>2016-03-28_MacBook背光灯.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-03-28,就是单纯的觉得好看
</p>
</blockquote>
</div>
</div>
<div id="outline-container-sec-4" class="outline-2">
<h2 id="sec-4">四月·约约约</h2>
<div class="outline-text-2" id="text-4">
<p>
<div class="figure"><p><center><img src="2016-04-05_画心.jpg" alt="2016-04-05_画心.jpg" width=" 40%"><figcaption>2016-04-05_画心.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-04-05,爱着你,像心跳难触摸;画着你,画不出你的骨骼
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-04-14_老板生日.jpg" alt="2016-04-14_老板生日.jpg" width=" 40%"><figcaption>2016-04-14_老板生日.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-04-14,为老板庆生
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-04-17_东海岸钓虾.jpg" alt="2016-04-17_东海岸钓虾.jpg" width=" 40%"><figcaption>2016-04-17_东海岸钓虾.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-04-17,偷虾,能算偷么
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-04-24_清华大学邀请函.jpg" alt="2016-04-24_清华大学邀请函.jpg" width=" 40%"><figcaption>2016-04-24_清华大学邀请函.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-04-24,混到清华邀请函一份
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-04-29_美国队长.jpg" alt="2016-04-29_美国队长.jpg" width=" 40%"><figcaption>2016-04-29_美国队长.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-04-29,调皮的小哥
</p>
</blockquote>
</div>
</div>
<div id="outline-container-sec-5" class="outline-2">
<h2 id="sec-5">五月·幸福</h2>
<div class="outline-text-2" id="text-5">
<p>
<div class="figure"><p><center><img src="2016-05-02_蚵仔面线.jpg" alt="2016-05-02_蚵仔面线.jpg" width=" 40%"><figcaption>2016-05-02_蚵仔面线.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-05-02,台湾美食好好吃啊
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-05-05_某人.jpg" alt="2016-05-05_某人.jpg" width=" 40%"><figcaption>2016-05-05_某人.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-05-05,形容某人,再贴切不过了
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-05-05_OQE报告.jpg" alt="2016-05-05_OQE报告.jpg" width=" 40%"><figcaption>2016-05-05_OQE报告.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-05-05,Finally Done,满打满算84页
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-05-09_海底捞.jpg" alt="2016-05-09_海底捞.jpg" width=" 40%"><figcaption>2016-05-09_海底捞.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-05-09,夜访海底捞,老年人也有夕阳红
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-05-13_芽茏田鸡粥榴莲.jpg" alt="2016-05-13_芽茏田鸡粥榴莲.jpg" width=" 40%"><figcaption>2016-05-13_芽茏田鸡粥榴莲.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-05-13,旺德福,Wonderful,以及田鸡粥
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-05-15_校际羽毛球比赛.jpg" alt="2016-05-15_校际羽毛球比赛.jpg" width=" 40%"><figcaption>2016-05-15_校际羽毛球比赛.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-05-15,闯进八强,是的,我只是替补
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-05-15_白神驾临新加坡.jpg" alt="2016-05-15_白神驾临新加坡.jpg" width=" 40%"><figcaption>2016-05-15_白神驾临新加坡.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-05-15,白神的白花蛇舌草水
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-05-16_送药.jpg" alt="2016-05-16_送药.jpg" width=" 40%"><figcaption>2016-05-16_送药.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-05-16,记得吃药,不过我还是喜欢藿香正气水
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-05-17_Oral-Qualifying-Examination.jpg" alt="2016-05-17_Oral-Qualifying-Examination.jpg" width=" 40%"><figcaption>2016-05-17_Oral-Qualifying-Examination.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-05-17,博士第二次资格考试
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-05-20_爱在NJU.jpg" alt="2016-05-20_爱在NJU.jpg" width=" 40%"><figcaption>2016-05-20_爱在NJU.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-05-20,南大首届集体婚礼,好羡慕,好想回南大
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-05-21_许留山.jpg" alt="2016-05-21_许留山.jpg" width=" 40%"><figcaption>2016-05-21_许留山.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-05-21,在一起,不留遗憾
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-05-22_新加坡空军基地.jpg" alt="2016-05-22_新加坡空军基地.jpg" width=" 40%"><figcaption>2016-05-22_新加坡空军基地.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-05-22,谢谢你忍着毒日陪我看飞行展
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-05-24_圣淘沙.jpg" alt="2016-05-24_圣淘沙.jpg" width=" 40%"><figcaption>2016-05-24_圣淘沙.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-05-24,一个聆听者的自我修养,我听你的
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-05-26_谢谢你.jpg" alt="2016-05-26_谢谢你.jpg" width=" 40%"><figcaption>2016-05-26_谢谢你.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-05-26,谢谢你,真的好感动
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-05-27_清华仿真优化研讨会.jpg" alt="2016-05-27_清华仿真优化研讨会.jpg" width=" 40%"><figcaption>2016-05-27_清华仿真优化研讨会.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-05-27,昨晚和同学聚太晚了,没怎么准备充分,讲的磕磕巴巴的
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-05-28_银杏大道.jpg" alt="2016-05-28_银杏大道.jpg" width=" 40%"><figcaption>2016-05-28_银杏大道.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-05-28,我来到,你的城市,走过你来时的路;想像着,没我的日子,你是怎样的孤独
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-05-29_谷歌.jpg" alt="2016-05-29_谷歌.jpg" width=" 40%"><figcaption>2016-05-29_谷歌.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-05-29,来北京的例行朝圣
</p>
</blockquote>
</div>
</div>
<div id="outline-container-sec-6" class="outline-2">
<h2 id="sec-6">六月·陪伴</h2>
<div class="outline-text-2" id="text-6">
<p>
<div class="figure"><p><center><img src="2016-06-01_我们三.jpg" alt="2016-06-01_我们三.jpg" width=" 40%"><figcaption>2016-06-01_我们三.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-06-01,相濡以沫
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-06-04_远志花.jpg" alt="2016-06-04_远志花.jpg" width=" 40%"><figcaption>2016-06-04_远志花.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-06-04,小时候的自己也是一个采花大盗
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-06-05_老门.jpg" alt="2016-06-05_老门.jpg" width=" 40%"><figcaption>2016-06-05_老门.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-06-05,多少年没走过这个门了,每每想起爷爷在门口等我就很开心
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-06-05_妈妈和我.jpg" alt="2016-06-05_妈妈和我.jpg" width=" 40%"><figcaption>2016-06-05_妈妈和我.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-06-05,妈妈和我
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-06-07_妹妹高考.jpg" alt="2016-06-07_妹妹高考.jpg" width=" 40%"><figcaption>2016-06-07_妹妹高考.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-06-07,表妹高考,两年前我也是在这里考砸的
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-06-10_我的初中.jpg" alt="2016-06-10_我的初中.jpg" width=" 40%"><figcaption>2016-06-10_我的初中.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-06-10,初中好多美好的回忆啊
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-06-12_意中人.jpg" alt="2016-06-12_意中人.jpg" width=" 40%"><figcaption>2016-06-12_意中人.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-06-12,我知道有一天她会在一个万众嘱目的情况下出现,身披金甲圣衣,脚踏七彩云来娶我!
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-06-18_油泼面.jpg" alt="2016-06-18_油泼面.jpg" width=" 40%"><figcaption>2016-06-18_油泼面.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-06-18,失败是成功之母
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-06-21_童话.jpg" alt="2016-06-21_童话.jpg" width=" 40%"><figcaption>2016-06-21_童话.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-06-21,你若不离,我便不弃
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-06-22_毕业两周年.jpg" alt="2016-06-22_毕业两周年.jpg" width=" 40%"><figcaption>2016-06-22_毕业两周年.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-06-22,两年了
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-06-23_虎豹别墅.jpg" alt="2016-06-23_虎豹别墅.jpg" width=" 40%"><figcaption>2016-06-23_虎豹别墅.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-06-23,没想到,你竟然是这样的虎豹别墅
</p>
</blockquote>
</div>
</div>
<div id="outline-container-sec-7" class="outline-2">
<h2 id="sec-7">七月·马六甲</h2>
<div class="outline-text-2" id="text-7">
<p>
<div class="figure"><p><center><img src="2016-07-02_冷泡茶.jpg" alt="2016-07-02_冷泡茶.jpg" width=" 40%"><figcaption>2016-07-02_冷泡茶.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-07-02,炎炎夏日,来杯冷泡茶
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-07-04_赔礼道歉.jpg" alt="2016-07-04_赔礼道歉.jpg" width=" 40%"><figcaption>2016-07-04_赔礼道歉.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-07-04,真是笑死我了
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-07-06_新加坡总统府.jpg" alt="2016-07-06_新加坡总统府.jpg" width=" 40%"><figcaption>2016-07-06_新加坡总统府.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-07-06,闹市中得一片宁静
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-07-14_白花蛇舌草水.jpg" alt="2016-07-14_白花蛇舌草水.jpg" width=" 40%"><figcaption>2016-07-14_白花蛇舌草水.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-07-14,夏天的味道
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-07-15_苏丹旧王宫.jpg" alt="2016-07-15_苏丹旧王宫.jpg" width=" 40%"><figcaption>2016-07-15_苏丹旧王宫.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-07-15,原来我也有死穴
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-07-15_这一大家子.jpg" alt="2016-07-15_这一大家子.jpg" width=" 40%"><figcaption>2016-07-15_这一大家子.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-07-15,我们这一大家子
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-07-19_白夜行.jpg" alt="2016-07-19_白夜行.jpg" width=" 40%"><figcaption>2016-07-19_白夜行.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-07-19,雷暴
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-07-19_小可爱.jpg" alt="2016-07-19_小可爱.jpg" width=" 40%"><figcaption>2016-07-19_小可爱.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-07-19,小可爱去马来西亚了
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-07-21_接机.jpg" alt="2016-07-21_接机.jpg" width=" 40%"><figcaption>2016-07-21_接机.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-07-21,小可爱回来了,才发现T1有两个出口
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-07-23_去马六甲.jpg" alt="2016-07-23_去马六甲.jpg" width=" 40%"><figcaption>2016-07-23_去马六甲.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-07-23,迟到的马六甲
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-07-24_红房子.jpg" alt="2016-07-24_红房子.jpg" width=" 40%"><figcaption>2016-07-24_红房子.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-07-24,小而精致的马六甲,真的很好玩!
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-07-25_方老师来新加坡.jpg" alt="2016-07-25_方老师来新加坡.jpg" width=" 40%"><figcaption>2016-07-25_方老师来新加坡.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-07-25,飞飞飞
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-07-26_妹子又要去马来了.jpg" alt="2016-07-26_妹子又要去马来了.jpg" width=" 40%"><figcaption>2016-07-26_妹子又要去马来了.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-07-26,妹子三进三出马来
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-07-27_乌打汉堡.jpg" alt="2016-07-27_乌打汉堡.jpg" width=" 40%"><figcaption>2016-07-27_乌打汉堡.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-07-27,好好吃的乌打
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-07-31_工程小聚.jpg" alt="2016-07-31_工程小聚.jpg" width=" 40%"><figcaption>2016-07-31_工程小聚.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-07-31,工程人在新加坡
</p>
</blockquote>
</div>
</div>
<div id="outline-container-sec-8" class="outline-2">
<h2 id="sec-8">八月·舍不得放不下</h2>
<div class="outline-text-2" id="text-8">
<p>
<div class="figure"><p><center><img src="2016-08-01_三叔公拉茶.jpg" alt="2016-08-01_三叔公拉茶.jpg" width=" 40%"><figcaption>2016-08-01_三叔公拉茶.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-08-01,忍不住,先偷喝啦
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-08-03_给妹子的离别礼物.jpg" alt="2016-08-03_给妹子的离别礼物.jpg" width=" 40%"><figcaption>2016-08-03_给妹子的离别礼物.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-08-03,想来想去,还是亲自做礼物记录我们的点滴比较好
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-08-04_走心的二维码.jpg" alt="2016-08-04_走心的二维码.jpg" width=" 40%"><figcaption>2016-08-04_走心的二维码.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-08-04,虽说扫不了,但真的是一格一线慢慢画出来的
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-08-05_明信片.jpg" alt="2016-08-05_明信片.jpg" width=" 40%"><figcaption>2016-08-05_明信片.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-08-05,大笨蛋!
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-08-05_Rochor.jpg" alt="2016-08-05_Rochor.jpg" width=" 40%"><figcaption>2016-08-05_Rochor.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-08-05,去滨海湾给她送交通卡
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-08-06_半年聚.jpg" alt="2016-08-06_半年聚.jpg" width=" 40%"><figcaption>2016-08-06_半年聚.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-08-06,今年组里真是聚了好多次啊
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-08-09_新加坡国庆.jpg" alt="2016-08-09_新加坡国庆.jpg" width=" 40%"><figcaption>2016-08-09_新加坡国庆.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-08-09,买一杯水的功夫,只看到了烟,并没看到火,然而水也没买到
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-08-11_问鼎珠穆朗玛峰.jpg" alt="2016-08-11_问鼎珠穆朗玛峰.jpg" width=" 40%"><figcaption>2016-08-11_问鼎珠穆朗玛峰.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-08-11,高处不胜寒
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-08-12_Google-Cardboard.jpg" alt="2016-08-12_Google-Cardboard.jpg" width=" 40%"><figcaption>2016-08-12_Google-Cardboard.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-08-12,试水虚拟现实
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-08-13_泰国象.jpg" alt="2016-08-13_泰国象.jpg" width=" 40%"><figcaption>2016-08-13_泰国象.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-08-13,妹子给我的粉红象
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-08-13_NUS校友日.jpg" alt="2016-08-13_NUS校友日.jpg" width=" 40%"><figcaption>2016-08-13_NUS校友日.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-08-13,功夫熊猫
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-08-14_裕华园.jpg" alt="2016-08-14_裕华园.jpg" width=" 40%"><figcaption>2016-08-14_裕华园.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-08-14,心心念的裕华园,满园子的pokemon
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-08-16_植物园.jpg" alt="2016-08-16_植物园.jpg" width=" 40%"><figcaption>2016-08-16_植物园.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-08-16,要有光
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-08-16_美人鱼.jpg" alt="2016-08-16_美人鱼.jpg" width=" 40%"><figcaption>2016-08-16_美人鱼.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-08-16,论可爱,我只服你
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-08-16_圣淘沙缆车.jpg" alt="2016-08-16_圣淘沙缆车.jpg" width=" 40%"><figcaption>2016-08-16_圣淘沙缆车.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-08-16,实在太高了,然总有刁民想害朕
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-08-18_第一次见面的地方.jpg" alt="2016-08-18_第一次见面的地方.jpg" width=" 40%"><figcaption>2016-08-18_第一次见面的地方.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-08-18,陪她在NUS的各个地标拍了照
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-08-22_她走了.jpg" alt="2016-08-22_她走了.jpg" width=" 40%"><figcaption>2016-08-22_她走了.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-08-22,这次是真的走了,远方的朋友
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-08-24_银杏大道.jpg" alt="2016-08-24_银杏大道.jpg" width=" 40%"><figcaption>2016-08-24_银杏大道.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-08-24,异国恋
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-08-27_阴郁的皮卡丘.jpg" alt="2016-08-27_阴郁的皮卡丘.jpg" width=" 40%"><figcaption>2016-08-27_阴郁的皮卡丘.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-08-27,还是卡通画适合我
</p>
</blockquote>
</div>
</div>
<div id="outline-container-sec-9" class="outline-2">
<h2 id="sec-9">九月·伤感</h2>
<div class="outline-text-2" id="text-9">
<p>
<div class="figure"><p><center><img src="2016-09-05_量化策略.jpg" alt="2016-09-05_量化策略.jpg" width=" 40%"><figcaption>2016-09-05_量化策略.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-09-05,厉害了,我的哥
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-09-06_LDMOCBA.jpg" alt="2016-09-06_LDMOCBA.jpg" width=" 40%"><figcaption>2016-09-06_LDMOCBA.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-09-06,等了大半年的审稿意见
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-09-07_未知的旅行.jpg" alt="2016-09-07_未知的旅行.jpg" width=" 40%"><figcaption>2016-09-07_未知的旅行.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-09-07,我要是会写抢单插件就好了
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-09-08_辣条.jpg" alt="2016-09-08_辣条.jpg" width=" 40%"><figcaption>2016-09-08_辣条.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-09-08,比卫龙的好吃,哈哈哈
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-09-11_伊丽莎白.jpg" alt="2016-09-11_伊丽莎白.jpg" width=" 40%"><figcaption>2016-09-11_伊丽莎白.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-09-11,伊丽莎白实在太逗了!
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-09-14_一块披萨引发的血案.jpg" alt="2016-09-14_一块披萨引发的血案.jpg" width=" 40%"><figcaption>2016-09-14_一块披萨引发的血案.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-09-14,吃饭不走路,走路不吃饭
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-09-15_中秋节.jpg" alt="2016-09-15_中秋节.jpg" width=" 40%"><figcaption>2016-09-15_中秋节.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-09-15,如日中天
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-09-28_离别.jpg" alt="2016-09-28_离别.jpg" width=" 40%"><figcaption>2016-09-28_离别.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-09-28,最后一张合照,你若安好,便是晴天,谢谢你
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-09-29_许久不见的老朋友.jpg" alt="2016-09-29_许久不见的老朋友.jpg" width=" 40%"><figcaption>2016-09-29_许久不见的老朋友.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-09-29,四五年未见的老朋友,还是老样子
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-09-30_香港好.jpg" alt="2016-09-30_香港好.jpg" width=" 40%"><figcaption>2016-09-30_香港好.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-09-30,在港科大的码头,和昶哥探讨学术
</p>
</blockquote>
</div>
</div>
<div id="outline-container-sec-10" class="outline-2">
<h2 id="sec-10">十月·再出发</h2>
<div class="outline-text-2" id="text-10">
<p>
<div class="figure"><p><center><img src="2016-10-01_爬山.jpg" alt="2016-10-01_爬山.jpg" width=" 40%"><figcaption>2016-10-01_爬山.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-10-01,啊,香港,你怎么都是山
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-10-02_昶哥.jpg" alt="2016-10-02_昶哥.jpg" width=" 40%"><figcaption>2016-10-02_昶哥.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-10-02,要向昶哥学习
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-10-03_舍友聚.jpg" alt="2016-10-03_舍友聚.jpg" width=" 40%"><figcaption>2016-10-03_舍友聚.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-10-03,晋家门,真是辛苦漾濞和来哥了
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-10-04_*卡朵*.jpg" alt="2016-10-04_*卡朵*.jpg" width=" 40%"><figcaption>2016-10-04_*卡朵*.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-10-04,也是两年多没见了,胡老师
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-10-05_李老师.jpg" alt="2016-10-05_李老师.jpg" width=" 40%"><figcaption>2016-10-05_李老师.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-10-05,学术生涯的启蒙人
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-10-06_南京.jpg" alt="2016-10-06_南京.jpg" width=" 40%"><figcaption>2016-10-06_南京.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-10-06,南京,如果你还记得我
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-10-07_郁同学.jpg" alt="2016-10-07_郁同学.jpg" width=" 40%"><figcaption>2016-10-07_郁同学.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-10-07,室友大婚,伴随着人人网的衰落,和郁同学的联系也越来越少了
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-10-08_孙同学.jpg" alt="2016-10-08_孙同学.jpg" width=" 40%"><figcaption>2016-10-08_孙同学.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-10-08,虽一面之缘,但也算是缘分了,谢谢你的坚持
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-10-13_伊斯塔纳艺术馆.jpg" alt="2016-10-13_伊斯塔纳艺术馆.jpg" width=" 40%"><figcaption>2016-10-13_伊斯塔纳艺术馆.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-10-13,向昶哥学习,尝试生活的各种可能性
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-10-14_Codeforces模拟赛.jpg" alt="2016-10-14_Codeforces模拟赛.jpg" width=" 40%"><figcaption>2016-10-14_Codeforces模拟赛.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-10-14,高二接触信息学竞赛,一直忘不掉其中的乐趣
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-10-24_刷题.jpg" alt="2016-10-24_刷题.jpg" width=" 40%"><figcaption>2016-10-24_刷题.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-10-24,这些年刷题的记录,可视化了下,加了激励制度;哈哈哈,满屏幕的水题
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-10-28_苹果婊.jpg" alt="2016-10-28_苹果婊.jpg" width=" 40%"><figcaption>2016-10-28_苹果婊.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-10-28,到明年,真的可以说,我去年买了个表
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-10-30_南部山脊徒步.jpg" alt="2016-10-30_南部山脊徒步.jpg" width=" 40%"><figcaption>2016-10-30_南部山脊徒步.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-10-30,保持130的心率
</p>
</blockquote>
</div>
</div>
<div id="outline-container-sec-11" class="outline-2">
<h2 id="sec-11">十一月·寂寞</h2>
<div class="outline-text-2" id="text-11">
<p>
<div class="figure"><p><center><img src="2016-11-03_银魂.jpg" alt="2016-11-03_银魂.jpg" width=" 40%"><figcaption>2016-11-03_银魂.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-11-03,用Air Video搭了服务器,再也不用担心看不了银魂啦
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-11-04_USB电扇.jpg" alt="2016-11-04_USB电扇.jpg" width=" 40%"><figcaption>2016-11-04_USB电扇.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-11-04,超级好用!!!周末再也没有借口,不来学习啦
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-11-06_金师弟.jpg" alt="2016-11-06_金师弟.jpg" width=" 40%"><figcaption>2016-11-06_金师弟.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-11-06,真是看的眼花缭乱
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-11-17_疆界.jpg" alt="2016-11-17_疆界.jpg" width=" 40%"><figcaption>2016-11-17_疆界.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-11-17,脑洞大开,假如人被枚举完了怎么办?
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-11-22_师姐答辩.JPG" alt="2016-11-22_师姐答辩.JPG" width=" 40%"><figcaption>2016-11-22_师姐答辩.JPG</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-11-22,亲师姐要毕业了
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-11-29_NVIDIA.PNG" alt="2016-11-29_NVIDIA.PNG" width=" 40%"><figcaption>2016-11-29_NVIDIA.PNG</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-11-29,好开心,被NVIDIA相上了
</p>
</blockquote>
</div>
</div>
<div id="outline-container-sec-12" class="outline-2">
<h2 id="sec-12">十二月·磕盐</h2>
<div class="outline-text-2" id="text-12">
<p>
<div class="figure"><p><center><img src="2016-12-05_利器.JPG" alt="2016-12-05_利器.JPG" width=" 40%"><figcaption>2016-12-05_利器.JPG</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-12-05,利器社群计划的文章上头条啦
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-12-07_大蚊子.JPG" alt="2016-12-07_大蚊子.JPG" width=" 40%"><figcaption>2016-12-07_大蚊子.JPG</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-12-07,据说是上古的蚊子
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-12-19_岁岁平安.JPG" alt="2016-12-19_岁岁平安.JPG" width=" 40%"><figcaption>2016-12-19_岁岁平安.JPG</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-12-19,碎碎平安,碎碎平安
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-12-20_USS.JPG" alt="2016-12-20_USS.JPG" width=" 40%"><figcaption>2016-12-20_USS.JPG</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-12-20,榨干它最后的价值,不过依然不敢做过山车
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-12-21_敏姐.JPG" alt="2016-12-21_敏姐.JPG" width=" 40%"><figcaption>2016-12-21_敏姐.JPG</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-12-21,敏姐要回国工作了,时间过得好快
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-12-21_尸首两处.JPG" alt="2016-12-21_尸首两处.JPG" width=" 40%"><figcaption>2016-12-21_尸首两处.JPG</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-12-21,陪伴我两年半的水壶,就这样没了,好伤心啊
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-12-22_本命年.JPG" alt="2016-12-22_本命年.JPG" width=" 40%"><figcaption>2016-12-22_本命年.JPG</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-12-22,24岁生日,不知道路在何方
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-12-22_香蕉奶昔.JPG" alt="2016-12-22_香蕉奶昔.JPG" width=" 40%"><figcaption>2016-12-22_香蕉奶昔.JPG</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-12-22,简单易做,超级好喝!!
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-12-24_一个人在实验室.JPG" alt="2016-12-24_一个人在实验室.JPG" width=" 40%"><figcaption>2016-12-24_一个人在实验室.JPG</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-12-24,肆无忌惮得开外放
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-12-25_圣淘沙水上探险乐园.JPG" alt="2016-12-25_圣淘沙水上探险乐园.JPG" width=" 40%"><figcaption>2016-12-25_圣淘沙水上探险乐园.JPG</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-12-25,跳水还是蛮危险的,真的跟跳楼一样,说得我好像跳过
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-12-29_机器学习小组.JPG" alt="2016-12-29_机器学习小组.JPG" width=" 40%"><figcaption>2016-12-29_机器学习小组.JPG</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-12-29,这一夜,我们说机器学习
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-12-30_Codeforces-GoodBye2016.jpg" alt="2016-12-30_Codeforces-GoodBye2016.jpg" width=" 40%"><figcaption>2016-12-30_Codeforces-GoodBye2016.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-12-30,第一次参加Codeforces年终赛
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-12-31_Legendary-Master.jpg" alt="2016-12-31_Legendary-Master.jpg" width=" 40%"><figcaption>2016-12-31_Legendary-Master.jpg</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-12-31,白日梦成真,希望若干年后不再是白日梦,Legendary Master我来啦
</p>
</blockquote>
<p>
<div class="figure"><p><center><img src="2016-12-31_叶子家包饺子.JPG" alt="2016-12-31_叶子家包饺子.JPG" width=" 40%"><figcaption>2016-12-31_叶子家包饺子.JPG</figcaption></center></p></div>
</p>
<blockquote>
<p>
2016-12-31,自己动手,丰衣足食,速冻猪肉,哈哈哈哈
</p>
</blockquote>
</div>
</div>
我的2016年总结
深度增强学习【2】从多臂赌博机问题到蒙特卡洛树搜索
http://blog.greenwicher.com/2016/12/24/drl-from_mab_to_mcts/
2016-12-24T00:00:00.000Z
2017-01-15T03:31:24.000Z
<p>
有的人苦于没有选择可选,只能一条路走到黑;而有的人选择过多、权衡过多,反而无从下手,相当于没做选择。约束太多有约束太多的烦恼,太过自由有太过自由的烦恼,这也算是一种 <a href="http://wiki.mbalib.com/wiki/%E8%B5%84%E6%BA%90%E8%AF%85%E5%92%92" target="_blank" rel="external">资源诅咒</a> 吧。 <b>然而面对选择困难症,到底有没有灵丹妙药来解决它。科学家说,必须有!</b> 先来考虑一个问题,某天你走了狗屎运天上掉下了1000块钱,你觉得自己的运气正旺,而且反正是不义之财,不如去赌场来以小博大。赚了算自己的,赔了就当没捡过这钱。你兴冲冲的跑去了赌场去玩老虎机,然而到了赌场却傻了眼,竟然有200台老虎机!随便选一个老虎机可不行,因为你听人说过有的老虎机赢率比较高,有的比较低。那么问题来了,给定这1000块钱,假定玩一次老虎机要支付1块钱,那么应该玩哪些老虎机、以怎样的顺序去玩才能使得自己的累积收益最大?在 <a href="http://blog.greenwicher.com/2016/12/18/drl-general_ai-intro/">上篇深度增强学习系列文章</a>, 我们讲到了Alpha Go中的两个关键技术:深度学习和增强学习。 <b>本文将首先介绍 <code>多臂赌博机问题</code> (<a href="https://en.wikipedia.org/wiki/Multi-armed_bandit" target="_blank" rel="external">Multi-armed Bandit Problem</a>),然后基于此,介绍Alpha Go的另一项核心技术,即 <code>蒙特卡洛树搜索</code> (<a href="https://en.wikipedia.org/wiki/Monte_Carlo_tree_search" target="_blank" rel="external">Monte Carlo Tree Search</a>),最后会简要介绍我的研究方向 <code>仿真优化</code> (<a href="https://en.wikipedia.org/wiki/Simulation-based_optimization" target="_blank" rel="external">Simulation Optimization</a>)同这些领域的关系。</b>
</p>
<a id="more"></a>
<div id="outline-container-sec-1" class="outline-2">
<h2 id="sec-1">多臂赌博机问题</h2>
<div class="outline-text-2" id="text-1">
</div><div id="outline-container-sec-1-1" class="outline-3">
<h3 id="sec-1-1">问题描述</h3>
<div class="outline-text-3" id="text-1-1">
<blockquote>
<p>
In probability theory, the multi-armed bandit problem (sometimes called the K- or N-armed bandit problem) is a problem in which a gambler at a row of slot machines (sometimes known as "one-armed bandits") has to decide which machines to play, how many times to play each machine and in which order to play them. When played, each machine provides a random reward from a probability distribution specific to that machine. The objective of the gambler is to maximize the sum of rewards earned through a sequence of lever pulls. –Wiki
</p>
</blockquote>
<p>
给定 \(K\) 个老虎机,每玩一台老虎机,在损失一次机会的同时我们以一定的概率收到报酬。假定第 \(i = 1, 2, 3, \dotsc K\) 个老虎机给我们报酬 \(r \in \mathbb{R}\) 的概率是 \(P_{i}(r)\) ,且报酬的均值为 \(h_{i}\) 。那么决策便是,给定有限的机会次数 \(T\) ,如何玩这些老虎机才能使得期望累积收益最大化。记第 \(t\) 轮,老虎机给我们的报酬为 \(r_{t}\) ,那么至少有三种方式来刻画这个期望累积收益函数
</p>
<ul class="org-ul">
<li>\(T\) 步累积奖赏: \(E[\frac{1}{T} \sum_{t=1}^{T} r_{t}]\)
</li>
<li>\(\gamma\) 折现累积奖赏: \(E[\sum_{t=0}^{T-1} \gamma^{t} r_{t+1}]\)
</li>
<li>累积遗憾: \(Th^{*} - E[\sum_{t=1}^{T} r_{t}]\) ,其中 \(h^{*} = \max_{i=1,2,3,\dotsc,K} h_{i}\)
</li>
</ul>
<p>
<div class="figure"><p><center><img src="Las_Vegas_slot_machines.jpg" alt="Las_Vegas_slot_machines.jpg" width=" 80%"><figcaption>Las_Vegas_slot_machines.jpg</figcaption></center></p></div>
<b>可以看到多臂赌博机问题其实是一个很宽泛的框架,能够应用到各种 <code>排序选择问题</code> (<a href="http://castlelab.princeton.edu/ORF544/Readings/OptimalLearning_Chapter4.pdf" target="_blank" rel="external">Ranking & Selection</a>)上。</b> 比如说新药的研发需要临床检验,那么给定多款新药以及一批受试者,如何利用有限的机会选择出效果最好的新药并减轻对受试者不必要的副作用;再比如说商家在互联网上投放广告,那么给定几款广告设计方案,如何展示这些不同的广告给不同的网民,以致能够尽快的最大化利润并且不流失顾客。后一个例子最简单的情况就是 <code>A/B 测试</code> ,<a href="https://support.google.com/analytics/answer/2844870?hl=zh-Hans" target="_blank" rel="external">这篇文章</a> 详细描述了Google Analytics内容实验背后的统计引擎,即多臂赌博机实验。国外也有一些初创公司在试图利用多臂赌博机问题的思想来优化企业的收益管理问题,比如说<a href="https://www.optimizely.com/" target="_blank" rel="external">Optimizely</a> ,以及国内的 <a href="http://www.appadhoc.com/" target="_blank" rel="external">吆喝科技</a>。
</p>
</div>
</div>
<div id="outline-container-sec-1-2" class="outline-3">
<h3 id="sec-1-2">探索(Exploration)vs 利用(Exploitation)</h3>
<div class="outline-text-3" id="text-1-2">
<p>
如果我们有先知的本领,那么为了最大化期望累积收益,每一次选择报酬均值 \(h_{i}\) 最大的那个老虎机就好了。 <b>然而,正因为信息的缺乏,我们需要通过手上的资源来逐步获取信息。</b>
</p>
<p>
先考虑一种极端的方式,那就是均匀的玩每台老虎机,这样可以保证对每台老虎机的收益情况我们都能足够了解。然而,这往往会浪费不必要的资源在太差的老虎机上,就像无头苍蝇一样。这种策略被称之为 <code>探索</code> (exploration),很显然如果信息太过于匮乏的话,这种策略不失为一种好方法。
</p>
<p>
再考虑另一个极端的方式,那就是只玩当前给我们收益报酬最高的那台老虎机,显然这一策略可以在初期较快的获得更高的回报,然而却因为过度贪婪捡了芝麻丢了西瓜,以至于长远错过真正好的老虎机,就像辛勤的蜜蜂一样。这种策略被称之为 <code>利用</code> (exploitation),很显然如果信息足够充分的话,这种策略不失为一种好方法。
</p>
<p>
最好的策略显然不是这二者之一,中和这两种截然矛盾的资源分配策略可以给我们更好的思路。比如说,前期信息匮乏,我们采用更多的探索;而后期,信息了解差不多后,我们转向利用,诸如高中生以及博士生的关系。再比如说,再边利用的同时也进行探索,诸如Google的传统部门以及Google X之间的关系。 <b>但这里值得一提的是,如果问题规模过大,比如说资源的数量不足以支撑探索尽量多的信息,那么反而利用是一种更『现实』的策略。</b> 金融危机之后,经常有人说
</p>
<blockquote>
<p>
大而不能倒。Too big to fail.
</p>
</blockquote>
<p>
虽然这句话的本意是为避免大公司的倒闭而引发系统性风险,政府不能坐视不管。但让我们从创新的角度来重新看这个问题,很多知名的初创公司就像一只独角兽,因为它代表一种[相对]罕见的新事物;而大公司呢,估计就是骆驼了吧,虽说瘦死的骆驼比马大,并且骆驼凭借自己积累的驼峰便足以让他在沙漠当中生存,但受限于自己的优势反而不能开拓新的疆界。正如万维钢老师说的,<a href="http://www.geekonomics10000.com/291" target="_blank" rel="external">『创新是落后者的特权』</a> 。
</p>
</div>
</div>
<div id="outline-container-sec-1-3" class="outline-3">
<h3 id="sec-1-3">基本算法</h3>
<div class="outline-text-3" id="text-1-3">
<p>
具体的算法实施请见<a href="https://github.com/Greenwicher/Awsome-Project/tree/master/IE5504%20Systems%20Modeling%20and%20Advanced%20Simulation" target="_blank" rel="external">我的Github</a> 或者 <a href="https://book.douban.com/subject/20112875/" target="_blank" rel="external">Bandit Algorithms for Website Optimization</a> 这本书,下文只是简要叙述每种算法的思路。如日后有时间,再将各自的代码补上。值得一提的是,该领域主要的理论在于求解累积遗憾的上下界。
</p>
</div>
<div id="outline-container-sec-1-3-1" class="outline-4">
<h4 id="sec-1-3-1">\(\epsilon-\) greedy算法</h4>
<div class="outline-text-4" id="text-1-3-1">
<p>
顾名思义,就是每次选择老虎机的时候,以 \(\epsilon\) 的概率进行exploration,然后以 \(1 - \epsilon\) 的概率进行exploitation。值得注意的是,exploitation和exploration的比例可以通过动态的调整 \(\epsilon\) 来实现,比如说让 \(\epsilon = 1 / \sqrt{t}\) ,这样在算法初期将主要进行exploration,而在算法后期进行exploitation,这样的处理思路也比较符合直觉。
</p>
</div>
</div>
<div id="outline-container-sec-1-3-2" class="outline-4">
<h4 id="sec-1-3-2">Softmax算法</h4>
<div class="outline-text-4" id="text-1-3-2">
<p>
这一算法是基于Softmax distribution<sup><a id="fnr.1" name="fnr.1" class="footref" href="#fn.1">1</a></sup>来选择老虎机的,值得一提的是Softmax distribution可谓在机器学习里随处可见,比如说神经网络的输出层,Logistic Regression以及模拟退火算法,个人感觉是因为softmax distribution实际上和矩母函数的关系非常紧密,另外也算是对max函数的光滑处理吧<sup><a id="fnr.2" name="fnr.2" class="footref" href="#fn.2">2</a></sup>,最后最直观是这是一个multi-choice model(因而在经济管理领域也有应用)。总而言之,我们选择老虎机 \(i\) 的概率服从Softmax分布,
$$ P(\mbox{select arm } i) = \frac{\exp(\bar{h_{i}} / \tau)}{ \sum_{j=1}^{K} \exp(\bar{h_{j}} / \tau)}$$
这里的 \(\tau > 0\) 类似于模拟退火中的温度参数,若 \(\tau \to 0\) ,那么将只选择最好的那个,也就是exploitation;反之,若 \(\tau \to +\infty\) ,那么将均匀的选取老虎机,也就是exploration。类似的,我们对参数 \(\tau\) 也可以进行退火处理(温度逐渐的降低),即 \(\tau = 1 / \sqrt{t}\) 。另外,关于均值的计算,可以采用当前观测值以及上一期的均值来进行增量计算,这样可以减少重复计算。
</p>
</div>
</div>
<div id="outline-container-sec-1-3-3" class="outline-4">
<h4 id="sec-1-3-3">Bayes Bandit算法</h4>
<div class="outline-text-4" id="text-1-3-3">
<p>
这一算法的基本思路是给定老虎机收益的先验分布,然后通过该分布来决定玩哪个老虎机,收集到信息之后再更新后验分布。为了保持先验分布和后验分布的形式一致,往往需要 <code>共轭分布</code> (<a href="https://en.wikipedia.org/wiki/Conjugate_prior" target="_blank" rel="external">Conjugate Distribution</a>)的帮助。比如说各个老虎机的回报服从伯努利分布,为了估计伯努利分布的参数,起初我们假设该参数均匀分布在[0,1]之间,然后其共轭分布便是beta分布,并且在更新的过程中,总是保持beta分布的形式,只是相应的参数有所变化。
</p>
</div>
</div>
<div id="outline-container-sec-1-3-4" class="outline-4">
<h4 id="sec-1-3-4">Upper Confidence Bound算法</h4>
<div class="outline-text-4" id="text-1-3-4">
<p>
这一算法不同于上面的三个算法,每次选择老虎机依据的标准是确定的,即上置信值(Upper Confidence Bound Value),即老虎机给我们回报的置信区间上界值。具体而言,老虎机 \(i\) 在第 \(t\) 轮的这一值通过如下公式进行计算,
$$ \mbox{ucb(i)} = \bar{h_{i}(t)} + c \sqrt{\frac{\log t}{n_{i}(t)}} $$
其中 \(h_{i}(t)\) 和 \(n_{i}(t)\) 是老虎机 \(i\) 在第 \(t\) 轮的样本均值以及观测次数, \(c\) 决定了置信概率。然后在每一轮,选择上置信值最大的老虎机去玩就可以了。
</p>
</div>
</div>
<div id="outline-container-sec-1-3-5" class="outline-4">
<h4 id="sec-1-3-5">其他算法</h4>
<div class="outline-text-4" id="text-1-3-5">
<ul class="org-ul">
<li>Exp3 / Exp4: <a href="https://cseweb.ucsd.edu/~yfreund/papers/bandits.pdf" target="_blank" rel="external">The Nonstochastic Multiarmed Bandit Prolem</a>
</li>
<li>Knowledge Gradient: <a href="http://epubs.siam.org/doi/abs/10.1137/070693424" target="_blank" rel="external">A knowledge-gradient policy for sequential information collection</a>
</li>
<li>Randomized Probability Matching: <a href="http://www.economics.uci.edu/~ivan/asmb.874.pdf" target="_blank" rel="external">A modern Bayesian look at the multiarmed bandit</a>
</li>
<li>Thompson Sampling: <a href="http://www.research.rutgers.edu/~lihong/pub/Chapelle12Empirical.pdf" target="_blank" rel="external">An Empirical Evaluation of Thompson Sampling</a>
</li>
<li>Gittins Index: <a href="https://people.eecs.berkeley.edu/~russell/classes/cs294/s11/readings/Gittins:1979.pdf" target="_blank" rel="external">Bandit Processes and Dynamic Allocation Indices</a>
</li>
</ul>
</div>
</div>
</div>
<div id="outline-container-sec-1-4" class="outline-3">
<h3 id="sec-1-4">Demo展示</h3>
<div class="outline-text-3" id="text-1-4">
<p>
下面的幻灯片是我博一的时候,在IE5504 Systems Modeling and Adcanced Simulation上做的展示,分析比较了UCB算法、Bayes Bandit算法以及OCBA算法在解决Bernoulli Bandit问题上的差异。具体的程序代码以及文档,请见 <a href="https://github.com/Greenwicher/Awsome-Project/tree/master/IE5504%20Systems%20Modeling%20and%20Advanced%20Simulation" target="_blank" rel="external">我的Github</a>。
</p>
<center><embed src="IE5504.pdf" width="600" height="600"></center>
</div>
</div>
</div>
<div id="outline-container-sec-2" class="outline-2">
<h2 id="sec-2">蒙特卡洛树搜索</h2>
<div class="outline-text-2" id="text-2">
</div><div id="outline-container-sec-2-1" class="outline-3">
<h3 id="sec-2-1">问题描述</h3>
<div class="outline-text-3" id="text-2-1">
<blockquote>
<p>
Monte Carlo Tree Search (MCTS) is a method for making optimal decisions in artificial intelligence (AI) problems, typically move planning in combinatorial games. MCTS combines the generality of random simulation with the precision of tree search.
</p>
<p>
John von Neumann's 1928 minimax theorem paved the way for adversarial tree search methods that have formed the basis of decision making in computer science and AI almost since their inception. Monte Carlo methods were later formalised in the 1940s as a way to approach less well-defined problems unsuitable for tree search through the use of random sampling. Rémi Coulomb combined these two ideas in 2006 to provide a new approach for move planning in Go now known as MCTS.
</p>
<p>
Research interest in MCTS has risen sharply due to its spectacular success with computer Go and potential application to a number of other difficult problems. Its application extends beyond games, and MCTS can theoretically be applied to any domain that can be described in terms of {state, action} pairs and simulation used to forecast outcomes.
</p>
<p>
– <a href="http://www.cameronius.com/research/mcts/about/index.html" target="_blank" rel="external">http://www.cameronius.com/research/mcts/about/index.html</a>
</p>
</blockquote>
<p>
如果说多臂赌博机问题被看做 <code>单步强化学习任务</code> (只用一步决策玩哪个老虎机,然后就收到回报),那么蒙特卡洛树搜索可以看做是解决 <code>多步强化学习任务</code> 的工具。 <b><code>树</code> 是一种天然的用来刻画或者存储多步决策的数据结构。正如所有的动态规划问题可以被转化为图搜索<sup><a id="fnr.3" name="fnr.3" class="footref" href="#fn.3">3</a></sup>,而所有的线性规划问题可以被转化为二分图<sup><a id="fnr.4" name="fnr.4" class="footref" href="#fn.4">4</a></sup>一样。</b> 在树上进行搜索再常见不过了,利用树进行仿真其实也没那么不常见,学金融的同学势必都曾利用过二叉树来为各类奇异期权进行定价。至于蒙特卡洛树搜索,实际上可以分为两步
</p>
<ul class="org-ul">
<li>利用树结构来重新表达决策问题
</li>
<li>利用蒙特卡洛方法来进行搜索
</li>
</ul>
<p>
下面将简要的介绍这两个方面。
</p>
</div>
</div>
<div id="outline-container-sec-2-2" class="outline-3">
<h3 id="sec-2-2">决策树结构</h3>
<div class="outline-text-3" id="text-2-2">
<p>
对于多步强化学习任务而言,我们做完一个决策之后,将依据该决策和导致的新状态来决定我们下一步的决策集合。因此给定一条决策路径,我们站在当前的决策节点上,之后的所有决策可以形成一棵子树。任意一条从根节点到叶结点的路径变形成了一个完整的决策,当我们做完最终的决策,将得到一定的回报,正如下图所示。
<div class="figure"><p><center><img src="Decision_Tree.jpg" alt="Decision_Tree.jpg" width=" 80%"><figcaption>Decision_Tree.jpg</figcaption></center></p></div>
</p>
</div>
</div>
<div id="outline-container-sec-2-3" class="outline-3">
<h3 id="sec-2-3">蒙特卡洛方法</h3>
<div class="outline-text-3" id="text-2-3">
<p>
蒙特卡洛方法是一种基于仿真或者说采样来获取信息的方法。给定决策树结构,假想我们站在某个节点上,接下来有 \(K\) 个选择,那么我们应该选择哪一个?实际上,从这 \(K\) 个选择中给定任意一个,其之后的决策构成了一棵子树,我们都可以利用蒙特卡洛方法来对这课树的所有路径进行随机抽样(Simulation),根据得到的样本均值来评估这个子树的根节点选择,并且将得到的信息传递给所有的父节点(Backpropagation)。然后确定好下一步的选择之后(Selection),我们将继续基于该选择来展开未来的选择集合(Expansion)。下图是经典的蒙特卡洛树搜索概念图,
<div class="figure"><p><center><img src="Monte_Carlo_Tree_Search_Idea.png" alt="Monte_Carlo_Tree_Search_Idea.png" width=" 80%"><figcaption>Monte_Carlo_Tree_Search_Idea.png</figcaption></center></p></div>
</p>
<p>
简而言之,从这 \(K\) 个选择中进行抉择实际上可以转化成一个多臂赌博机问题。比如说,最著名的Upper Confidence Bound 1 applied to trees (UCT)算法。 <b>好玩的是,我们甚至可以利用蒙特卡洛树搜索来搜索更优秀的蒙特卡洛树搜索<sup><a id="fnr.5" name="fnr.5" class="footref" href="#fn.5">5</a></sup>,这浓浓的自指味道实在让人惊叹!</b>
</p>
</div>
</div>
<div id="outline-container-sec-2-4" class="outline-3">
<h3 id="sec-2-4">Demo展示</h3>
<div class="outline-text-3" id="text-2-4">
<p>
说起来也蛮幸运的,感觉冥冥之中自有力量。博一上学期在IVLE里不断搜自己想要上什么课。后来发现计算机系开了一门CS5330 Randomized Algorithms,但苦于找不到具体的授课大纲,于是给授课老师发了邮件,大致了解了这门课的内容。后来发现这门课虽然叫Randomized Algorithms,但其核心内容还是多臂赌博机问题以及延伸过去的蒙特卡洛树搜索,关于各种概率不等式以及上下界的介绍相对较少。了解了相应内容后,发现和自己的研究方向还蛮相关的(当然了,后来发现其授课内容其实算是online learning),于是就选了这门课。
</p>
<p>
那以下的幻灯片就是我在这门课上的大作业展示,描述了如何利用蒙特卡洛树搜索来解决一个图染色的组合优化问题。具体而言,给定一个无向图和一串红蓝相间的颜色序列,初始给一个节点按照颜色序列的顺序给其染色。接下来,我们可以给未染色并且是已染色点的相连点进行染色,并且必须按照颜色序列的顺序染色。如果颜色序列用尽或者所有的点都被染上色,那么任务结束。最终的收益为连接两个不同颜色点(已染色)的边的数量,并且越大越好。
</p>
<p>
值得一提的是,我的代码基于<a href="https://arxiv.org/abs/1208.4692" target="_blank" rel="external">Monte Carlo Search Algorithm Discovery for One Player Games</a>这篇文章,给出了实现蒙特卡洛树搜索的通用框架。也就是基于这个框架,可以很简单的构造出任意类型的蒙特卡洛树搜索算法,也就是从某种程度上说,可以用算法来生成算法(将代码作为数据,或者说一切都是对象,函数式编程的思想)。具体而言,我对比了Reflexive Monte Carlo搜索算法、Nested Monte Carlo搜索算法以及著名的Upper Confidence Bound 1 applied to trees搜索算法。
</p>
<p>
关于这个组合优化问题,当时课上同学有两个思路让我记忆犹深:
</p>
<ul class="org-ul">
<li>有人用Wolfram Mathematica可视化了不同数据集的无向图,基于此来找规律,有点类似于领域知识的探索
</li>
<li>有人没用蒙特卡洛树搜索,而是用了贪心算法,考虑到有的无向图规模太大,反而取得了不错的成绩
</li>
</ul>
<p>
具体的程序代码以及文档,请见<a href="https://github.com/Greenwicher/Awsome-Project/tree/master/CS5330%20Randomized%20Algorithms" target="_blank" rel="external">我的Github</a>。
</p>
<center><embed src="CS5330.pdf" width="600" height="600"></center>
</div>
</div>
</div>
<div id="outline-container-sec-3" class="outline-2">
<h2 id="sec-3">作为同构的仿真优化</h2>
<div class="outline-text-2" id="text-3">
<p>
类似的问题在运筹学/管理科学领域被称之为 <a href="https://en.wikipedia.org/wiki/Simulation-based_optimization" target="_blank" rel="external">仿真优化</a> 。简而言之,就是如何利用高效的仿真来解决随机优化问题。常见的分类包括
</p>
<ul class="org-ul">
<li>Ranking & Selection
</li>
<li>Discrete Optimization via Simulation (Heuristic methods / Random Search)
</li>
<li>Response Surface Methodology
</li>
<li>Stochastic Approximation
</li>
<li>Sample Average Approximation
</li>
<li>Stochastic Gradient Estimation
</li>
<li>Variance Reduction Techniques
</li>
</ul>
<p>
更多详细的介绍请见<a href="http://www.springer.com/us/book/9781493913831" target="_blank" rel="external">Handbook of Simulation Optimization</a>。下面将大概介绍Ranking & Selection以及Discrete Optimization via Simulation,同多臂赌博机问题以及蒙特卡洛树搜索之间的同构关系以及差异。
</p>
</div>
<div id="outline-container-sec-3-1" class="outline-3">
<h3 id="sec-3-1">Ranking & Selection</h3>
<div class="outline-text-3" id="text-3-1">
<p>
类似于多臂赌博机问题,都是给定有限个选择,一般数量不多,但每个选择的仿真时间相当长,因而需要合理的分配仿真资源;不同的是多臂赌博机问题更在乎累积收益,而Ranking & Selection主要是要尽量以高概率找到最好的选择出来,并不在乎仿真过程中的收益或损失。因此,在Ranking & Selection这个领域,主要的目标是如何通过分配仿真资源(即怎么玩老虎机),以使得最终选出最好老虎机的概率最大。这个概率被称之为 <code>Probability of Correct Selection</code> 。下图是一个简要的文献文类,我目前在做的主要是OCBA这一块。
<div class="figure"><p><center><img src="Ranking_Selection_Literature.png" alt="Ranking_Selection_Literature.png" width=" 80%"><figcaption>Ranking_Selection_Literature.png</figcaption></center></p></div>
OCBA的核心思路是利用信噪比来分配仿真资源,即仿真资源应该尽可能的分配给噪声大(比如样本方差)的选择以及信号比较强烈(同当前最优选择比较接近)的选择。可以看到从多臂赌博机问题的角度出发,OCBA相对更倾向于exploration,因为其目的只是关心『最终』能选择出最好的选择,而不在乎每次仿真得到的收益。
</p>
</div>
</div>
<div id="outline-container-sec-3-2" class="outline-3">
<h3 id="sec-3-2">Discrete Optimization via Simulation</h3>
<div class="outline-text-3" id="text-3-2">
<p>
这一问题相对Ranking & Selection,一般是选择数量过多,然而针对每一个选择的仿真时间很短,因此重点在于如何进行搜索。下图给出了这一领域的文献分类,
<div class="figure"><p><center><img src="Discrete_Optimization_via_Simulation_Literature.png" alt="Discrete_Optimization_via_Simulation_Literature.png" width=" 80%"><figcaption>Discrete_Optimization_via_Simulation_Literature.png</figcaption></center></p></div>
类似于蒙特卡洛树搜索的算法在该领域称之为Nested Partition或者Partition-based Random Search,即给定一个高维实数域上的连续搜索空间,通过不断的对搜索空间进行细分形成树状结构进行有偏采样(biased sampling)。具体可参考侍乐媛老师的文章,<a href="http://pubsonline.informs.org/doi/abs/10.1287/opre.48.3.390.12436?journalCode=opre" target="_blank" rel="external">Nested Partitions Method for Global Optimization</a>。下图是目前我正在做的利用Partition-based Random Search来解决多目标随机优化问题的一个例子。
<div class="figure"><p><center><img src="FON_Deterministic.png" alt="FON_Deterministic.png" width=" 80%"><figcaption>FON_Deterministic.png</figcaption></center></p></div>
</p>
</div>
</div>
</div>
<div id="outline-container-sec-4" class="outline-2">
<h2 id="sec-4">结语</h2>
<div class="outline-text-2" id="text-4">
<p>
虽然,看完本文章,该选择困难的你还是继续『选择『选择『困哪』』』,毕竟哪有那么多资源去一一尝试,那就贪心一点吧,执念于当前最好的,就行啦!少即是多,无即是有,做一个极简主义者,断舍离!
</p>
</div>
</div>
<div id="outline-container-sec-5" class="outline-2">
<h2 id="sec-5">关于【深度增强学习】系列的说明</h2>
<div class="outline-text-2" id="text-5">
<p>
<div class="alert alert-info"><i class="fa fa-info"></i> 对于我自己而言,写【深度增强学习】这一系列文章,除了自己的兴趣之外,其实增强学习和我的研究方向(仿真优化)也略微相关,希望能从中获取些新知识和新想法。初步打算本系列文章以<a href="http://www0.cs.ucl.ac.uk/staff/d.silver/web/Teaching.html" target="_blank" rel="external">David Silver的公开课</a> 以及 <a href="http://rll.berkeley.edu/deeprlcourse/" target="_blank" rel="external">UC Berkeley的CS294</a>为蓝本,着重在增强学习领域,陆续会补充深度学习的相关探讨。记录自己的所学所思,力图抓住主要核心。毕竟吾生也有涯,而知也无涯。以有涯随无涯,殆已!但学习是一辈子的事情,所以时不时也会重新补充或者修改这些文章。本人初涉深度增强学习领域,还希望各位学界业界大牛多多指正文章中不当之处,互相切磋,谢谢!</div>
</p>
</div>
</div>
<div id="outline-container-sec-6" class="outline-2">
<h2 id="sec-6">延伸阅读</h2>
<div class="outline-text-2" id="text-6">
<ul class="org-ul">
<li><a href="https://en.wikipedia.org/wiki/Multi-armed_bandit" target="_blank" rel="external">Wiki - Multi-armed Bandit Problem</a>
</li>
<li><a href="https://en.wikipedia.org/wiki/Monte_Carlo_tree_search" target="_blank" rel="external">Wiki - Monte Carlo Tree Search</a>
</li>
<li><a href="https://blogs.princeton.edu/imabandit/" target="_blank" rel="external">Dr. Sebastien Bubeck's Blog</a>
</li>
<li><a href="http://research.microsoft.com/en-us/um/people/sebubeck/pub.html" target="_blank" rel="external">Dr. Sebastien Bubeck's Publications</a>
</li>
<li><a href="https://homes.di.unimi.it/~cesabian/Pubblicazioni/ml-02.pdf" target="_blank" rel="external">Finite-time Analysis of the Multiarmed Bandit Problem</a>
</li>
<li><a href="http://ieeexplore.ieee.org/document/6145622/" target="_blank" rel="external">A Survey of Monte Carlo Tree Search Methods</a>
</li>
<li><a href="https://hal.inria.fr/hal-00747575v4/document" target="_blank" rel="external">From Bandits to Monte-Carlo Tree Search: The Optimistic Principle Applied to Optimization and Planning</a>
</li>
<li><a href="https://support.google.com/analytics/answer/2844870?hl=zh-Hans" target="_blank" rel="external">谷歌Analytics: 多手柄老虎机实验</a>
</li>
<li><a href="https://webdocs.cs.ualberta.ca/~sutton/book/bookdraft2016sep.pdf" target="_blank" rel="external">Chapter 2, Reinforcement Learning (2nd edition)</a>
</li>
<li><a href="https://book.douban.com/subject/26708119/" target="_blank" rel="external">第十六章,《机器学习》</a>
</li>
</ul>
</div>
</div>
<div id="footnotes">
<h2 class="footnotes">Footnotes: </h2>
<div id="text-footnotes">
<div class="footdef"><sup><a id="fn.1" name="fn.1" class="footnum" href="#fnr.1">1</a></sup> <p>也称作Boltzmann distribution,最早是描述分子运动的</p></div>
<div class="footdef"><sup><a id="fn.2" name="fn.2" class="footnum" href="#fnr.2">2</a></sup> <p>softmax distribution的均值随其参数变化,将包含观测值从最小到最大的所有可能取值</p></div>
<div class="footdef"><sup><a id="fn.3" name="fn.3" class="footnum" href="#fnr.3">3</a></sup> <p>详见<a href="https://book.douban.com/subject/1475870/" target="_blank" rel="external">Algorithm Design的第六章:Dynamic Programming</a></p></div>
<div class="footdef"><sup><a id="fn.4" name="fn.4" class="footnum" href="#fnr.4">4</a></sup> <p>这是某次听港科大齐向彤老师讲的</p></div>
<div class="footdef"><sup><a id="fn.5" name="fn.5" class="footnum" href="#fnr.5">5</a></sup> <p>详见<a href="https://arxiv.org/pdf/1208.4692.pdf" target="_blank" rel="external">Monte carlo search algorithm discovery for single-player games</a></p></div>
</div>
</div>
两个重要的增强学习(强化学习)问题:多臂赌博机问题和蒙特卡洛树搜索
深度增强学习【1】走向通用人工智能之路
http://blog.greenwicher.com/2016/12/18/drl-general_ai-intro/
2016-12-18T00:00:00.000Z
2017-02-06T01:47:41.000Z
<p>
现在但凡写人工智能的文章,必提<a href="https://deepmind.com/research/alphago/" target="_blank" rel="external">Alpha Go</a>。也正是因为Alpha Go在围棋人机大战中里程碑式的胜利,人工智能迎来了新的春天。 <b>本文也不免俗套,从Alpha Go说起,但希望能指明一些被忽视的但对Alpha Go棋力有深远影响的技术。</b> 围棋人工智能大致可以分为三个阶段<sup><a id="fnr.1" name="fnr.1" class="footref" href="#fn.1">1</a></sup> :第一阶段以启发式算法为主,水平低于业余初段,代表软件即以静态势力函数为强项的<a href="https://zh.wikipedia.org/wiki/%E9%99%88%E5%BF%97%E8%A1%8C" target="_blank" rel="external">手谈</a>; 第二阶段以<a href="https://zh.wikipedia.org/zh-sg/%E8%92%99%E7%89%B9%E5%8D%A1%E6%B4%9B%E6%A0%91%E6%90%9C%E7%B4%A2" target="_blank" rel="external">蒙特卡洛树搜索算法 </a>为代表,水平最高达到业余5段,比如说 <a href="http://senseis.xmp.net/?ZenGoProgram" target="_blank" rel="external">Zen</a> ,<a href="https://www.remi-coulom.fr/CrazyStone/" target="_blank" rel="external">Crazy Stone</a> ;第三阶段以 <code>深度学习</code> (<a href="https://en.wikipedia.org/wiki/Deep_learning" target="_blank" rel="external">Deep Learning</a>)以及 <code>增强学习</code> (<a href="https://en.wikipedia.org/wiki/Reinforcement_learning" target="_blank" rel="external">Reinforcement Learning</a>,也称强化学习)算法为突破,并战胜了人类职业九段棋手李世乭,这也就是Alpha Go的故事了。每每提到Alpha Go卓越的能力,往往归咎于深度学习的强大,但实际上增强学习算法也功不可没。这二者的结合被称之为 <code>深度增强学习</code> (<a href="https://deepmind.com/blog/deep-reinforcement-learning/" target="_blank" rel="external">Deep Reinforcement Learning</a>,DRL),最初见于DeepMind在Nature上发表的<a href="http://www.nature.com/nature/journal/v518/n7540/abs/nature14236.html" target="_blank" rel="external">Human-level control through deep reinforcement learning</a>。 <b>本文试图从深度增强学习的角度来探讨通用人工智能的实现,并简要介绍了深度增强学习的基础知识、常见算法以及相关应用。</b>
</p>
<a id="more"></a>
<div id="outline-container-sec-1" class="outline-2">
<h2 id="sec-1">如何解决通用人工智能的难点</h2>
<div class="outline-text-2" id="text-1">
</div><div id="outline-container-sec-1-1" class="outline-3">
<h3 id="sec-1-1">三座大山</h3>
<div class="outline-text-3" id="text-1-1">
<p>
创造出像你我一样具有自我意识和思考的人工智能估计是人世间最迷人的问题之一了吧,新的存在总是想窥探造物主的秘密。同 <code>P=NP</code> 问题一样,验证一个存在是否具有自我意识的难度(见<a href="https://zh.wikipedia.org/zh-sg/%E5%9B%BE%E7%81%B5%E6%B5%8B%E8%AF%95" target="_blank" rel="external">图灵测试</a> 以及 <a href="https://zh.wikipedia.org/wiki/%E4%B8%AD%E6%96%87%E6%88%BF%E9%97%B4" target="_blank" rel="external">中文房间问题</a>) 同创造一个具有自我意识的存在的难度究竟关系如何,恐怕可以看做是判断自我意识是否能涌现的关键了吧。本文不讲那么上层次的人工智能,先来谈谈 <code>通用人工智能</code> 。按照维基百科的解释,
</p>
<blockquote>
<p>
强人工智能也指通用人工智能(artificial general intelligence,AGI),或具备执行一般智慧行为的能力。强人工智能通常把人工智能和意识、感性、知识和自觉等人类的特征互相连结。
</p>
</blockquote>
<p>
本文所指的通用人工智能,便是可以处理通用任务的人工智能。 <b>具体而言,我认为通用人工智能应包括以下三大特点或者说难点:</b>
</p>
<ul class="org-ul">
<li>通用任务:既能唱歌绘画、又能下棋写诗,最重要的是要尽量减少对 <code>领域知识</code> (<a href="https://en.wikipedia.org/wiki/Domain_knowledge" target="_blank" rel="external">Domain Knowledge</a>)的依赖。
</li>
<li>学习能力:无论是通过逻辑推理的 <code>演绎法</code> 来学习,或者是基于经验和记忆的 <code>归纳法</code> 来学习,都要通过学习来提高处理通用任务的适用性。
</li>
<li>自省能力:也可以说是关于学习的学习,即 <code>元认知</code> ,通过自省来纠偏行为。就像泰勒展开一样,我们大可以用低阶导数来逼近函数值,而无需考虑元认知的元认知这类高阶导数。
</li>
</ul>
</div>
</div>
<div id="outline-container-sec-1-2" class="outline-3">
<h3 id="sec-1-2">解决之道</h3>
<div class="outline-text-3" id="text-1-2">
<p>
David Silver(Alpha Go的第一作者)曾在ICML2016的<a href="http://icml.cc/2016/tutorials/deep_rl_tutorial.pdf" target="_blank" rel="external">Tutorial: Deep Reinforcement Learning</a>讲到深度增强学习的前景
</p>
<blockquote>
<p>
General Intelligence = Reinforcement Learning + Deep Learning = Deep Reinforcement Learning – David Silver
</p>
</blockquote>
<p>
更进一步,『Reinforcement Learning defines the objective』(RL中有什么样的映射关系),『Deep Learning gives the mechanism』(DL如何学习给定的映射关系)。 <b>我很同意深度增强学习便是解决通用人工智能难点的核心。</b> 首先关于通用任务,几乎任何任务的解决都可以看做一个从形式编码的输入到决策分布输出的映射,而非线性的神经网络便是很好的 <code>表征</code> (<a href="https://en.wikipedia.org/wiki/Knowledge_representation_and_reasoning" target="_blank" rel="external">representation </a>)学习工具。其次,学习能力主要可分为演绎法和归纳法。增强学习就像是基于奖赏的演绎法,给定外界环境和相应的奖赏函数,我们最终产生合法的决策出来。深度学习就像是基于经验以及记忆的归纳法,给定输入输出,然后通过神经网络来学习表征。最后关于自省能力,这也是人工智能可以产生自我意识、并独立于人类存在的关键。自省从某种程度可以从增强学习来习得,通过不断试错以及奖赏,『增强/强化』自我的决策。但这种自省又受限于其存在的世界观,就像二维线段只能盲人摸象般地观测到三维球体,而三维球体却可以完整地观测二维线段。但总之,只要定义好了世界以及奖赏,我认为相应的自省能力就是在给定环境下不断优化自己的学习能力(即一阶导数大于零)。
</p>
</div>
</div>
</div>
<div id="outline-container-sec-2" class="outline-2">
<h2 id="sec-2">什么是深度增强学习</h2>
<div class="outline-text-2" id="text-2">
</div><div id="outline-container-sec-2-1" class="outline-3">
<h3 id="sec-2-1">深度学习</h3>
<div class="outline-text-3" id="text-2-1">
<blockquote>
<p>
深度学习(deep learning)是机器学习拉出的分支,它试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象的算法。 – 维基百科
</p>
</blockquote>
<p>
<b>根据维基百科的解释,深度学习是一种利用多层非线性变换处理网络结构来进行表征学习的通用框架。</b> 得益于计算机性能的提升,深度学习重新对人工神经网络方法进行品牌重塑。其核心解决问题是,如何用尽可能少的领域知识,给定输入 \(\boldsymbol{x}\) 和输出 \(\boldsymbol{y}\) ,来学习从输入到输出的 <code>映射</code> \(\mathcal{DL}(\boldsymbol{x}, \boldsymbol{w})\) ,其中 \(\boldsymbol{w}\) 是需要优化的参数, \(\mathcal{DL}(\cdot)\) 在深度学习里由多层非线性网络结构进行表示(不同机器学习方法会有不同的刻画,比如随机森林、支持向量机等等),常见的架构方式包括深度神经网络(Deep Neural Networks),深度信念网络(Deep Belief Networks)、卷积神经网络(Convolutional Neural Networks)、递归神经网络(Recurrent/Recursice Neural Network)等等。下图直观的给出了这种逐层嵌套的网络结构,
<div class="figure"><p><center><img src="Deep_Learning_Architecture.jpg" alt="Deep_Learning_Architecture.jpg" width=" 80%"><figcaption>Deep_Learning_Architecture.jpg</figcaption></center></p></div>
具体而言,映射学习的过程是寻找最优的参数$\boldsymbol{w}$来最小化 <code>损失函数</code> $\mathcal{L}(\mathcal{DL}(\boldsymbol{x}, \boldsymbol{w}), \boldsymbol{y})$。这个损失函数衡量了真实和预测输出值之间的差异,常见的比如说对数损失函数、平方损失函数、指数损失函数、Hinge损失函数、各类Norm的损失函数等等<sup><a id="fnr.2" name="fnr.2" class="footref" href="#fn.2">2</a></sup>。 同时为了提高模型的泛化能力,往往需要对损失函数进行 <code>正则化</code> (<a href="https://en.wikipedia.org/wiki/Regularization_(mathematics)" target="_blank" rel="external">regularization</a>)处理。一般需要尽量把损失函数转化为凸函数,如果函数不够光滑的话可以利用<a href="https://en.wikipedia.org/wiki/Moreau's_theorem" target="_blank" rel="external">Moreau-Yoshida regularization</a>进行处理以方便梯度的计算,最终利用 <code>梯度下降法</code> 来进行优化而得到 \(\boldsymbol{w}^{*} = \arg \min_{\boldsymbol{w}} \mathcal{L}(\mathcal{DL}(\boldsymbol{x}, \boldsymbol{w}), \boldsymbol{y})\) ,然后就可以利用 \(\mathcal{DL}(\boldsymbol{x}, \boldsymbol{w}^{*})\) 来进行预测了。下图展示了神经网络的一种架构,以及各个隐含层所学习到的表征,可以看到不同隐含层有不同层次的抽象学习。比如说,有的负责颜色,有的负责形状,有的负责部件等等。
<div class="figure"><p><center><img src="Neural_Networks_Layer_Explanation.jpg" alt="Neural_Networks_Layer_Explanation.jpg" width=" 80%"><figcaption>Neural_Networks_Layer_Explanation.jpg</figcaption></center></p></div>
</p>
</div>
</div>
<div id="outline-container-sec-2-2" class="outline-3">
<h3 id="sec-2-2">增强学习</h3>
<div class="outline-text-3" id="text-2-2">
<blockquote>
<p>
强化/增强学习是机器学习中的一个领域,强调如何基于环境而行动,以取得最大化的预期利益。其灵感来源于心理学中的行为主义理论,即有机体如何在环境给予的奖励或惩罚的刺激下,逐步形成对刺激的预期,产生能获得最大利益的习惯性行为。这个方法具有普适性,因此在其他许多领域都有研究,例如博弈论、控制论、运筹学、信息论、仿真优化方法、多主体系统学习、群体智能、统计学以及遗传算法。 –维基百科
</p>
</blockquote>
<p>
<b>简而言之,增强学习是一种基于环境反馈而做决策的通用框架。</b> 具体到机器学习领域,很多人往往知道 <code>监督式学习</code> 和 <code>非监督式学习</code> (甚至半监督式学习),但却不知道第三类机器学习方法,即增强学习。 <b>因为增强学习强调与环境的交互,我认为是离普遍意义上的人工智能更接近的一个领域。</b> 这里『增强』或者『强化』的意思是,根据不断试错而得到的奖惩来不断增强对趋利决策的信念。David Silver下面这张图很好的总结了增强学习的研究主体,即 <code>Agent</code> 、 <code>Environment</code> 以及 <code>State</code> 。
<div class="figure"><p><center><img src="Reinforcement_Learning_Configurations.png" alt="Reinforcement_Learning_Configurations.png" width=" 40%"><figcaption>Reinforcement_Learning_Configurations.png</figcaption></center></p></div>
首先在 \(t\) 时刻, Agent依据当前的状态 \(s_{t}\) 以及历史信息来决定下一轮的决策( <code>action</code> ) \(a_{t+1}\) 。然后给定当前的状态 \(s_{t}\) 以及 Agent的决策 \(a_{t+1}\) ,Environment决定下一轮 \(t+1\) 的状态 \(s_{t+1}\) 、给Agent的报酬( <code>reward</code> ) \(r_{t+1}\) 、以及它可观测到的其他信息 \(o_{t+1}\) 。最后,循环往复直到任务完成。不同于Planning(规划)问题,Learning(学习)问题一开始并不知道Environment的全部情况,因此需要逐步试错学习环境以及调整自身决策。 <b>关于奖赏的机制这里有一个假设,那就是假定所有的目标都可以被刻画为期望累积收益的最大化。</b> 从上面的描述可以看到关于Agent,有三个很关键的组成要素,
</p>
<ul class="org-ul">
<li><code>Policy function</code> (策略函数):从状态到决策的映射
<ul class="org-ul">
<li>Deterministic policy: \(\pi(s_{t}) = a_{t+1}\)
</li>
<li>Stochastic policy: \(\pi(s_{t}) = \mathbb{P}(a_{t+1} | s_{t})\)
</li>
</ul>
</li>
<li><code>Value function</code> (价值函数):从状态以及决策到期望累积收益的映射
<ul class="org-ul">
<li><a href="https://en.wikipedia.org/wiki/Bellman_equation" target="_blank" rel="external">Bellman equation</a> of <code>Q-value function</code> : \(Q^{\pi}(s_{t}, a_{t+1}) = E^{\pi}[r_{t+1} + \gamma r_{t+2} + \gamma^{2} r_{t+3} + \dotsc | s_{t}, a_{t+1}] = E^{\pi}[r_{t+1} + \gamma Q^{\pi}(s_{t+1}, a_{t+2}) | s_{t}, a_{t+1}]\)
</li>
<li>Bellman equation of <code>Optimal value function</code> :\(V(s_{t}) = Q^{*}(s_{t}, a_{t+1}) = \max_{\pi} Q^{\pi}(s_{t}, a_{t+1}) = E^{*}[r_{t+1} + \gamma \max_{a_{t+2}} Q^{*}(s_{t+1}, a_{t+2}) | s_{t}, a_{t+1}]\)
</li>
</ul>
</li>
<li><code>Model function</code> (环境函数):从状态以及决策到环境决策的映射<sup><a id="fnr.3" name="fnr.3" class="footref" href="#fn.3">3</a></sup>
<ul class="org-ul">
<li>Deterministic environment: \(e(s_{t}, a_{t+1}) = [s_{t+1}, r_{t+1}, o_{t+1}]\)
</li>
<li>Stochastic environment: \(e(s_{t}, a_{t+1}) = \mathbb{P}([s_{t+1}, r_{t+1}, o_{t+1}] | s_{t}, a_{t+1})\)
</li>
</ul>
</li>
</ul>
<p>
通过折现因子 \(\gamma\) 的引入,Q-value function一来可以转化为贝尔曼方程并满足无后效性以及最优子结构的特征;并且多期的折现又比单纯的one-step lookahead贪婪策略更加具有远见。 <b>总而言之,求解增强学习问题的核心实际上在于价值函数的贝尔曼方程,这也是动态规划里标准的状态转移方程,即定义好边界以及该方程后,就可以通过倒推法或者带记忆的递归予以解决。</b> 不过增强学习也可以通过直接搜索最优策略或者学习环境的奖惩套路来解决。 <b>实际上,这三个要素正是强化学习同深度学习结合的关键。</b> 正如David Silver所说 <sup><a id="fnr.4" name="fnr.4" class="footref" href="#fn.4">4</a></sup>,
</p>
<blockquote>
<p>
Reinforcement Learning defines the objective. Deep Learning gives the mechanism. – David Silver
</p>
</blockquote>
</div>
</div>
<div id="outline-container-sec-2-3" class="outline-3">
<h3 id="sec-2-3">二者的融合</h3>
<div class="outline-text-3" id="text-2-3">
<p>
对于复杂的任务以及环境而言,Q-value function实际上很难穷举的完的(针对每一个状态和决策都要给一个累积期望收益值),因此一般需要通过历史信息来估计这一函数。同样的,对Policy function和Model function也有类似的情况。 <b>所以在给定增强学习三大求解目标(Policy-based, Value-based, Model-based)之后,我们便可以利用深度学习来利用历史输入输出来估计这三大目标函数。</b>
</p>
</div>
</div>
</div>
<div id="outline-container-sec-3" class="outline-2">
<h2 id="sec-3">怎么利用深度增强学习解决问题</h2>
<div class="outline-text-2" id="text-3">
<p>
正如上文的分析,David Silver将深度增强学习算法分为如下三大类<sup><a id="fnr.5" name="fnr.5" class="footref" href="#fn.5">5</a></sup>。 下文将先从增强学习的角度分析如何做决策,然后从深度学习的角度来分析如何学习相应的策略函数、估值函数以及环境函数。
<div class="figure"><p><center><img src="RL_Agent_Taxonomy.png" alt="RL_Agent_Taxonomy.png" width=" 40%"><figcaption>RL_Agent_Taxonomy.png</figcaption></center></p></div>
</p>
</div>
<div id="outline-container-sec-3-1" class="outline-3">
<h3 id="sec-3-1">Policy-based DRL</h3>
<div class="outline-text-3" id="text-3-1">
<p>
下图展示了利用 <code>Policy Iteration Algorithm</code> 来解决增强学习问题的思路。即给定任意初始策略 \(\pi_{0}(s)\) ,然后利用估值函数 \(V_{0}(s)\) 对其评价,基于该估值函数对策略进一步优化得到 \(\pi_{1}(s)\) 。循环这一过程,直至策略达到最优而不能进一步改善。
<div class="figure"><p><center><img src="Policy_Iteration_Pseudo_Code.png" alt="Policy_Iteration_Pseudo_Code.png" width=" 60%"><figcaption>Policy_Iteration_Pseudo_Code.png</figcaption></center></p></div>
</p>
<p>
至于在深度学习方面,首先对policy function进行参数化 $a = π(s, \boldsymbol{u})$,其中 \(\boldsymbol{u}\) 为神经网络的参数。其次,参数化后的累积期望收益函数为 \(V(\boldsymbol{u}) = E[r_{1} + \gamma r_{2} + \gamma^{2} r_{3} + \dotsc | \pi(\cdot, \boldsymbol{u})]\) 。然后,我们就可以得到 <code>策略梯度</code> (Policy Gradients),在随机性策略函数下为 \(\frac{\partial V(\boldsymbol{u})}{\partial \boldsymbol{u}} = E[\frac{\partial log \pi (a | s, \boldsymbol{u})}{\partial \boldsymbol{u}} Q^{\pi}(s, a)]\) ,而在确定性策略函数下为 \(\frac{\partial V(\boldsymbol{u})}{\partial \boldsymbol{u}} = E[\frac{\partial Q^{\pi}(s, a)}{\partial a} \frac{\partial a}{\partial \boldsymbol{u}}]\) 。最后,便可以利用梯度下降算法来寻找最优的神经网络参数 \(\boldsymbol{u}\) <sup><a id="fnr.6" name="fnr.6" class="footref" href="#fn.6">6</a></sup> 。
</p>
</div>
</div>
<div id="outline-container-sec-3-2" class="outline-3">
<h3 id="sec-3-2">Value-based DRL</h3>
<div class="outline-text-3" id="text-3-2">
<p>
下图是解决增强学习问题的 <code>Value Iteration Algorithm</code> 的伪代码。即给定任意初始估值函数 \(V(s)\) ,利用贝尔曼方程递推得逼近真实的估值函数。至于这种方法的收敛速度以及是否收敛,我还不是太清楚,需要日后再做总结。
<div class="figure"><p><center><img src="Value_Iteration_Pseudo_Code.png" alt="Value_Iteration_Pseudo_Code.png" width=" 60%"><figcaption>Value_Iteration_Pseudo_Code.png</figcaption></center></p></div>
</p>
<p>
至于深度学习方面,类似的,先对value function进行参数化 \(Q(s, a, \boldsymbol{w}) \approx Q^{*}(s, a)\) ,那我们的目的就是找 \(\boldsymbol{w}\) 。然后,就是优化损失函数 \(L = (r + \gamma \max_{a} Q(s^{'}, a^{'}, \boldsymbol{w}) - Q(s, a, \boldsymbol{w}))^{2}\) <sup><a id="fnr.7" name="fnr.7" class="footref" href="#fn.7">7</a></sup>。David Silver在这里提到如果样本之间存在相关性或者收益函数非平稳,容易导致价值函数的不收敛,因此需要一些机制来予以解决。
</p>
</div>
</div>
<div id="outline-container-sec-3-3" class="outline-3">
<h3 id="sec-3-3">Model-based DRL</h3>
<div class="outline-text-3" id="text-3-3">
<p>
关于Model-based DRL,David Silver讲的比较少,主要举了Alpha Go的例子,即我们完美知道环境的信息(走子规则、胜负规则等等)。大致意思还是利用神经网络来代替真实的环境函数,也就是让Agent有能力预测环境下一期的状态以及收益等等,基于此来优化Agent的决策过程。下图是网上<sup><a id="fnr.8" name="fnr.8" class="footref" href="#fn.8">8</a></sup> 找到的 <code>Model Iteration Algorithm</code> 的伪代码,基本就是通过对状态转移函数以及奖惩函数的搜索,来估计价值函数。
<div class="figure"><p><center><img src="Model_Iteration_Pseudo_Code.png" alt="Model_Iteration_Pseudo_Code.png" width=" 60%"><figcaption>Model_Iteration_Pseudo_Code.png</figcaption></center></p></div>
</p>
</div>
</div>
</div>
<div id="outline-container-sec-4" class="outline-2">
<h2 id="sec-4">深度增强学习有哪些用途</h2>
<div class="outline-text-2" id="text-4">
<p>
<b>可以看到凡是任务导向型,并且目标可以被奖惩函数刻画的,均可以利用深度增强学习来解决,所以其应用范围还是蛮广的。</b> 以下举了深度增强学习的若干应用,视频均来自Youtube,因此需要科学上网。
</p>
</div>
<div id="outline-container-sec-4-1" class="outline-3">
<h3 id="sec-4-1">游戏策略</h3>
<div class="outline-text-3" id="text-4-1">
<center>
<iframe width="560" height="315" src="https://www.youtube.com/embed/L4KBBAwF_bE" frameborder="0" allowfullscreen></iframe>
</center>
</div>
</div>
<div id="outline-container-sec-4-2" class="outline-3">
<h3 id="sec-4-2">机器人控制</h3>
<div class="outline-text-3" id="text-4-2">
<center>
<iframe width="560" height="315" src="https://www.youtube.com/embed/ZhsEKTo7V04" frameborder="0" allowfullscreen></iframe>
</center>
</div>
</div>
<div id="outline-container-sec-4-3" class="outline-3">
<h3 id="sec-4-3">无人驾驶</h3>
<div class="outline-text-3" id="text-4-3">
<center>
<iframe width="560" height="315" src="https://www.youtube.com/embed/QK0LxA8FWq4" frameborder="0" allowfullscreen></iframe>
</center>
</div>
</div>
<div id="outline-container-sec-4-4" class="outline-3">
<h3 id="sec-4-4">探索环境</h3>
<div class="outline-text-3" id="text-4-4">
<center>
<iframe width="560" height="315" src="https://www.youtube.com/embed/nMR5mjCFZCw" frameborder="0" allowfullscreen></iframe>
</center>
</div>
</div>
<div id="outline-container-sec-4-5" class="outline-3">
<h3 id="sec-4-5">学会走路</h3>
<div class="outline-text-3" id="text-4-5">
<center>
<iframe width="560" height="315" src="https://www.youtube.com/embed/eFopkAceTGs" frameborder="0" allowfullscreen></iframe>
</center>
</div>
</div>
<div id="outline-container-sec-4-6" class="outline-3">
<h3 id="sec-4-6">开源测试开发平台</h3>
<div class="outline-text-3" id="text-4-6">
<ul class="org-ul">
<li><a href="https://gym.openai.com/" target="_blank" rel="external">OpenAI Gym</a>以及<a href="https://universe.openai.com/" target="_blank" rel="external">OpenAI Universe</a>
</li>
<li><a href="https://github.com/deepmind/lab" target="_blank" rel="external">DeepMind Lab</a>
</li>
<li><a href="https://github.com/Microsoft/malmo#getting-started" target="_blank" rel="external">Malmo</a>
</li>
<li><a href="http://www.nature.com/news/tech-giants-open-virtual-worlds-to-bevy-of-ai-programs-1.21151" target="_blank" rel="external">Nature关于三大开源平台的对比:Tech giants open virtual worlds to bevy of AI programs</a>
</li>
</ul>
</div>
</div>
</div>
<div id="outline-container-sec-5" class="outline-2">
<h2 id="sec-5">结语</h2>
<div class="outline-text-2" id="text-5">
<p>
<b>如果说达尔文的进化论是人类关于自身起源的一次冲击,那么通用型人工智能的诞生便是对人类未来的另一次冲击。</b> 在Alpha Go之前,人们认为人工智能战胜人类围棋高手大概还需要十多年的样子,然而技术的发展速度实在是不可想想。让我们扩大时间的尺度,想想十年前、百年前、千年前中国的样子,在看看我们现在的生活,不能说是天翻地覆,但显然得益于技术的发展,我们的生活有了更多的便捷。 <b>也不禁畅想未来,说不定下个技术引爆点没有想象中的那么远,或许明年或许明天。</b> 所以,对于大多数人而言,还是有必要提前接触这些前沿的领域,一来不至于自己到了未来成为新『文盲』,二来也不会沦落到被高新技术革了命。
</p>
</div>
</div>
<div id="outline-container-sec-6" class="outline-2">
<h2 id="sec-6">关于【深度增强学习】系列的说明</h2>
<div class="outline-text-2" id="text-6">
<p>
<div class="alert alert-info"><i class="fa fa-info"></i> 对于我自己而言,写【深度增强学习】这一系列文章,除了自己的兴趣之外,其实增强学习和我的研究方向(仿真优化)也略微相关,希望能从中获取些新知识和新想法。初步打算本系列文章以<a href="http://www0.cs.ucl.ac.uk/staff/d.silver/web/Teaching.html" target="_blank" rel="external">David Silver的公开课</a> 以及 <a href="http://rll.berkeley.edu/deeprlcourse/" target="_blank" rel="external">UC Berkeley的CS294</a>为蓝本,着重在增强学习领域,陆续会补充深度学习的相关探讨。记录自己的所学所思,力图抓住主要核心。毕竟吾生也有涯,而知也无涯。以有涯随无涯,殆已!但学习是一辈子的事情,所以时不时也会重新补充或者修改这些文章。本人初涉深度增强学习领域,还希望各位学界业界大牛多多指正文章中不当之处,互相切磋,谢谢!</div>
</p>
</div>
</div>
<div id="outline-container-sec-7" class="outline-2">
<h2 id="sec-7">延伸阅读</h2>
<div class="outline-text-2" id="text-7">
<ul class="org-ul">
<li>公开课
<ul class="org-ul">
<li><a href="http://rll.berkeley.edu/deeprlcourse/" target="_blank" rel="external">UCB CS294 Deep Reinforcement Learning</a>
</li>
<li><a href="http://www0.cs.ucl.ac.uk/staff/d.silver/web/Teaching.html" target="_blank" rel="external">UCL Course on Reinforcement Learning</a>
</li>
<li><a href="https://katefvision.github.io/" target="_blank" rel="external">CMU 10703 - Deep Reinforcement Learning and Control</a>
</li>
</ul>
</li>
<li>基础介绍
<ul class="org-ul">
<li><a href="http://icml.cc/2016/tutorials/deep_rl_tutorial.pdf" target="_blank" rel="external">Tutorial: Deep Reinforcement Learning</a>
</li>
<li><a href="https://deepmind.com/blog/deep-reinforcement-learning/" target="_blank" rel="external">Deep Reinforcement Learning | DeepMind</a>
</li>
</ul>
</li>
<li>书籍
<ul class="org-ul">
<li><a href="https://webdocs.cs.ualberta.ca/~sutton/book/bookdraft2016sep.pdf" target="_blank" rel="external">《Reinforcement Learning: An Introduction》</a>
</li>
<li><a href="https://sites.ualberta.ca/~szepesva/RLBook.html" target="_blank" rel="external">《Algorithms for Reinforcement Learning》</a>
</li>
<li><a href="http://www.deeplearningbook.org/" target="_blank" rel="external">《Deep Learning》</a>
</li>
</ul>
</li>
<li>论文
<ul class="org-ul">
<li><a href="https://sites.google.com/site/deeprlnips2016/" target="_blank" rel="external">Deep Reinforcement Learning Workshop, NIPS 2016</a>
</li>
<li><a href="http://rll.berkeley.edu/deeprlworkshop/" target="_blank" rel="external">Deep Reinforcement Learning Workshop, NIPS 2015</a>
</li>
<li><a href="https://github.com/muupan/deep-reinforcement-learning-papers" target="_blank" rel="external">Deep Reinforcement Learning Papers</a>
</li>
<li><a href="https://github.com/junhyukoh/deep-reinforcement-learning-papers" target="_blank" rel="external">Deep Reinforcement Learning Papers CONT'D</a>
</li>
<li><a href="https://github.com/HFTrader/DeepLearningBook/blob/master/DeepLearningPapers.md" target="_blank" rel="external">Deep Learning Papers</a>
</li>
</ul>
</li>
<li>资源列表
<ul class="org-ul">
<li><a href="https://github.com/aikorea/awesome-rl" target="_blank" rel="external">Awesome Reinforcement Learning List</a>
</li>
<li><a href="https://github.com/ChristosChristofidis/awesome-deep-learning" target="_blank" rel="external">Awesome Deep Learning List</a>
</li>
</ul>
</li>
<li>其他
<ul class="org-ul">
<li><a href="http://karpathy.github.io/2016/05/31/rl/" target="_blank" rel="external">Deep Reinforcement Learning: Pong from Pixels</a>
</li>
<li><a href="https://www.zhihu.com/question/49787932" target="_blank" rel="external">RL两大类算法的本质区别?(Policy Gradient 和 Q-Learning)</a>
</li>
<li><a href="http://www.slideshare.net/tw_dsconf/ss-62245351" target="_blank" rel="external">DSC 2016 系列活動:李宏毅 / 一天搞懂深度學習</a>
</li>
</ul>
</li>
</ul>
</div>
</div>
<div id="footnotes">
<h2 class="footnotes">Footnotes: </h2>
<div id="text-footnotes">
<div class="footdef"><sup><a id="fn.1" name="fn.1" class="footnum" href="#fnr.1">1</a></sup> <p>详见知乎Live:<a href="https://www.zhihu.com/lives/784053023981719552" target="_blank" rel="external">深入浅出说围棋人工智能</a></p></div>
<div class="footdef"><sup><a id="fn.2" name="fn.2" class="footnum" href="#fnr.2">2</a></sup> <p>各类损失函数的定义及应用具体请见<a href="http://www.csuldw.com/2016/03/26/2016-03-26-loss-function/" target="_blank" rel="external">http://www.csuldw.com/2016/03/26/2016-03-26-loss-function/</a></p></div>
<div class="footdef"><sup><a id="fn.3" name="fn.3" class="footnum" href="#fnr.3">3</a></sup> <p>在David Silver的Tutorial里并没有详细讲Model函数的刻画,这里的映射仅仅是我自己的理解,即通过model来作为刻画环境的媒介</p></div>
<div class="footdef"><sup><a id="fn.4" name="fn.4" class="footnum" href="#fnr.4">4</a></sup> <p>详见<a href="http://icml.cc/2016/tutorials/deep_rl_tutorial.pdf" target="_blank" rel="external">http://icml.cc/2016/tutorials/deep_rl_tutorial.pdf</a></p></div>
<div class="footdef"><sup><a id="fn.5" name="fn.5" class="footnum" href="#fnr.5">5</a></sup> <p>详见<a href="http://www0.cs.ucl.ac.uk/staff/d.silver/web/Teaching_files/intro_RL.pdf" target="_blank" rel="external">http://www0.cs.ucl.ac.uk/staff/d.silver/web/Teaching_files/intro_RL.pdf</a></p></div>
<div class="footdef"><sup><a id="fn.6" name="fn.6" class="footnum" href="#fnr.6">6</a></sup> <p>这个大概就是Deep Policy Networks(DPN)的大致思路</p></div>
<div class="footdef"><sup><a id="fn.7" name="fn.7" class="footnum" href="#fnr.7">7</a></sup> <p>这个大概就是Deep Q-Networks(DQN)的大致思路</p></div>
<div class="footdef"><sup><a id="fn.8" name="fn.8" class="footnum" href="#fnr.8">8</a></sup> <p>详见<a href="http://mlg.eng.cam.ac.uk/mlss09/mlss_slides/Littman_1.pdf" target="_blank" rel="external">http://mlg.eng.cam.ac.uk/mlss09/mlss_slides/Littman_1.pdf</a></p></div>
</div>
</div>
深度增强学习/深度强化学习的基本介绍以及对实现通用人工智能的探讨
工欲善其事,必先利其器
http://blog.greenwicher.com/2016/12/04/my_liqi/
2016-12-04T00:00:00.000Z
2016-12-06T09:32:34.000Z
<p>
本文参与了「利器社群计划」,发现更多创造者和他们的工具:<a href="http://liqi.io/community/" target="_blank" rel="external">http://liqi.io/community/</a> ,着重推荐了本人重度使用的工具库以及多年来总结出的工作流。除此之外,也探讨了我的职业生涯转折点、最理想的工作环境以及平时获得工作灵感的一些方式。
</p>
<a id="more"></a>
<div id="outline-container-sec-1" class="outline-2">
<h2 id="sec-1">介绍一下你自己和所做的工作。</h2>
<div class="outline-text-2" id="text-1">
<p>
大家好!我是<a href="http://greenwicher.com/me/cv.pdf" target="_blank" rel="external">刘威志</a>, 典型的摩羯座,略带有完美主义情结(导致想得多、顾忌的太多、但做的少),并患有重度松鼠症(也就是收藏癖,如果你找到了药,请告诉我)。目前在新加坡国立大学攻读博士学位,研究方向是仿真优化(<a href="https://en.wikipedia.org/wiki/Simulation-based_optimization" target="_blank" rel="external">simulation optimization</a>)。业余时间,想把 <code>算法与数据结构</code> 、 <code>人工智能</code> 、以及 <code>量化交易</code> 这三大领域的技能树全部点亮,但路漫漫其修远兮。
<div class="figure"><p><center><img src="nus.jpg" alt="nus.jpg" width=" 80%"><figcaption>nus.jpg</figcaption></center></p></div>
很多人问我,仿真优化中的仿真是具体仿真什么,是物流系统?生产系统?还是金融系统?其实,并没有具体的应用标的,你可以把仿真优化理解为存在随机扰动下的线性规划、凸优化或者动态规划问题,其本质还是追求理论上的突破。计算机科学的童鞋,请参考多臂赌博机问题(<a href="https://en.wikipedia.org/wiki/Multi-armed_bandit" target="_blank" rel="external">multi-armed bandit problems</a>);统计的童鞋,请参考试验设计(<a href="https://en.wikipedia.org/wiki/Design_of_experiments" target="_blank" rel="external">design of experiments</a>);运筹学的童鞋,请参考随机规划(<a href="https://en.wikipedia.org/wiki/Stochastic_programming" target="_blank" rel="external">stochastic programming</a>)。当然了,具体到仿真优化领域,我们的目的是用高效的仿真来解决随机优化问题,因此首先要解决高效仿真,其次是如何通过仿真的信息来辅助优化决策。举个例子,面对10个不确定性设计方案,你如何分配100次仿真资源到这些方案上以获取信息并消除不确定性,最终找到最好的那个方案出来。
</p>
</div>
</div>
<div id="outline-container-sec-2" class="outline-2">
<h2 id="sec-2">你的职业生涯的转折点是什么?</h2>
<div class="outline-text-2" id="text-2">
<p>
如果顺利的话,再过一两年,我这为期近二十多年的 <code>职业学生生涯</code> 就将告一段落,迎来新的转折点。但未来还很遥远,人生也很漫长,希望接连不断的转折点能够让我更加强大,也让我能够保护我所在乎的人并实现财富自由。前二十多年的人生,身为学生,也不免平淡,但也确实有许多影响了我人生轨迹的转折点,印象最深的便是2013年的美国大学生数学建模比赛。在那短短的一个月参赛准备以及四天通宵比赛中,我所学到的知识以及实现的结果远远大于之前一年的学习,并和我的队友拿到了当年Problem B的Outstanding Winner以及INFORMS Award。最重要的是,我了解到了很多启发式算法,诸如模拟退火、粒子群算法、蚁群算法、禁忌搜索、神经网络,特别是遗传算法对我的影响最大。当我在求解旅行商问题的时候,年少无知的我完全被遗传算法演化出来的策略解而折服,以至后来逐步跨入了复杂自适应网络以及人工智能的坑。入门书籍便是带有科普性质的记录人工智能第一次峰会<a href="https://en.wikipedia.org/wiki/Dartmouth_Conferences" target="_blank" rel="external">达特矛斯会议</a>的<a href="https://book.douban.com/subject/1030898/" target="_blank" rel="external">《复杂》</a>, 遗传算法之父约翰·霍兰德的<a href="https://book.douban.com/subject/1071936/" target="_blank" rel="external">《隐秩序:适应性造就复杂性》</a> 以及大名鼎鼎的<a href="https://book.douban.com/subject/1291204/" target="_blank" rel="external">《哥德尔、埃舍尔、巴赫:集异璧之大成》</a>。 尤其是最后一本书,对我的世界观造成了很大的冲击,诸如同构、自指、递归以及系统的层次。如果没有参加2013年的美赛,我估计不会对人工智能感兴趣,不会来读博士,更重要的是我不会发现 <code>编程带给我的乐趣</code> 。
<div class="figure"><p><center><img src="GEB.jpg" alt="GEB.jpg" width=" 40%"><figcaption>GEB.jpg</figcaption></center></p></div>
</p>
</div>
</div>
<div id="outline-container-sec-3" class="outline-2">
<h2 id="sec-3">你最理想的工作环境是什么?</h2>
<div class="outline-text-2" id="text-3">
<p>
取决于工作的需求以及特点。
</p>
<ul class="org-ul">
<li>如果是任务导向的,那么必须提高工作效率。比如说一个小隔间、泛黄的灯光。然后好几台显示器,每台显示器的工作内容全部全屏无任何干扰,网速超快,唯一最大的瓶颈就是我自己本身。最好再来点白噪声或者纯粹的静默也行。
</li>
<li>如果是创意导向的,那么必须提高思维敏感。比如说一个足够大的空间、能够允许我来回踱步。然后白板是标配,还有各种颜色的笔,最后空间也是多种颜色以及形状的。
</li>
</ul>
</div>
</div>
<div id="outline-container-sec-4" class="outline-2">
<h2 id="sec-4">你平时获得工作灵感的方式有哪些?</h2>
<div class="outline-text-2" id="text-4">
<p>
说在前面的话。灵感来之不易,所以记录以及回顾很重要,但记录在哪里并不重要。不过还是得推荐一下<i>Trello</i>,卡片式灵感记录(详见<a href="http://www.yangzhiping.com/psy/nabokov.html" target="_blank" rel="external">纳博科夫的卡片</a>)。
</p>
<ul class="org-ul">
<li>连线:顾名思义,就是让自己充分暴露在信息洪流下。比如说和别人讨论、头脑风暴以及看一本书,这个时候会有更多不同的观点和新起的想法,也越发容易让我联想,进行 <code>深度优先搜索</code> ,而从不同角度看待老问题或者发现新问题。
</li>
<li>离线:顾名思义,就是让自己充分暴露在放空状态下。比如说游泳、洗澡或者平时走路的时候,这个时候思路比较容易游走,比较跳跃,更容易进行 <code>宽度优先搜索</code> ,而把两个不相关的事物联系起来。
</li>
</ul>
</div>
</div>
<div id="outline-container-sec-5" class="outline-2">
<h2 id="sec-5">推荐一件生活中的利器给大家。</h2>
<div class="outline-text-2" id="text-5">
<p>
天干地燥,心情烦躁的时候用这个USB风扇还蛮有用的~
<div class="figure"><p><center><img src="USB风扇.jpg" alt="USB风扇.jpg" width=" 80%"><figcaption>USB风扇.jpg</figcaption></center></p></div>
</p>
</div>
</div>
<div id="outline-container-sec-6" class="outline-2">
<h2 id="sec-6">你都在使用哪些硬件?</h2>
<div class="outline-text-2" id="text-6">
</div><div id="outline-container-sec-6-1" class="outline-3">
<h3 id="sec-6-1">认知的延伸</h3>
<div class="outline-text-3" id="text-6-1">
<ul class="org-ul">
<li><b>Macbook Pro (Retina, 15-inch, Mid 2014)</b> :小型移动工作站,处理我主要的计算以及写作任务。15英寸的Retina显示屏,处理分屏任务简直不要太爽。再者,MAC OS相对WINDOWS的最大好处就是安静,不会随便跳出乱七八糟的提示,全屏处理任务也有助于提高工作效率,并且对程序员非常友善。唯一的缺点,大概是对游戏支持一般吧。
</li>
<li><b>iPad Air (32G)</b> :娱乐以及看书利器。我从小到大很少玩游戏,所以基本的娱乐靠iPad也就足够了,玩玩游戏、看看剧、听听音乐之类的。最重要的是Zotero->Dropbox->GoodReader->Emacs->Hexo这一套的知识管理工作流,让我在iPad上看了不少书,而且基于我的松鼠症,所有资料被电子化实在是太难能可贵了!就是32G的容量有些小了。
</li>
<li><b>iPhone 6s (64G)</b> :信息以及记录中心。纯粹的通信工具、生活记录工具、时间管理工具、碎片时间打发工具以及睡眠监测工具。
</li>
<li><b>Apple Watch Nike+</b> :不仅仅是一款表,更是苹果生态系统中的一员。解锁Macbook,遥控iTunes,远程控制iPhone的相机,接打电话,等等等。当然,对我最重要的还是健康以及运动记录,每日完成三圆环目标,查看静息运动以及睡眠心率。另外作为一款表,其时间旅行以及提前表盘时间功能也是蛮赞的。
</li>
<li><b>Google Cardboard V2</b> :我的VR初体验,确实立体效果不错,就是沉浸太差以及画面不够连贯,还有戴着太累。。
</li>
</ul>
</div>
</div>
<div id="outline-container-sec-6-2" class="outline-3">
<h3 id="sec-6-2">味蕾的延伸</h3>
<div class="outline-text-3" id="text-6-2">
<ul class="org-ul">
<li><b>IONA G180 18L烤箱</b> :尝试做过蛋挞,味道还算惊艳,就是做了好几次斑兰戚风蛋糕都失败了,另外烤烤印尼蜜糖番薯还蛮不错的~但是好久不用了
</li>
<li><b>苏泊尔全智能电压力锅</b> :早上预约一碗营养粥,起来便有早饭吃!但是好久不用了+1
</li>
<li><b>宜家365+不锈钢中式炒菜锅</b> :质量比网上说的要好很多,可能我人品好吧。。不掉漆也容易清洗。但是好久不用了+2
</li>
<li><b>小熊10档调速打蛋器</b> :打发蛋白实在太有意思了!!但是好久不用了+3
</li>
</ul>
</div>
</div>
<div id="outline-container-sec-6-3" class="outline-3">
<h3 id="sec-6-3">力量的延伸</h3>
<div class="outline-text-3" id="text-6-3">
<ul class="org-ul">
<li><b>Yonex VT-ZF2羽毛球拍</b> :Yonex的经典扣杀拍,在今年的Warehouse Sale上买的。质量没的说,但是自己用来可能有些浪费了,能力还没到充分施展它的水平
</li>
<li><b>Kason Feather 6000羽毛球拍</b> :5u的重量打起来很灵活!
</li>
<li><b>Yonex SHB-SC6LDEX羽毛球鞋</b> :教练安利我还是有必要穿双羽球鞋的,买了之后发现确实蛮保护脚踝,不怕磕磕扭扭的,但还是自己用来可能有些浪费了,都不怎么跑动。。
</li>
<li><b>Head Ti Tour Two网球拍</b> :真的是好久不打了。。
</li>
</ul>
</div>
</div>
</div>
<div id="outline-container-sec-7" class="outline-2">
<h2 id="sec-7">软件呢?</h2>
<div class="outline-text-2" id="text-7">
</div><div id="outline-container-sec-7-1" class="outline-3">
<h3 id="sec-7-1">知识管理</h3>
<div class="outline-text-3" id="text-7-1">
<ul class="org-ul">
<li>灵感收集:Trello <p class="text-primary">[原本是基于看板的项目管理工具,但作为去中心化碎片化的灵感卡片式保存也是极好的]</p>
</li>
<li>碎片化待读:Pocket <p class="text-primary">[松鼠症专用,收集癖待读,但实际上是人为加了一个缓冲]</p>
</li>
<li>科学上网:VPN Master <p class="text-primary">[一键连接,无需设置]</p>
</li>
<li>文本OCR:ABBYY FineReader以及TextGrabber <p class="text-primary">[中文识别率很高,OCR过后可以直接在PDF上复制编辑文字]</p>
</li>
<li>知识数据库:Zotero <p class="text-primary">[好用的不得了!!一生推!除了文献,还支持电影、网页、手稿、音乐等多种类型条目保存。使用请介绍见阳志平老师的<a href="http://www.yangzhiping.com/tech/zotero1.html" target="_blank" rel="external">博客</a>]</p>
</li>
<li>同步工具:Dropbox <p class="text-primary">[除了备份之外,更重要的是多平台的同步,就是1T的容量实在太大了]</p>
</li>
<li>电子书阅读:GoodReader <p class="text-primary">[绝对是iOS上PDF阅读器的第一名,配合着Zotero和Dropbox的工作流,读电子书特别方便!]</p>
</li>
<li>思维导图:Freeplane <p class="text-primary">[整理思路以及做知识索引和缓存用的]</p>
</li>
<li>文本编辑器:Emacs <p class="text-primary">[再来一个一生推,虽然不能拯救乌干达的儿童,但逢人必推,特别是 <code>M-x Doctor</code> ]</p>
</li>
<li>报告撰写:\(\LaTeX\) <p class="text-primary">[关注创作内容而非形式,一流的排版]</p>
</li>
<li>大纲写作:Emacs的Org模式 <p class="text-primary">[Emacs本身就是一生推,加上Org模式更是如虎添翼,效率不知道提升了多少!!]</p>
</li>
<li>英文写作:Grammarly <p class="text-primary">[检查英语写作语法以及词语搭配的,特别是介词的搭配很有用]</p>
</li>
<li>博客写作:hexo以及Github <p class="text-primary">[本站便是基于这两大工具建立的]</p>
</li>
</ul>
</div>
</div>
<div id="outline-container-sec-7-2" class="outline-3">
<h3 id="sec-7-2">时间管理</h3>
<div class="outline-text-3" id="text-7-2">
<ul class="org-ul">
<li>待处理任务收集:Wunderlist <p class="text-primary">[不急于准确安排,只是待办和缓冲]</p>
</li>
<li>日程安排:Google Calendar <p class="text-primary">[基本每晚安排第二天的工作日程]</p>
</li>
<li>拖延症利器:番茄土豆 <p class="text-primary">[把任务划分为一个个25分钟的时间块,同时也敦促自己不要用眼过度]</p>
</li>
<li>时间记录:aTimeLogger2 <p class="text-primary">[松鼠症必备,详见<a href="https://book.douban.com/subject/24739109/" target="_blank" rel="external">《奇特的一生》</a>]</p>
</li>
</ul>
</div>
</div>
<div id="outline-container-sec-7-3" class="outline-3">
<h3 id="sec-7-3">财务管理</h3>
<div class="outline-text-3" id="text-7-3">
<ul class="org-ul">
<li>日常花销:随手记 <p class="text-primary">[掌握钱都去哪儿了…]</p>
</li>
<li>投资记录:同花顺至尊版 <p class="text-primary">[相比官方券商客户端,能显示我的历史投资收益和沪深300对比]</p>
</li>
</ul>
</div>
</div>
<div id="outline-container-sec-7-4" class="outline-3">
<h3 id="sec-7-4">健康管理</h3>
<div class="outline-text-3" id="text-7-4">
<ul class="org-ul">
<li>睡眠:Sleep Cycle以及Power Nap <p class="text-primary">[睡眠监测以及唤醒,午睡小憩功能]</p>
</li>
<li>冥想:呼吸 <p class="text-primary">[主要是来调节自己的呼吸的]</p>
</li>
<li>记步:Human <p class="text-primary">[后台打开,然后安静的记录下每天步行时间]</p>
</li>
<li>记录:Runtastic Pro <p class="text-primary">[主要是记录跑步,还包括其他很多种类型的运动]</p>
</li>
</ul>
</div>
</div>
<div id="outline-container-sec-7-5" class="outline-3">
<h3 id="sec-7-5">其他</h3>
<div class="outline-text-3" id="text-7-5">
<ul class="org-ul">
<li>SmartGo Kifu:循序渐进的打开围棋的正确姿势
</li>
<li>Champ Go HD:CrazyStone在iOS上的实现
</li>
<li>Chess Pro:循序渐进的打开国际象棋的正确姿势,有多种等级elo的AI对手
</li>
<li>Air Video HD:在自己的电脑上搭设视频服务器,然后在iPad上看,终于可以随时看银魂了
</li>
<li>AppZapp:比其他app限免推荐的妖艳贱货不知道好到哪里去
</li>
<li>Team Viewer:远程同步工具,不解释
</li>
<li>TEDiSUB:看TED的神器
</li>
<li>WikiLinks:用关联图的方式看Wiki的神器
</li>
<li>下厨房:不解释
</li>
<li>FileZilla:开源的FTP工具,经常往学校的HPC和本地同步文件
</li>
<li>Anaconda:Python的科学计算发行版
</li>
<li>圈点:仅仅是用于截图和标注
</li>
<li>f.lux:定时让屏幕变成暖色,提醒你该睡觉啦!
</li>
<li>Time Machine:MAC OS下的备份工具
</li>
<li>Git:版本控制,不解释
</li>
<li>Homebrew:命令行下安装工具的利器
</li>
<li>Google Chrome:不解释
</li>
<li>Window Tidy:快速自定义分屏大小
</li>
</ul>
<blockquote>
<p>
本文参与了「利器社群计划」,发现更多创造者和他们的工具:<a href="http://liqi.io/community/" target="_blank" rel="external">http://liqi.io/community/</a>
</p>
</blockquote>
</div>
</div>
</div>
本文约3000字,需4~6分钟读完。本文参加了『利器社群计划』,着重推荐了本人重度使用的工具库以及多年来总结出的工作流。
Codeforces - 598D Igor In the Museum
http://blog.greenwicher.com/2016/03/12/CF-598D/
2016-03-12T00:00:00.000Z
2016-12-30T06:23:09.000Z
<p>
<a href="http://blog.greenwicher.com/2016/02/15/CF-598C/">前文</a>曾提到过解决一个算法问题,大概可以划分为三个阶段。第一阶段是算法设计,即人脑准确无误理解算法问题,并设计算法,这一阶段属于模型在思维上的构建。第二阶段是算法实施,即程序员用自己钟爱的语言对思维上的模型进行现实化,依靠计算机来获得结果,这一阶段属于模型在代码上的构建。最后一阶段,即计算机执行程序员给定的命令,并返回其所希望的结果,这一阶段属于模型在计算机硬件上的构建。为了保证最终输出的正确性,这三个阶段不能发生任何可预见或者意想不到的错误。算法运行中的精度问题在<a href="http://blog.greenwicher.com/2016/02/15/CF-598C/">前文</a>中已有所描述,这一次我们来谈谈算法实施阶段,并以<a href="http://codeforces.com/contest/598/problem/D" target="_blank" rel="external">Codeforces 598D</a>来说明如何写更精简的代码。
</p>
<a id="more"></a>
<div id="outline-container-sec-1" class="outline-2">
<h2 id="sec-1">问题描述</h2>
<div class="outline-text-2" id="text-1">
<p>
<div class="figure"><p><center><img src="cf598d.jpg" alt="cf598d.jpg" width="80%"><figcaption>cf598d.jpg</figcaption></center></p></div>
这道题的基本意思是说,给定一个博物馆二维平面空间布置,其中 <code>.</code> 表示通道, <code>*</code> 表示一堵墙,每一堵墙的两面都挂着画。然后问给定Igor的起始位置,他最多能够观赏多少副画。
</p>
</div>
</div>
<div id="outline-container-sec-2" class="outline-2">
<h2 id="sec-2">初步思考</h2>
<div class="outline-text-2" id="text-2">
</div><div id="outline-container-sec-2-1" class="outline-3">
<h3 id="sec-2-1">分析</h3>
<div class="outline-text-3" id="text-2-1">
<p>
Igor只能在连通的通道里移动,因此问最多能够观赏多少幅画,那么首先先确定Igor可移动的连通区域,然后确定其边界,最后对每个边界,确定可看到的画作的数目再加和即可。确定连通空间的范围可以转化成<a href="https://zh.wikipedia.org/zh-sg/%E6%B7%B1%E5%BA%A6%E4%BC%98%E5%85%88%E6%90%9C%E7%B4%A2" target="_blank" rel="external">深度优先搜索</a>,既以当前位置为搜索树的根节点,然后其上下左右连接点为四个子节点。若子节点为墙,则搜索完毕;若子节点为已搜索过的通道,则毋需再次搜索;若子节点为通道且未搜索,那么利用同样的法则递归的搜索。
</p>
</div>
</div>
<div id="outline-container-sec-2-2" class="outline-3">
<h3 id="sec-2-2">代码</h3>
<div class="outline-text-3" id="text-2-2">
<p>
由此,我们可以得到如下的算法。
</p>
<div class="org-src-container">
<figure class="highlight python"><table><tr><td class="code"><pre><span class="line"> <span class="number">1</span>: <span class="comment">#%% Version 1: given (x,y) search valide empty regions and calculate max_pic_num</span></span><br><span class="line"> <span class="number">2</span>: <span class="comment">#Search irreducible valid regions recurisvely</span></span><br><span class="line"> <span class="number">3</span>: <span class="comment">#!!no need to return any value for this recurisve function</span></span><br><span class="line"> <span class="number">4</span>: <span class="function"><span class="keyword">def</span> <span class="title">searchPicLayout</span><span class="params">(m,x,y)</span>:</span></span><br><span class="line"> <span class="number">5</span>: <span class="keyword">global</span> pic</span><br><span class="line"> <span class="number">6</span>: <span class="keyword">global</span> visit</span><br><span class="line"> <span class="number">7</span>: <span class="comment">#visit (x,y)</span></span><br><span class="line"> <span class="number">8</span>: visit.add((x,y))</span><br><span class="line"> <span class="number">9</span>: <span class="comment">#valid direction</span></span><br><span class="line"><span class="number">10</span>: move = [(<span class="number">0</span>,-<span class="number">1</span>),(<span class="number">1</span>,<span class="number">0</span>),(<span class="number">0</span>,<span class="number">1</span>),(-<span class="number">1</span>,<span class="number">0</span>)]</span><br><span class="line"><span class="number">11</span>: <span class="keyword">for</span> i <span class="keyword">in</span> range(len(move)):</span><br><span class="line"><span class="number">12</span>: <span class="comment">#find neighbot (ith direction)</span></span><br><span class="line"><span class="number">13</span>: d = move[i]</span><br><span class="line"><span class="number">14</span>: nx,ny = x+d[<span class="number">0</span>],y+d[<span class="number">1</span>]</span><br><span class="line"><span class="number">15</span>: <span class="comment">#check neighbor</span></span><br><span class="line"><span class="number">16</span>: <span class="keyword">if</span> m[nx][ny] != <span class="string">'*'</span>:</span><br><span class="line"><span class="number">17</span>: <span class="comment">#check key of (nx,ny) in explore</span></span><br><span class="line"><span class="number">18</span>: <span class="keyword">if</span> <span class="keyword">not</span>((nx,ny) <span class="keyword">in</span> visit):</span><br><span class="line"><span class="number">19</span>: <span class="comment">#explore new valid unvisited point</span></span><br><span class="line"><span class="number">20</span>: searchPicLayout(m,nx,ny)</span><br><span class="line"><span class="number">21</span>: <span class="keyword">else</span>:</span><br><span class="line"><span class="number">22</span>: <span class="comment">#impassable point and mark the picture</span></span><br><span class="line"><span class="number">23</span>: pic[nx][ny] += <span class="number">1</span></span><br><span class="line"><span class="number">24</span>: <span class="comment">#Read Input</span></span><br><span class="line"><span class="number">25</span>: I = <span class="keyword">lambda</span>:map(int,input().split())</span><br><span class="line"><span class="number">26</span>: n,m,k = I()</span><br><span class="line"><span class="number">27</span>: museum = []</span><br><span class="line"><span class="number">28</span>: <span class="keyword">for</span> _ <span class="keyword">in</span> range(n):</span><br><span class="line"><span class="number">29</span>: museum.append(input())</span><br><span class="line"><span class="number">30</span>: <span class="comment">#Output</span></span><br><span class="line"><span class="number">31</span>: <span class="keyword">for</span> _ <span class="keyword">in</span> range(k):</span><br><span class="line"><span class="number">32</span>: x,y = I()</span><br><span class="line"><span class="number">33</span>: <span class="comment">#records layout of pictures, 1 represents picture exists</span></span><br><span class="line"><span class="number">34</span>: pic = [[<span class="number">0</span> <span class="keyword">for</span> j <span class="keyword">in</span> range(m)] <span class="keyword">for</span> i <span class="keyword">in</span> range(n)]</span><br><span class="line"><span class="number">35</span>: <span class="comment">#records visited points</span></span><br><span class="line"><span class="number">36</span>: visit = set()</span><br><span class="line"><span class="number">37</span>: <span class="comment">#find the pictures can be viewed</span></span><br><span class="line"><span class="number">38</span>: searchPicLayout(museum,x-<span class="number">1</span>,y-<span class="number">1</span>)</span><br><span class="line"><span class="number">39</span>: <span class="comment">#Output best solutions</span></span><br><span class="line"><span class="number">40</span>: print(sum([sum(r) <span class="keyword">for</span> r <span class="keyword">in</span> pic]))</span><br></pre></td></tr></table></figure>
</div>
<p>
然而,这段代码并没有通过Codeforces的测试,在第10号测试数据上超时了。那么有什么可以优化的地方么?
</p>
</div>
</div>
</div>
<div id="outline-container-sec-3" class="outline-2">
<h2 id="sec-3">生成缓存</h2>
<div class="outline-text-2" id="text-3">
</div><div id="outline-container-sec-3-1" class="outline-3">
<h3 id="sec-3-1">分析</h3>
<div class="outline-text-3" id="text-3-1">
<p>
注意到这道题的测试数据里每一次都要计算若干起始点下最多可看到的画作数量,因此有可能出现某些起始点实际上归属于同一个连通区域。而先前的算法针对每一个新的起始点,都进行新的计算,因而可能会出现大量的重复计算。因此,我们可以有如下的第一个算法优化思路,即进行缓存,
<div class="alert alert-success"><i class="fa fa-lightbulb-o"></i> 优化1:标记已解决的起始点及其连通点的最优值,进行缓存记录。</div>
</p>
</div>
</div>
<div id="outline-container-sec-3-2" class="outline-3">
<h3 id="sec-3-2">代码</h3>
<div class="outline-text-3" id="text-3-2">
<p>
相应的代码如下所示
</p>
<div class="org-src-container">
<figure class="highlight python"><table><tr><td class="code"><pre><span class="line"> <span class="number">1</span>: <span class="comment">#%% Version 4: based on Version 1, but make indexing for already retrieved information</span></span><br><span class="line"> <span class="number">2</span>: <span class="comment">#Search irreducible valid regions recurisvely for (x,y)</span></span><br><span class="line"> <span class="number">3</span>: <span class="comment">#!!no need to return any value for this recurisve function</span></span><br><span class="line"> <span class="number">4</span>: <span class="function"><span class="keyword">def</span> <span class="title">searchRegion</span><span class="params">(m,x,y)</span>:</span></span><br><span class="line"> <span class="number">5</span>: <span class="keyword">global</span> visit</span><br><span class="line"> <span class="number">6</span>: <span class="comment">#visit (x,y)</span></span><br><span class="line"> <span class="number">7</span>: visit.add((x,y))</span><br><span class="line"> <span class="number">8</span>: <span class="comment">#valid direction</span></span><br><span class="line"> <span class="number">9</span>: move = [(<span class="number">0</span>,-<span class="number">1</span>),(<span class="number">1</span>,<span class="number">0</span>),(<span class="number">0</span>,<span class="number">1</span>),(-<span class="number">1</span>,<span class="number">0</span>)]</span><br><span class="line"><span class="number">10</span>: <span class="keyword">for</span> i <span class="keyword">in</span> range(len(move)):</span><br><span class="line"><span class="number">11</span>: <span class="comment">#find neighbot (ith direction)</span></span><br><span class="line"><span class="number">12</span>: d = move[i]</span><br><span class="line"><span class="number">13</span>: nx,ny = x+d[<span class="number">0</span>],y+d[<span class="number">1</span>]</span><br><span class="line"><span class="number">14</span>: <span class="comment">#check neighbor</span></span><br><span class="line"><span class="number">15</span>: <span class="keyword">if</span> m[nx][ny] == <span class="string">'.'</span> <span class="keyword">and</span> <span class="keyword">not</span>((nx,ny) <span class="keyword">in</span> visit):</span><br><span class="line"><span class="number">16</span>: searchRegion(m,nx,ny)</span><br><span class="line"><span class="number">17</span>: </span><br><span class="line"><span class="number">18</span>: <span class="comment">#Read Input</span></span><br><span class="line"><span class="number">19</span>: I = <span class="keyword">lambda</span>:map(int,input().split())</span><br><span class="line"><span class="number">20</span>: n,m,k = I()</span><br><span class="line"><span class="number">21</span>: museum = []</span><br><span class="line"><span class="number">22</span>: <span class="keyword">for</span> _ <span class="keyword">in</span> range(n):</span><br><span class="line"><span class="number">23</span>: museum.append(input())</span><br><span class="line"><span class="number">24</span>: <span class="comment">#Indexing</span></span><br><span class="line"><span class="number">25</span>: ans = [] <span class="comment">#max_pic_num for each region</span></span><br><span class="line"><span class="number">26</span>: region = [[-<span class="number">1</span> <span class="keyword">for</span> j <span class="keyword">in</span> range(m)] <span class="keyword">for</span> i <span class="keyword">in</span> range(n)] <span class="comment"># region id for each point</span></span><br><span class="line"><span class="number">27</span>: region_id = -<span class="number">1</span></span><br><span class="line"><span class="number">28</span>: <span class="keyword">for</span> _ <span class="keyword">in</span> range(k):</span><br><span class="line"><span class="number">29</span>: x,y = I()</span><br><span class="line"><span class="number">30</span>: <span class="comment">#check wheter region including (x,y) is explored</span></span><br><span class="line"><span class="number">31</span>: <span class="keyword">if</span> region[x-<span class="number">1</span>][y-<span class="number">1</span>] == -<span class="number">1</span>:</span><br><span class="line"><span class="number">32</span>: <span class="comment">#new region</span></span><br><span class="line"><span class="number">33</span>: region_id += <span class="number">1</span></span><br><span class="line"><span class="number">34</span>: <span class="comment">#records visited points</span></span><br><span class="line"><span class="number">35</span>: visit = set()</span><br><span class="line"><span class="number">36</span>: <span class="comment">#searching valid regions</span></span><br><span class="line"><span class="number">37</span>: searchRegion(museum,x-<span class="number">1</span>,y-<span class="number">1</span>)</span><br><span class="line"><span class="number">38</span>: <span class="comment">#update region id and calculate max_pic_num</span></span><br><span class="line"><span class="number">39</span>: max_pic_num = <span class="number">0</span></span><br><span class="line"><span class="number">40</span>: <span class="keyword">for</span> p <span class="keyword">in</span> visit:</span><br><span class="line"><span class="number">41</span>: a,b = p[<span class="number">0</span>],p[<span class="number">1</span>] <span class="comment">#cannot use x,y as var_name</span></span><br><span class="line"><span class="number">42</span>: region[a][b] = region_id</span><br><span class="line"><span class="number">43</span>: max_pic_num += [museum[a][b-<span class="number">1</span>],museum[a+<span class="number">1</span>][b],museum[a][b+<span class="number">1</span>],museum[a-<span class="number">1</span>][b]].count(<span class="string">'*'</span>)</span><br><span class="line"><span class="number">44</span>: <span class="comment">#update ans</span></span><br><span class="line"><span class="number">45</span>: ans.append(max_pic_num)</span><br><span class="line"><span class="number">46</span>: print(ans[region[x-<span class="number">1</span>][y-<span class="number">1</span>]])</span><br></pre></td></tr></table></figure>
</div>
<p>
然而即使这样操作了,这段算法还是卡在了第11号测试数据上(后来发现是 <code>Python3</code> 的效率缘故,换做 <code>C++</code> 后,一次AC)。
<div class="figure"><p><center><img src="ac.jpg" alt="ac.jpg" width="80%"><figcaption>ac.jpg</figcaption></center></p></div>
</p>
</div>
</div>
</div>
<div id="outline-container-sec-4" class="outline-2">
<h2 id="sec-4">全方位的深度优先搜索</h2>
<div class="outline-text-2" id="text-4">
</div><div id="outline-container-sec-4-1" class="outline-3">
<h3 id="sec-4-1">分析</h3>
<div class="outline-text-3" id="text-4-1">
<p>
回到正题,那么这道题对我们算法实施有什么借鉴意义呢?回想前面的分析,我们主要有两个想法
</p>
<ul class="org-ul">
<li>通过深度优先搜索确定连通区域,然后确定边界,并计算可观赏到的画作数量。
</li>
<li>解决一个初始点问题,便同时解决了以该连通区域其他点为初始点的问题。因此对已解决的初始点问题的连通区域也进行缓存标记。
</li>
</ul>
<p>
也就是说我们程序的输出有两个,一是可观赏到的最多画作数量,二是起始点的连通区域。那么能否再进行深度优先搜索的同时,兼顾这两个任务,以减少代码数量呢?前述算法在进行深度优先搜索时,仅仅把递归函数当做一个过程,而并无返回值。实际上,当我们搜索到一个节点为墙时,即意味着我们看到了一副画,返回1;如果搜索到通道节点时,那么什么也没看到,返回0。同时,再搜索的过程,我们便可以标记出这些连通点的区域代号。这给了我们第二个算法优化思路,
<div class="alert alert-success"><i class="fa fa-lightbulb-o"></i> 优化2:深度优先搜索的同时,记录连通区域以及已看到的画作数量</div>
</p>
</div>
</div>
<div id="outline-container-sec-4-2" class="outline-3">
<h3 id="sec-4-2">代码</h3>
<div class="outline-text-3" id="text-4-2">
<p>
相应的代码如下
</p>
<div class="org-src-container">
<figure class="highlight python"><table><tr><td class="code"><pre><span class="line"> <span class="number">1</span>: <span class="comment">#%% Version 5: inspired by 14440455</span></span><br><span class="line"> <span class="number">2</span>: <span class="comment">#retrieve region i which includes cell (x,y) and</span></span><br><span class="line"> <span class="number">3</span>: <span class="comment">#return the max_pic_num and mark the region id for each cell</span></span><br><span class="line"> <span class="number">4</span>: <span class="function"><span class="keyword">def</span> <span class="title">search</span><span class="params">(x,y,i)</span>:</span></span><br><span class="line"> <span class="number">5</span>: <span class="keyword">global</span> region</span><br><span class="line"> <span class="number">6</span>: <span class="comment">#impassable cell</span></span><br><span class="line"> <span class="number">7</span>: <span class="keyword">if</span> museum[x][y] == <span class="string">'*'</span>: <span class="keyword">return</span> <span class="number">1</span></span><br><span class="line"> <span class="number">8</span>: <span class="comment">#already visited</span></span><br><span class="line"> <span class="number">9</span>: <span class="keyword">if</span> region[x][y] != -<span class="number">1</span>: <span class="keyword">return</span> <span class="number">0</span></span><br><span class="line"><span class="number">10</span>: <span class="comment">#mark region id</span></span><br><span class="line"><span class="number">11</span>: region[x][y] = i</span><br><span class="line"><span class="number">12</span>: <span class="comment">#explore recursively (dfs)</span></span><br><span class="line"><span class="number">13</span>: <span class="keyword">return</span> search(x,y-<span class="number">1</span>,i)+search(x+<span class="number">1</span>,y,i)+search(x,y+<span class="number">1</span>,i)+search(x-<span class="number">1</span>,y,i)</span><br><span class="line"><span class="number">14</span>: <span class="comment">#Input</span></span><br><span class="line"><span class="number">15</span>: I = <span class="keyword">lambda</span>:map(int,input().split())</span><br><span class="line"><span class="number">16</span>: n,m,k = I()</span><br><span class="line"><span class="number">17</span>: museum = []</span><br><span class="line"><span class="number">18</span>: <span class="keyword">for</span> _ <span class="keyword">in</span> range(n):</span><br><span class="line"><span class="number">19</span>: museum.append(input())</span><br><span class="line"><span class="number">20</span>: <span class="comment">#Processing</span></span><br><span class="line"><span class="number">21</span>: ans = [<span class="number">0</span> <span class="keyword">for</span> i <span class="keyword">in</span> range(n*m)] <span class="comment">#max_pic_num for some input cell</span></span><br><span class="line"><span class="number">22</span>: region = [[-<span class="number">1</span> <span class="keyword">for</span> j <span class="keyword">in</span> range(m)] <span class="keyword">for</span> i <span class="keyword">in</span> range(n)] <span class="comment">#region id for each point</span></span><br><span class="line"><span class="number">23</span>: <span class="keyword">for</span> i <span class="keyword">in</span> range(k):</span><br><span class="line"><span class="number">24</span>: x,y = I()</span><br><span class="line"><span class="number">25</span>: <span class="comment">#unexplored</span></span><br><span class="line"><span class="number">26</span>: <span class="keyword">if</span> region[x-<span class="number">1</span>][y-<span class="number">1</span>] == -<span class="number">1</span>:</span><br><span class="line"><span class="number">27</span>: ans[i] = search(x-<span class="number">1</span>,y-<span class="number">1</span>,i)</span><br><span class="line"><span class="number">28</span>: <span class="comment">#Output</span></span><br><span class="line"><span class="number">29</span>: print(ans[region[x-<span class="number">1</span>][y-<span class="number">1</span>]])</span><br></pre></td></tr></table></figure>
</div>
<p>
最终通过测试的是如下 <code>C++</code> 代码,
</p>
<div class="org-src-container">
<figure class="highlight"><table><tr><td class="code"><pre><span class="line"> 1: //version 1</span><br><span class="line"> 2: #include<cstdio></span><br><span class="line"> 3: #include<iostream></span><br><span class="line"> 4: #include<vector></span><br><span class="line"> 5: using namespace std;</span><br><span class="line"> 6: int n,m,k;</span><br><span class="line"> 7: char museum[1001][1001];</span><br><span class="line"> 8: int region[1001][1001];</span><br><span class="line"> 9: int search(int x, int y, int i)</span><br><span class="line">10: {</span><br><span class="line">11: if (museum[x][y]=='*') return 1;</span><br><span class="line">12: if (region[x][y]) return 0;</span><br><span class="line">13: region[x][y] = i;</span><br><span class="line">14: return search(x,y-1,i)+search(x,y+1,i)+search(x-1,y,i)+search(x+1,y,i);</span><br><span class="line">15: }</span><br><span class="line">16: </span><br><span class="line">17: int main()</span><br><span class="line">18: {</span><br><span class="line">19: cin>>n>>m>>k;</span><br><span class="line">20: int region_id=0;</span><br><span class="line">21: vector<int> ans;</span><br><span class="line">22: ans.push_back(0);</span><br><span class="line">23: for(int i=1;i<=n;i++) scanf("%s", museum[i]+1);</span><br><span class="line">24: for(int i=0;i<k;++i){</span><br><span class="line">25: int x,y;</span><br><span class="line">26: scanf("%d%d",&x,&y);</span><br><span class="line">27: if (!region[x][y]){</span><br><span class="line">28: region_id++;</span><br><span class="line">29: ans.push_back(search(x,y,region_id));</span><br><span class="line">30: }</span><br><span class="line">31: printf("%d\n",ans[region[x][y]]);</span><br><span class="line">32: }</span><br><span class="line">33: }</span><br></pre></td></tr></table></figure>
</div>
<p>
代码量是不是比之前要少多了啊~
</p>
</div>
</div>
</div>
<div id="outline-container-sec-5" class="outline-2">
<h2 id="sec-5">反思</h2>
<div class="outline-text-2" id="text-5">
<p>
本题目其实就是深度优先搜索的变种,并且给了我如下两个经验。
</p>
<ul class="org-ul">
<li>如果日后有需要解决类似问题的需求,那么最好现在做缓存,以减少日后的重复计算。【恰逢AlphaGo 3:0获胜人机大战,值得一提的是这次AlphaGo的大量自我对弈以及棋谱学习,其实也是一种缓存】
</li>
<li>更高效的利用过程主导的递归函数来更新所需要的输出值
</li>
</ul>
</div>
</div>
Codeforces - 598D Igor In the Museum 解题报告,带记忆的深度优先搜索
Codeforces - 598C Nearest vectors
http://blog.greenwicher.com/2016/02/15/CF-598C/
2016-02-15T00:00:00.000Z
2016-12-30T06:22:51.000Z
<p>
从系统的角度来看,给定一个算法问题和输入,要使得计算机输出正确的结果,那么必须保证至少下面三个环节是正确无误的。
</p>
<ul class="org-ul">
<li>算法设计 (思维上的构建)
</li>
<li>算法实施 (代码上的构建)
</li>
<li>算法运行 (计算机硬件上的构建)
</li>
</ul>
<p>
这其中的任一环节出现了错误,都无法保证最终的正确结果。前两个环节主要取决于人的能力(理解问题,解决问题)与细心程度,而最后一个环节重点在于人对计算机的底层理解。换句话说,即使问题在我们的脑海中已被完美解决,但在算法运行时,计算机对该问题的重新表达可能会出现偏差。最常见的偏差就是计算机精度问题,毕竟是以离散来逼近连续,出现『精确的错误』是在所难免的。但当正确性和高精度只能二选一时,显然没有人会因为高精度而追求精确的错误。这篇文章就以<a href="http://codeforces.com/contest/598/problem/C#" target="_blank" rel="external">Codeforces 598C</a>这道题来探讨第三个环节算法运行中的精度问题。这道题目本身并不难,但在正式比赛中只有57个人AC,仅低于F题。说其不难,是因为算法设计以及算法实施环节太显而易见了,但这么低的AC率就是因为大多数人在这道题精度上出了问题。
</p>
<a id="more"></a>
<div id="outline-container-sec-1" class="outline-2">
<h2 id="sec-1">问题描述</h2>
<div class="outline-text-2" id="text-1">
<div class="figure">
<p><img src="http://greenwicher.qiniudn.com/CF-598C-P.jpg" alt="CF-598C-P.jpg" width="800px">
</p>
</div>
<p>
这道<a href="http://codeforces.com/contest/598/problem/C#" target="_blank" rel="external">题</a>的基本意思是说,给定n个二维向量,找出夹角(小于180度的那个夹角)最小的那两个向量出来。
</p>
</div>
</div>
<div id="outline-container-sec-2" class="outline-2">
<h2 id="sec-2">初步思考</h2>
<div class="outline-text-2" id="text-2">
</div><div id="outline-container-sec-2-1" class="outline-3">
<h3 id="sec-2-1">分析</h3>
<div class="outline-text-3" id="text-2-1">
<p>
读罢此题,感觉这也太简单不过了。既然要找出夹角最小的两个向量出来,那么只要计算出任意两两向量的夹角,然后找到其中最小的不就好了么。但仔细一想,其实没有必要对任意两两向量进行计算,因为给定一个向量,离它最近的向量无外乎是顺时针方向或者逆时针方向最近的。这也给了我们第一个优化算法的思路,
</p>
<p>
<div class="alert alert-success"><i class="fa fa-lightbulb-o"></i> 优化1:先对这n个二维向量按照从(1,0)向量的逆时针夹角进行排序,然后计算相邻向量的夹角</div>
</p>
</div>
</div>
<div id="outline-container-sec-2-2" class="outline-3">
<h3 id="sec-2-2">代码</h3>
<div class="outline-text-3" id="text-2-2">
<p>
相应的代码实现如下所示,
</p>
<div class="org-src-container">
<figure class="highlight python"><table><tr><td class="code"><pre><span class="line"> <span class="number">1</span>: <span class="keyword">from</span> math <span class="keyword">import</span> *</span><br><span class="line"> <span class="number">2</span>: <span class="comment">#stores counterclockwise angle between vector (1,0) and each vector in a</span></span><br><span class="line"> <span class="number">3</span>: a = []</span><br><span class="line"> <span class="number">4</span>: n = int(input())</span><br><span class="line"> <span class="number">5</span>: <span class="keyword">for</span> _ <span class="keyword">in</span> range(n):</span><br><span class="line"> <span class="number">6</span>: x,y = map(int,input().split())</span><br><span class="line"> <span class="number">7</span>: <span class="comment">#calculate counterclockwise angle between (1,0) and this vector</span></span><br><span class="line"> <span class="number">8</span>: t = acos(x/sqrt(x**<span class="number">2</span>+y**<span class="number">2</span>))</span><br><span class="line"> <span class="number">9</span>: a.append([<span class="number">2</span>*pi-t,t][y>=<span class="number">0</span>])</span><br><span class="line"><span class="number">10</span>: <span class="comment">#sorting a</span></span><br><span class="line"><span class="number">11</span>: b = sorted(a)</span><br><span class="line"><span class="number">12</span>: <span class="comment">#calculate difference of angle between adjacent vectors</span></span><br><span class="line"><span class="number">13</span>: c = [b[i+<span class="number">1</span>]-b[i] <span class="keyword">for</span> i <span class="keyword">in</span> range(n-<span class="number">1</span>)]</span><br><span class="line"><span class="number">14</span>: c.append(b[-<span class="number">1</span>]-b[<span class="number">0</span>])</span><br><span class="line"><span class="number">15</span>: c = [[<span class="number">2</span>*pi-foo,foo][foo<pi] <span class="keyword">for</span> foo <span class="keyword">in</span> c]</span><br><span class="line"><span class="number">16</span>: <span class="comment">#find the nearest vectors</span></span><br><span class="line"><span class="number">17</span>: i_min = c.index(min(c))</span><br><span class="line"><span class="number">18</span>: <span class="keyword">if</span> i_min!=n-<span class="number">1</span>:</span><br><span class="line"><span class="number">19</span>: i1 = a.index(b[i_min+<span class="number">1</span>])</span><br><span class="line"><span class="number">20</span>: i2 = a.index(b[i_min])</span><br><span class="line"><span class="number">21</span>: <span class="keyword">else</span>:</span><br><span class="line"><span class="number">22</span>: i1 = a.index(b[<span class="number">0</span>])</span><br><span class="line"><span class="number">23</span>: i2 = a.index(b[-<span class="number">1</span>])</span><br><span class="line"><span class="number">24</span>: print(i1+<span class="number">1</span>,i2+<span class="number">1</span>)</span><br></pre></td></tr></table></figure>
</div>
<p>
然而正如文章头所说的,这段算法遇到了高精度问题。第119号测试数据如下,其中的第一和第二个向量极其接近,同时第三和第四个向量也非常接近,因此导致了麻烦。那么到底哪里出了问题?以及如何解决呢?
</p>
<div class="figure">
<p><img src="http://greenwicher.qiniudn.com/CF-598C-T119.jpg" alt="CF-598C-T119.jpg" width="800px">
</p>
</div>
</div>
</div>
</div>
<div id="outline-container-sec-3" class="outline-2">
<h2 id="sec-3">精度问题</h2>
<div class="outline-text-2" id="text-3">
</div><div id="outline-container-sec-3-1" class="outline-3">
<h3 id="sec-3-1">分析</h3>
<div class="outline-text-3" id="text-3-1">
<p>
浮点数在计算机中以二进制形式表达,因此其精度必然面临着二进制表达位数的限制。但如果你以为,无限的提高二进制表达位数,就可以获得某些浮点数的真实值的话,那就错了。这是因为某些十进制小数,用二进制表达的话,也会出现类似十进制小数中的无穷循环。举个例子十进制的0.1,其二进制表达为 <code>0.0001100110011001100110011001100110011001100110011...</code> 。因此无论增加多少二进制表达存储位数,都无法真正表达0.1的真实值。因此,计算机中往往保留的只是其近似值。再以 <code>python</code> 举个例子,
</p>
<div class="org-src-container">
<figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="prompt">>>> </span><span class="number">.1</span> + <span class="number">.1</span> + <span class="number">.1</span> == <span class="number">.3</span></span><br><span class="line"><span class="keyword">False</span></span><br><span class="line"><span class="prompt">>>> </span>round(<span class="number">.1</span> + <span class="number">.1</span> + <span class="number">.1</span>, <span class="number">10</span>) == round(<span class="number">.3</span>, <span class="number">10</span>)</span><br><span class="line"><span class="keyword">True</span></span><br></pre></td></tr></table></figure>
</div>
<p>
因此,尽管二进制小数的精度问题似乎没有很好的解决方案,但当我们遇到类似小数高精度问题时,一定要多加留心。类似的讨论,请参考<a href="http://www.pythondoc.com/pythontutorial3/floatingpoint.html" target="_blank" rel="external">浮点数算法:争议和限制</a>。
</p>
<p>
那么面对这类高精度问题,我们可以有如下两种解决办法,
</p>
<ul class="org-ul">
<li>提高程序中的变量精度要求,如单精度变为双精度( <code>float -> dobule -> long double</code> )
</li>
<li>另辟蹊径
</li>
</ul>
<p>
对第一种方法而言 <code>python</code> 无法声明数据类型,其默认浮点类型等价于 <code>c++</code> 中的 <code>double</code> 类型,因此必须借助于第三方的package来达到此目的,比如说,
</p>
<ul class="org-ul">
<li><a href="http://docs.scipy.org/doc/numpy-1.10.1/user/basics.types.html" target="_blank" rel="external">numpy.float128</a>
</li>
<li><a href="http://www.gmpy.org/" target="_blank" rel="external">GMPY</a>
</li>
</ul>
<p>
这样一来,应该可以应付绝大多数问题。但如果这些已有的高精度数据类型还是不够高,那怎么办?本文,接下来就来提供另一种思路。
</p>
</div>
</div>
<div id="outline-container-sec-3-2" class="outline-3">
<h3 id="sec-3-2">高精度等价表达</h3>
<div class="outline-text-3" id="text-3-2">
<p>
首先,我们再审一遍题,本题的目的是要找到夹角最小的两个向量。我们的解决办法是先按极角对向量排序,然后计算相邻向量的夹角或者夹角等价表达式,最后找出最小的。这只是问题到答案的一条路径,而该路径借助于度量相邻向量之间的夹角。但最终的答案只是要我们找出最接近的两个向量,而并不需要知道他们到底有多近,换句话说这道题不是基数优化,而是序数优化。那既然不去算相邻向量的夹角或等价表达式,那应该怎么办呢?值得注意的是,到目前为止,我们衡量任意两向量$a,b$的夹角$θ<sub>ab</sub>$都是用的如下表达式,
</p>
<p>
$$ \cos \theta_{ab} = \frac{a \cdot b}{\Vert a \Vert \Vert b \Vert} $$
</p>
<p>
那么如果向量$a,b$是我们最终的答案,那对任意其他向量$c,d$(假设其夹角为 \(\theta_{cd}\) ),会有什么样的结果呢?显然,那就是
</p>
<p>
$$\cos \theta_{ab} = \frac{a \cdot b}{\Vert a \Vert \Vert b \Vert} \ge \frac{c \cdot d}{\Vert c \Vert \Vert d \Vert} = \cos \theta_{cd}$$
</p>
<p>
既然是因为浮点数据中的小数带来的精度问题,那干脆我们就不要除法和求根了,简简单单的乘法和加法就不会损失精度了。
</p>
<p>
<div class="alert alert-success"><i class="fa fa-lightbulb-o"></i> 优化2:不考虑除法和求根,直接利用等价表达式来检验是否最优</div>
</p>
<p>
换言之,我们通过,如下表达式,来判断$a,b$是否是最终的答案,
</p>
<p>
$$ (abs(a \cdot b) a \cdot b) (\Vert c \Vert \Vert d \Vert)^{2} \ge (abs(c \cdot d) c \cdot d) (\Vert a \Vert \Vert b \Vert)^{2} $$
</p>
</div>
</div>
<div id="outline-container-sec-3-3" class="outline-3">
<h3 id="sec-3-3">代码</h3>
<div class="outline-text-3" id="text-3-3">
<p>
相应的代码如下所示
</p>
<div class="org-src-container">
<figure class="highlight python"><table><tr><td class="code"><pre><span class="line"> <span class="number">1</span>: <span class="keyword">from</span> math <span class="keyword">import</span> *</span><br><span class="line"> <span class="number">2</span>: <span class="comment"># stores counterclockwise angle between vector (1,0) and each vector in a</span></span><br><span class="line"> <span class="number">3</span>: a = []</span><br><span class="line"> <span class="number">4</span>: n = int(input())</span><br><span class="line"> <span class="number">5</span>: <span class="keyword">for</span> i <span class="keyword">in</span> range(n):</span><br><span class="line"> <span class="number">6</span>: x,y = map(int,input().split())</span><br><span class="line"> <span class="number">7</span>: <span class="comment"># calculate counterclockwise angle between (1,0) and this vector</span></span><br><span class="line"> <span class="number">8</span>: t = acos(x/sqrt(x**<span class="number">2</span>+y**<span class="number">2</span>))</span><br><span class="line"> <span class="number">9</span>: a.append((i+<span class="number">1</span>,[<span class="number">2</span>*pi-t,t][y>=<span class="number">0</span>],x,y))</span><br><span class="line"><span class="number">10</span>: cmp = <span class="keyword">lambda</span> x:x[<span class="number">1</span>]</span><br><span class="line"><span class="number">11</span>: a = sorted(a,key=cmp)</span><br><span class="line"><span class="number">12</span>: <span class="comment"># construct pairs for adjacent vectors</span></span><br><span class="line"><span class="number">13</span>: b = []</span><br><span class="line"><span class="number">14</span>: <span class="keyword">for</span> i <span class="keyword">in</span> range(n):</span><br><span class="line"><span class="number">15</span>: i1,i2 = a[i][<span class="number">0</span>],a[(i+<span class="number">1</span>)%n][<span class="number">0</span>]</span><br><span class="line"><span class="number">16</span>: x1,y1 = a[i][<span class="number">2</span>:]</span><br><span class="line"><span class="number">17</span>: x2,y2 = a[(i+<span class="number">1</span>)%n][<span class="number">2</span>:]</span><br><span class="line"><span class="number">18</span>: inner_prod = x1*x2 + y1*y2</span><br><span class="line"><span class="number">19</span>: inner_prod *= abs(inner_prod)</span><br><span class="line"><span class="number">20</span>: norm_prod = ((x1**<span class="number">2</span>+y1**<span class="number">2</span>)*(x2**<span class="number">2</span>+y2**<span class="number">2</span>))</span><br><span class="line"><span class="number">21</span>: b.append((i1,i2,inner_prod,norm_prod))</span><br><span class="line"><span class="number">22</span>: <span class="comment"># find the nearest vectors</span></span><br><span class="line"><span class="number">23</span>: better = <span class="keyword">lambda</span> p1,p2: p1[<span class="number">2</span>]*p2[<span class="number">3</span>]>p2[<span class="number">2</span>]*p1[<span class="number">3</span>]</span><br><span class="line"><span class="number">24</span>: ans = b[-<span class="number">1</span>]</span><br><span class="line"><span class="number">25</span>: <span class="keyword">for</span> i <span class="keyword">in</span> range(n):</span><br><span class="line"><span class="number">26</span>: <span class="keyword">if</span> better(b[i],ans):</span><br><span class="line"><span class="number">27</span>: ans = b[i]</span><br><span class="line"><span class="number">28</span>: print(ans[<span class="number">0</span>],ans[<span class="number">1</span>])</span><br></pre></td></tr></table></figure>
</div>
</div>
</div>
</div>
<div id="outline-container-sec-4" class="outline-2">
<h2 id="sec-4">反思</h2>
<div class="outline-text-2" id="text-4">
<p>
如果你耐心的看完了这篇文章,或许你会觉得这道题不值得一提,毕竟绝大多数情况下,不会出现这么变态的高精度测试数据。即使出现了,往往提高浮点数数据类型的精度也可以避免这个问题。但这篇文章,其实想说的还是 <code>正本清源</code> ,认真理解题目的要求,而不去做要求以外的事情,走出思维的定式。下面简单总结了我的几点感悟,
</p>
<ul class="org-ul">
<li>简单的方法可以处理大部分情况,复杂的方法只是为了迎合少数的情况
</li>
<li>具体到个人的要求,来选择简单方法还是复杂方法
</li>
<li>小心高精度浮点数陷阱
</li>
<li>遇到瓶颈了,试着对问题或者方法进行同构表达
</li>
<li>题目不要求准确值的话,尽量采取序数优化
</li>
</ul>
</div>
</div>
Codeforces - 598C Nearest Vectors 解题报告,高精度问题
部署个性化子域名网站到Github
http://blog.greenwicher.com/2016/02/15/部署个性化子域名网站到Github/
2016-02-15T00:00:00.000Z
2016-12-05T04:12:47.000Z
<p>
最近几年,越来越多的人基于Jekyll,Octopress或者Hexo等渲染框架在Github上建立了自己的静态博客。有了这些渲染框架后,你只要知道最基本的 <code>markdown</code> 语法(对于Emacs用户,会用 <code>org mode</code> ),选择一个自己喜欢的网站主题,然后其他事情基本就不需要关心了。这样的好处是,写作者能更加专心于写作内容,同时更加方便的把自己的思想见解经验在互联网上共享出来。关于如何利用以上技术在Github或者Gitcafe上建立个人博客的文章几乎已经漫天飞了,但是有的时候我们更希望拥有一个全面的网站,这个网站可以包含我们的维基子站点或者项目子站点。但是目前的文章以及渲染技术主要都是针对个人博客的建设,本文试图弥补这个空缺,提出利用Github Pages来部署个性化子域名站点的方法。读完本文,你就可以创建诸如 <code>wiki.greenwicher.com</code> 或者 <code>love.greenwicher.com</code> 这类的子站点了。
</p>
<a id="more"></a>
<div id="outline-container-sec-1" class="outline-2">
<h2 id="sec-1">准备</h2>
<div class="outline-text-2" id="text-1">
<p>
首先,你需要准备如下东西以及了解一些基本知识
</p>
<ul class="org-ul">
<li>基本的Shell命令
</li>
<li>Github账户以及Git基本知识
</li>
<li>一个静态站点文件夹(根目录包含index.html)
</li>
<li>个人域名(可在GoDaddy或者阿里云上注册)
</li>
<li>DNSPod.cn账户
</li>
</ul>
<p>
如对接下来介绍的内容有不懂的地方,请自行谷歌或者进行留言。
</p>
</div>
</div>
<div id="outline-container-sec-2" class="outline-2">
<h2 id="sec-2">提交静态站点到Github</h2>
<div class="outline-text-2" id="text-2">
</div><div id="outline-container-sec-2-1" class="outline-3">
<h3 id="sec-2-1">静态站点获取</h3>
<div class="outline-text-3" id="text-2-1">
<p>
这里我以<a href="https://github.com/gabrielecirulli/2048" target="_blank" rel="external">Github上的2048</a>项目来作为静态站点的例子,如果你已经有个人的静态站点,那么请忽略这一小节,直接到静态站点上传小节。
</p>
<div class="figure">
<p><img src="http://greenwicher.qiniudn.com/2048.jpg" alt="2048.jpg" width="800px">
</p>
</div>
<p>
首先在上面的图片,点击 <code>Fork</code> ,这样对方的repository就会被拷贝到你自己的账户下。接下来在terminal下,复制被 <code>Fork</code> 过来的repository到你想要的本地路径下(比如说是 <code>your_dir</code> )。
</p>
<div class="org-src-container">
<figure class="highlight"><table><tr><td class="code"><pre><span class="line">cd your_dir
git clone https://github.com/Greenwicher/2048.git</span><br></pre></td></tr></table></figure>
</div>
<p>
接下来在你的本地 <code>your_dir</code> 打开index.html,是不是就可以在本地玩2048啦~ 接下来我们要在根目录下新建CNAME文件,并输入你的个性化子域名,比如说我这里的
</p>
<pre class="example">
2048.greenwicher.com
</pre>
<p>
至此,我们的静态站点部分修改就基本完成了。
</p>
</div>
</div>
<div id="outline-container-sec-2-2" class="outline-3">
<h3 id="sec-2-2">静态站点上传</h3>
<div class="outline-text-3" id="text-2-2">
<p>
基于Github Pages,我们可以为每一个repository建立project主页。然后,通过访问 <code>https://username.github.io/repository_name</code> 来访问该project主页。值得注意的是该project的主页静态站点需存放在 <code>gh-pages</code> 分支下。
接下来需要一些git的基本知识。首先如果没有 <code>gh-pages</code> 分支的话,先进行创建
</p>
<div class="org-src-container">
<figure class="highlight"><table><tr><td class="code"><pre><span class="line">git checkout --orphan gh-pages</span><br></pre></td></tr></table></figure>
</div>
<p>
否则,转到该分支下
</p>
<div class="org-src-container">
<figure class="highlight"><table><tr><td class="code"><pre><span class="line">git checkout gh-pages</span><br></pre></td></tr></table></figure>
</div>
<p>
接下来在 <code>your_dir</code> 根目录下,输入如下shell命令。
</p>
<div class="org-src-container">
<figure class="highlight"><table><tr><td class="code"><pre><span class="line">git add .
git commit -m "Add CNAME"
git push origin gh-pages</span><br></pre></td></tr></table></figure>
</div>
<p>
如果一切顺利的话,你现在就可以在 <code>https://username.github.io/repository_name</code> 或者 <code>http://yourdomain/repository_name</code> 来查看该静态网站。但是还不可以通过 <code>https://xxx.username.github.io</code> 或者 <code>http://xxx.yourdomain</code> 来访问。
</p>
</div>
</div>
</div>
<div id="outline-container-sec-3" class="outline-2">
<h2 id="sec-3">个性化子域名设置</h2>
<div class="outline-text-2" id="text-3">
</div><div id="outline-container-sec-3-1" class="outline-3">
<h3 id="sec-3-1">添加子域名</h3>
<div class="outline-text-3" id="text-3-1">
<p>
我的 <code>greenwicher.com</code> 是在GoDaddy上注册的,于是需要在该网站进行新增子域名服务。找到 <code>域名->管理DNS</code> ,点击进入之后,设置子域名。
</p>
<div class="figure">
<p><img src="http://greenwicher.qiniudn.com/GoDaddy%E5%AD%90%E5%9F%9F%E5%90%8D.jpg" alt="GoDaddy%E5%AD%90%E5%9F%9F%E5%90%8D.jpg">
</p>
</div>
</div>
</div>
<div id="outline-container-sec-3-2" class="outline-3">
<h3 id="sec-3-2">DNS解析</h3>
<div class="outline-text-3" id="text-3-2">
<p>
终于到了最后一步,我们需要在<a href="https://www.dnspod.cn" target="_blank" rel="external">DNSPod</a>上设置域名解析。进入首页之后,点击域名解析。选择要添加子域名的主域名,进行添加CNAME记录。其中主机记录为子域名,记录值为 <code>username.github.io</code>
</p>
<div class="figure">
<p><img src="http://greenwicher.qiniudn.com/DNSPod_CNAME.jpg" alt="DNSPod_CNAME.jpg">
</p>
</div>
</div>
</div>
</div>
<div id="outline-container-sec-4" class="outline-2">
<h2 id="sec-4">成品</h2>
<div class="outline-text-2" id="text-4">
<p>
最终的成品如下图所示,这样就有个性化域名子网站啦~
</p>
<div class="figure">
<p><img src="http://greenwicher.qiniudn.com/2048%E6%88%90%E5%93%81.jpg" alt="2048%E6%88%90%E5%93%81.jpg">
</p>
</div>
</div>
</div>
<div id="outline-container-sec-5" class="outline-2">
<h2 id="sec-5">参考资料</h2>
<div class="outline-text-2" id="text-5">
<ul class="org-ul">
<li><a href="https://help.github.com/articles/about-custom-domains-for-github-pages-sites/" target="_blank" rel="external">About custom domains for GitHub Pages sites</a>
</li>
<li><a href="https://github.com/iissnan/hexo-theme-next/issues/54" target="_blank" rel="external">新版本功能提议 #54</a>
</li>
<li><a href="http://www.jianshu.com/p/e7413116e9d4" target="_blank" rel="external">Hexo搭建WiKi</a>
</li>
<li><a href="http://blog.zfan.me/2015/09/03/%E4%B8%BA%E9%83%A8%E7%BD%B2%E5%9C%A8Github%E4%B8%8A%E7%9A%84Hexo%E5%8D%9A%E5%AE%A2%E7%BB%91%E5%AE%9A%E4%B8%AA%E6%80%A7%E5%9F%9F%E5%90%8D/" target="_blank" rel="external">为部署在Github上的Hexo博客绑定个性域名</a>
</li>
</ul>
</div>
</div>
本文介绍了如何利用Github Pages来部署个性化子域名站点
神奇公式,并不神奇
http://blog.greenwicher.com/2014/12/06/神奇公式,并不神奇/
2014-12-06T09:33:12.000Z
2016-12-05T04:12:47.000Z
<p>万物之始,大道至简,衍化至繁。后来者的我们面对纷繁的股票市场,如何才能把握最初的本质?神奇公式试图回答这一问题,通过投资回报率发现一家质优的好公司,通过收益率发现一家价低的好股票,然后持有直至市场恢复理性给予质优价低股票合理的价格为止。通过历史回测,作者确实发现利用神奇公式可以跑赢大盘不少,但神奇公式的一个原则是你要深信不疑的相信,直到市场恢复理性的那一天。面对神奇公式是有效的这个不可证伪的命题,我们不经疑问,作者为什么要公布这一有效可以持续获利的秘密呢?</p>
<a id="more"></a>
<h1 id="u611F_u609F"><a href="#u611F_u609F" class="headerlink" title="感悟"></a>感悟</h1><p>神奇公式,并不神奇</p>
<p>万物之始,大道至简,衍化至繁。任何高度复杂化的体系都是由最基础的要素逐渐丰富构建所得的,而当越来越多的新手打算进入一个『世界』当中之时,这个『世界』一定是产生了某种有趣的东西足以吸引越来越多的新手。换句话说,这时的『世界』已经具有一定的复杂性了。复杂的『世界』不容易理解,而当你把它拆分还原为最初的形态,把握最本质的东西,问题便变得简单了。不仅如此,如果可能的话,进行进一步推衍,可以试图重现已有的元素和发现未知的元素。信息、知识以几何增长的速度充斥着这个世界,若迷乱于这复杂的表象之中,以有涯随无涯,则殆矣。有些问题,不是你想的不够复杂,而是你想的不够简单。技术分析,量化投资无疑增加了投资的复杂度,同时敏感度又十分大,但这并不是说他们就不是好的方法。万变不离其宗,条条大路通罗马,这也增加了这个世界的趣味性。但各种大路之中,目的一定最终都是朝向罗马的,大部分路径可能都有着相同的特征,而把握的本质便是去伪存真找出最关键的因素出来。具体到股票投资而言,选股选时是最基本但最重要的两个决策。《股市稳赚》主要介绍了如何利用神奇公式进行选股,具体本书的思维框架请见<a href="http://goo.gl/hNTLCr" target="_blank" rel="external">http://goo.gl/hNTLCr</a>。</p>
<p>之所以说,神奇公式并不神奇,是因为神奇公式所体现的背后思想是一个普世的真理,低买高卖便能获取超额收益。神奇公式便是通过投资回报率发现一家质优的好公司,通过收益率发现一家价低的好股票。这里有两个问题需要回答。*首先,如何定义投资回报率以及收益率?*本文作者在附录中有提到他认为的指标,即投资回报率=EBIT/(净流动资本+净固定资产),收益率=EBIT/企业价值。好的指标需要有很好的财务会计理解,辅以普世真理即可。豆瓣上有个『神奇公式』小组,组长土丁记录了他自己两年多来的选股记录,并且提供了自己的指标(详见<a href="http://www.douban.com/group/topic/32275731/" target="_blank" rel="external">点我</a>)。*其次,如何把握神奇公式的结果一定准确?*这里需要安全边际的概念,即选择严重低估质优的股票,至于如何选择,大致选择排序最前的股票就可以。但个人也得注意一些异常的数据,如果能在最终购买之前研读相关股票的报表公告和分析基本面的话最好。</p>
<p>然而,神奇公式的有效性也是一个不可证伪的命题。因为一是需要等待很长的时间等待市场先生回归理性,二是这个等待的截止日期不确定。换言之,如果最终确实上涨了,那是因为你等到了市场理性回归,若目前还未上涨,那是因为时机还未到。在这样的情况下,作者建议神奇公式的信徒一定要矢志不移的信服,显得有些可疑,至于最终信或不信是你自己的问题。至于我本人而言,我觉得神奇公式还是可信的。一是其中的内在逻辑值得信服,就是最重要的两个指标可能各有理解。二是我大致回测了土丁神奇公式小组的股票记录,表现确实不错。唯一不足的就是,何时卖出并没有很好的依据。一种可能的指标可能是看股票排序过去一段时间的下降速度是否增大,若增大很有可能是市场即将回归理性。这一思路也可以反着用,即通过股票排序上升速度来看某一股票最近是否出现了严重的市场不理性。其次,神奇公式最好还是只是作为选股的一个前期筛选器,后期还是需要研读财报和分析竞争优势,壁垒来判断基本面的。</p>
<p>另一个有意思的问题是,如果神奇公式真的有价值,作者为什么会把它贡献出来?如果大家都知道了,那不会影响神奇公式的有效性么。我觉得关于这个问题,可以有以下几种情况。第一,作者掌握更加全面复杂的神奇公式。所谓万物之始,大道至简,衍化至繁。作者所处的层次可能要比我们高好几层,他有更好的策略来实施。第二,这是一个圈套。如果很多人都使用神奇公式的话,那么作者便可以了解这一类投资者的投资模式,进而有更好的策略针对这种策略来进行投资。第三,作者是一个好人。他希望资源能够得到合理分配,市场最终能够及早理性,好公司能一展宏图,促进社会和经济的发展。这也是有可能的,比如在赚钱之后这一章,作者就表明了很多赚钱之后做好事的倾向。另外,从资源的合理分配而言,金融市场并不是都做恶的,比如索罗斯导致的亚洲金融风暴,从某种角度来看,并不一定是件坏事,苍蝇不盯无缝的蛋。只有有了问题不纠正才会出现问题,如果纠正了便不会出现。这时,便有好事者替天行道,敲醒不愿直面现实的人们,赚钱只是最终的副产品(当然,最后这些钱还是会以合理的方式流入到社会需要资源的地方)。事情并不像我们想的那么简单。</p>
<p>总体而言,本书的目的是*在了解公司、投资、股市、股票的本质基础上,利用市场先生短期的非理性,通过神奇公式筛选出质优价低的股票,长期持有(股票组合的数量因投资人专业能力而异,持有时间因避税等等而异)直至市场先生重新回归理性,给予质优价低股票合理的价格牟取盈利。*本书重在选股,以及信念的树立,选时(尤其卖出)方面讲的比较少。虽然拥有神奇公式可以一劳永逸,但是作者一直申明对你所做决策一定要明白理解,想得通透才可以。本书小巧精简,也不啰嗦,通过柏拉图式的自问自答逐渐寻求真理。提一个好的问题远比回答问题更重要,对当前知道什么,不知道什么的足够了解是发现问题的基础,时时审视自己,构造逻辑链,推理链。真理在很长时间内是一成不变的,寻求到了真理,把握住便成功了。本书值得多读多品味,其实神奇公式的初衷便是发现质优价低的股票,而如何发现才是最关键的,这一步需要对财务会计有很深的理解才能构建自己的指标。关于神奇公式筛选机制的应用可以参考:</p>
<ul>
<li><a href="http://www.douban.com/group/423430" target="_blank" rel="external">豆瓣神奇公式小组</a></li>
<li><a href="http://www.ichangtou.com/#filter:main.html" target="_blank" rel="external">长投网的搜搜栏目</a></li>
<li><a href="https://github.com/prstcsnpr/qmagicformula" target="_blank" rel="external">土丁的神奇公式中国版</a></li>
</ul>
<h1 id="u6982_u89C8"><a href="#u6982_u89C8" class="headerlink" title="概览"></a>概览</h1><h2 id="u5143_u6570_u636E"><a href="#u5143_u6570_u636E" class="headerlink" title="元数据"></a>元数据</h2><ul>
<li>作者:乔尔·格林布拉特</li>
<li>出版社:中信出版社</li>
<li>出版年:2007-04</li>
<li>页数:181</li>
<li>ISBN:9787508608372</li>
<li>豆瓣评分:7.8</li>
</ul>
<h2 id="u7EB2_u8981"><a href="#u7EB2_u8981" class="headerlink" title="纲要"></a>纲要</h2><ul>
<li>目的:在了解公司、投资、股市、股票的本质基础上,利用市场先生短期的非理性,通过神奇公式筛选出质优价低的股票,长期持有(股票组合的数量因投资人专业能力而异,持有时间因避税等等而异)直至市场先生重新回归理性,给予质优价低股票合理的价格牟取盈利。本书重在选股,以及信念的树立,选时(尤其卖出)方面讲的比较少。虽然拥有神奇公式可以一劳永逸,但是作者一直申明对你所做决策一定要明白理解,想得通透才可以。</li>
<li>点评:本书小巧精简,也不啰嗦,通过柏拉图式的自问自答逐渐寻求真理。提一个好的问题远比回答问题更重要,对当前知道什么,不知道什么的足够了解是发现问题的基础,时时审视自己,构造逻辑链,推理链。真理在很长时间内是一成不变的,寻求到了真理,把握住便成功了。本书值得多读多品位,其实神奇公式的初衷便是发现质优价低的股票,而如何发现才是最关键的,这一步需要对财务会计有很深的理解才能构建自己的指标。</li>
</ul>
<h1 id="u6846_u67B6"><a href="#u6846_u67B6" class="headerlink" title="框架"></a>框架</h1><h2 id="u4E00_u5802_u6295_u8D44_u542F_u8499_u8BFE"><a href="#u4E00_u5802_u6295_u8D44_u542F_u8499_u8BFE" class="headerlink" title="一堂投资启蒙课"></a>一堂投资启蒙课</h2><ul>
<li>如何做生意:低买高卖</li>
<li>如何买生意:资产估值、考虑风险(竞争、成长性)、安全边际</li>
<li>资产价格真会严重低于资产价值么:会的,因为非理性、各种突发情况</li>
</ul>
<h2 id="u6700_u57FA_u672C_u7684_u56DB_u79CD_u6295_u8D44_u6E20_u9053"><a href="#u6700_u57FA_u672C_u7684_u56DB_u79CD_u6295_u8D44_u6E20_u9053" class="headerlink" title="最基本的四种投资渠道"></a>最基本的四种投资渠道</h2><ul>
<li>实用主义者的消费观<ul>
<li>『最重要的是要攒钱去买所需要的或将来需要的东西,而不是浪费钱财买一个需要沿街追上三四分钟的巨大的气象气球』</li>
</ul>
</li>
<li>四种最基本的投资渠道<ul>
<li>压箱底,存钱罐</li>
<li>把钱存到银行</li>
<li>买公司债或者国债</li>
<li>投资股票市场</li>
</ul>
</li>
</ul>
<h2 id="u80A1_u7968_u7A76_u7ADF_u662F_u600E_u4E48_u56DE_u4E8B"><a href="#u80A1_u7968_u7A76_u7ADF_u662F_u600E_u4E48_u56DE_u4E8B" class="headerlink" title="股票究竟是怎么回事"></a>股票究竟是怎么回事</h2><ul>
<li>公司估值、股票数目与股票价格(相当于众筹购买一个大资产)<ul>
<li>公司市值受到股票价格的影响,而股票价格短期很容易受到市场情绪波动,因此公司市值短期波动会很大</li>
<li>公司价值受到公司自身运营与市场需求影响,因此公司价值短期波动不会很大</li>
<li>因此,通过发现短期被低谷的股票可以进行套利</li>
</ul>
</li>
<li>持有股票意味着什么:意味着拥有企业的一部分(或一定的利益),因此你有权获得该企业未来收益的一部分。</li>
<li>投资回报率的分析<ul>
<li>是否高于市场无风险收益率</li>
<li>未来成长是否会持续</li>
<li>对自身预估准确的把握有多少</li>
</ul>
</li>
</ul>
<h2 id="u4EF7_u683C_u3001_u4EF7_u503C_u548C_u5B89_u5168_u7A7A_u95F4"><a href="#u4EF7_u683C_u3001_u4EF7_u503C_u548C_u5B89_u5168_u7A7A_u95F4" class="headerlink" title="价格、价值和安全空间"></a>价格、价值和安全空间</h2><ul>
<li>事实:公司股价存在巨大波动,因而公司市值会发生巨大波动</li>
<li>猜想:公司的实际价值一般变化不会很大</li>
<li>推论:若猜想正确,则公司价值存在低估情况,在合理安全边际下购入低价公司即可。价格、价值的背离可能是来源于人们不够理智(贪婪,恐惧导致的一致预期惯性)</li>
</ul>
<h2 id="u6295_u8D44_u56DE_u62A5_u7387_u4E0E_u6536_u76CA_u7387"><a href="#u6295_u8D44_u56DE_u62A5_u7387_u4E0E_u6536_u76CA_u7387" class="headerlink" title="投资回报率与收益率"></a>投资回报率与收益率</h2><ul>
<li>指标<ul>
<li>收益率:等于每股收益/股价(附录作者又修正了这两个指标)。正常情况,同行业类似公司的每股收益应该不会有太大的差异,因此被低估的公司有更高的收益率。</li>
<li>投资回报率:等于回报/投资(同上,指标需要进一步细化)。给定相同投资,回报越高,说明某家公司发现机会的能力越好,经营的效益也约好。</li>
</ul>
</li>
<li>策略<ul>
<li>正三观:对未来指标的预测复杂困难,不如看历史和现状(基本面和市场面)</li>
<li>思想:购入质优(投资回报率要高)价低(收益率要高)的股票。质优反映了是一家好公司,而价低反映了是一只好股票。</li>
</ul>
</li>
</ul>
<h2 id="u9009_u62E9_u8D28_u4F18_u4EF7_u4F4E_u7684_u80A1_u7968"><a href="#u9009_u62E9_u8D28_u4F18_u4EF7_u4F4E_u7684_u80A1_u7968" class="headerlink" title="选择质优价低的股票"></a>选择质优价低的股票</h2><ul>
<li>策略:按照收益率、投资回报率两项指标排序,等权重选择股票</li>
</ul>
<h2 id="u795E_u5947_u516C_u5F0F"><a href="#u795E_u5947_u516C_u5F0F" class="headerlink" title="神奇公式"></a>神奇公式</h2><ul>
<li>本章讲述了对神奇公式的回测</li>
</ul>
<h2 id="u795E_u5947_u516C_u5F0F_u5E76_u4E0D_u662F_u65F6_u523B_u6709_u6548"><a href="#u795E_u5947_u516C_u5F0F_u5E76_u4E0D_u662F_u65F6_u523B_u6709_u6548" class="headerlink" title="神奇公式并不是时刻有效"></a>神奇公式并不是时刻有效</h2><ul>
<li>美国独立战争为何会获胜<ul>
<li>因为对手太愚蠢(鲜艳的军服,整齐划一的动作)</li>
<li>但英军以往打胜仗时不也是这样么</li>
<li>说明依据历史来预测有其局限性,应该因时制宜,具体情况具体分析</li>
</ul>
</li>
<li>神奇公式需要等待很长时间,等待市场重新回归理性才有效,持不住的心态将会有损最终收益(但具体等多久,作者没有说,这是一个不可证伪的命题)</li>
</ul>
<h2 id="u4F18_u8D28_u516C_u53F8_u4F18_u8D28_u5728_u54EA_u513F"><a href="#u4F18_u8D28_u516C_u53F8_u4F18_u8D28_u5728_u54EA_u513F" class="headerlink" title="优质公司优质在哪儿"></a>优质公司优质在哪儿</h2><ul>
<li>高投资回报率的两面性<ul>
<li>好处:有机会把利润进行再投资,进而获得一个非常高的收益增长率</li>
<li>坏处:市场看到相应的投资机会,加速该行业的竞争,导致投资回报率降到价低水平为止(因此竞争优势和壁垒会与一家公司的可持续成长很重要)</li>
</ul>
</li>
</ul>
<h2 id="u5E02_u573A_u603B_u4F1A_u90A3_u4E48_u60C5_u7EEA_u5316_u4E48"><a href="#u5E02_u573A_u603B_u4F1A_u90A3_u4E48_u60C5_u7EEA_u5316_u4E48" class="headerlink" title="市场总会那么情绪化么"></a>市场总会那么情绪化么</h2><ul>
<li>需要注意什么投资风险<ul>
<li>从长期看,遵循该投资策略可能出现的亏损风险在哪里?</li>
<li>从长期看,你所选择的投资策略逊于其他投资策略所带来的风险是什么?</li>
</ul>
</li>
<li>市场的两面性<ul>
<li>短期:投票机</li>
<li>长期:称重机</li>
</ul>
</li>
</ul>
<h2 id="u5927_u591A_u6570_u4EBA_u6CA1_u6709_u80FD_u529B_u72EC_u7ACB_u9009_u62E9_u4E2A_u80A1"><a href="#u5927_u591A_u6570_u4EBA_u6CA1_u6709_u80FD_u529B_u72EC_u7ACB_u9009_u62E9_u4E2A_u80A1" class="headerlink" title="大多数人没有能力独立选择个股"></a>大多数人没有能力独立选择个股</h2><ul>
<li>需要掌握预测今后几年该公司的正常收益,据此来计算收益率和投资回报率</li>
<li>真正了解你投资的公司的话,可以降低投资组合股票数量</li>
</ul>
<h2 id="u80A1_u7968_u5E02_u573A_u91CC_u6CA1_u6709_u7259_u4ED9"><a href="#u80A1_u7968_u5E02_u573A_u91CC_u6CA1_u6709_u7259_u4ED9" class="headerlink" title="股票市场里没有牙仙"></a>股票市场里没有牙仙</h2><ul>
<li>股票市场里没有牙仙,必须依靠自己</li>
<li>几种股票投资方式<ul>
<li>股票经纪人</li>
<li>互利基金</li>
<li>对冲基金</li>
<li>指数基金</li>
</ul>
</li>
</ul>
<h2 id="u8D5A_u94B1_u4E4B_u540E"><a href="#u8D5A_u94B1_u4E4B_u540E" class="headerlink" title="赚钱之后"></a>赚钱之后</h2><ul>
<li>投资消费观:尽量攒钱,花时间找到更好的投资方法,利用复利的力量,收获更多。</li>
<li>把钱投资到需要钱的地方上(资源的正确合理分配)</li>
</ul>
<h2 id="u5E94_u7528_u6307_u5BFC"><a href="#u5E94_u7528_u6307_u5BFC" class="headerlink" title="应用指导"></a>应用指导</h2><ul>
<li>本章描述了一步一步如何利用神奇公式构造投资策略</li>
</ul>
<h2 id="u9644_u5F55"><a href="#u9644_u5F55" class="headerlink" title="附录"></a>附录</h2><h3 id="u795E_u5947_u516C_u5F0F-1"><a href="#u795E_u5947_u516C_u5F0F-1" class="headerlink" title="神奇公式"></a>神奇公式</h3><ul>
<li>投资回报率:EBIT/(净流动资本+净固定资产)。不用ROE,ROA的指标,是因为不同公司的负债和税率水平会有所不同。</li>
<li>收益率:EBIT/(企业价值EV)。不用P/E的原因是EV既考虑了购买一家企业所付出的股本价格,又考虑了一家公司为了产生经营收益而背负的债务。</li>
</ul>
<h3 id="u6709_u6548_u5E02_u573A_u7406_u8BBA"><a href="#u6709_u6548_u5E02_u573A_u7406_u8BBA" class="headerlink" title="有效市场理论"></a>有效市场理论</h3><h1 id="u6458_u6284"><a href="#u6458_u6284" class="headerlink" title="摘抄"></a>摘抄</h1><ul>
<li>【序言V】这本书最好的地方,就是大多数人不会相信书中的内容,即使相信,也不会有耐心照着书中所说的去做。这很好,因为越多的人知道一个东西非常好时,这个东西就会变得越发昂贵。</li>
<li>【序言VI】如果上百万人都采用这种方法(率先尝试者一定要抢先抓住低价基金),有两件事情将会发生。第一件,按照此种方法投资的优势将会减弱,但不会消失。第二件,股市的价值将比原先更为合理,我们的资金配置将更为有效。</li>
<li>【P6】『等一下,』本脱口而出,『这听起来太简单了。如果一桩生意值1000美元,有谁会以500美元的价格出售它呢?』</li>
<li>【P7】困难是你必须听一个很长的故事,需要花时间理解这个故事,而且最重要的是,你必须相信这个故事是真实的。事实上,这故事中包含着一个能够让你致富的神奇公式。我并没有开玩笑。不幸的是,如果你不相信这公式会让你致富,它就不会发挥作用。另一方面,如果你相信我要讲给你的故事,我是说真正的相信,你就可以选择在使用或不使用公式的情况下赚钱。(公式将大大减少你需要花费的时间和精力,给多数人带来更好的成果。读完本书后,你就可以决定如何去做了。)</li>
<li>【P10】最重要的是要攒钱去买所需要的或将来需要的东西,而不是浪费钱财买一个需要沿街追上三四分钟的巨大的气象气球。</li>
<li>【P29】购买企业的股票就意味着购买企业的一部分(或一定的利益),因此你有权获得该企业未来收益的一部分。</li>
<li>【P38】最伟大的股市评论家以及思想家之一本杰明·格雷厄姆曾这样认为:想象一下你与一位叫做『市场先生』的狂人共同拥有一家企业。市场先生的情绪一直不稳定,每天他都会以特定的价格想你出售或者购买股份。市场先生经常会让你自己做决定,你每天可以有3个选择:你可以按市场先生的价格向他出售你的股份,可以以同样的价格向市场先生购买股份,也可以既不买也不卖。有时候市场先生的情绪比较好,他出的价格会比企业实际价值高很多。在这些日子里,向市场先生出售你的股份似乎更划算。在其他一些日子,市场先生情绪低落,给出了极低的价格,这时,你一定想利用市场先生要以低价卖给你股份的疯狂决定,购买他所占有的股份。如果市场先生的定价既不高也不低,你可能就会选择原地不动了。</li>
<li>【P48】简而言之,我们所有的问题其实都归结于一点:预测未来是一件很难的事情。如果我们不能预测一家公司未来的收益状况,我们就不能确定该公司的价值。如果我们不能确定该公司的价值,当市场先生有时做出疯狂的举动,给出不可思议的低价格时,我们就不会意识到。与其让我们关注那些我们所不知道的事情,还不如让我们看看我们都知道的情况吧。</li>
<li>【P105】尽管我不是一个好的航海者,但我还是喜欢航海。这就是许多股市投资者在股市上的感觉。他们可能并不精于股市投资,甚至他们不知道自己是否适合于进行这种投资,但他们乐于享受投资的过程或经历。</li>
<li>【P143】如果你明白所投资的25美分能在你人到中年时变成200美元,你就不会把钱浪费在一片口香糖上了!你不会把钱花在很多事情上,反而会开始考虑尽量攒钱,花时间找到好的投资方法,这就是我想说的。</li>
<li>【P161】为了成功的利用神奇公式投资策略,你只需要了解两个基本原则。首先,以低价买入优质股是有意义的。一般来说,神奇公式能做到这一点。第二,市场先生需要几年时间才能认识什么是低价。因此,利用神奇公式投资策略需要有耐心。</li>
</ul>
关于《股市稳赚》的读书笔记
嚼得菜根,做得大事
http://blog.greenwicher.com/2014/12/03/嚼得菜根,做得大事/
2014-12-03T00:00:00.000Z
2016-12-05T04:12:47.000Z
<p>
嚼得菜根,做得大事是母校前身的校训。这一句话虽然看似很空泛很鸡汤,你或许会说身体力行更为重要,但前进的路途中不时会忘记初心,忘记这些简单的真理。知行合一,一直觉得大道至简,与其以有涯随无涯,耗散自身宝贵的精力迷乱于千种选择和缤纷信息,不如选好一个方向,坚持下去,对人生做复利,终成正果。
</p>
<p>
投资也如此,随机致富的傻瓜少而又少,但面对这复杂的世界,机会可谓是何时何地总会有的。因此达到全局最优可能是奢望,但即使是局部最优也足以让你收获颇多。因此我们应该做的是有把握的选择能力圈内的最好决策,而非捡了芝麻丢了西瓜的随意决策。真正研究股票本质(基本面,市场面,无谓投资或者投机,只要并非简单交易提供流动性就好),即使最终无法让你的财富增长,也可以丰富你的阅历和见识,总之而言,可能辛苦,但并非一件苦差事。至于具体的股票投资,选股选时可谓最基本但也是最重要的决策。
</p>
<a id="more"></a>
<p>
选股方面,从选股的流程角度来看,可以分为两种类型。一是自上而下的选股(详见王成的《策略投资》),这种选股方式从宏观的角度开始分析(如人口结构、技术发展、经济增长、通货膨胀、政府政策、国际金融、市场供需与情绪等等),进而转至大的宏观对整个股票市场的影响。受到宏观经济影响的股票可能包括周期类股票、利率敏感类股票;人口结构的趋势会影响到消费类、医药类、娱乐类的股票。如果宏观层面看好的话,选择相应行业的龙头股票即可直至周期下行。因此,自上而下的选股方式要求对当前所处周期的状态以及持续时间进行判断,进而选择相应行业/概念来进行投资。但宏观层面的各个因素可能会互相矛盾,谁占主导可能不得而知;并且,一般周期变化都会较长,入门投资者很难经历完整的投资周期,因而缺乏相关经验。
</p>
<p>
因此,另一种选股方式,自下而上的选股相对而言更适用于各个时期各种投资者的能力。自下而上的选股分两个层面,首先,分析公司(基本面),通过分析公司的竞争优势和成长空间来判断是否是好公司;其次,分析股票(投资面),通过分析股票是否存在安全边际以及股性(反映股票波动性)来判断当前是否是好股票。具体而言,三类公司与股票分析的混合体,业绩复苏类、高速成长类、热门动量类是表现最好的三类股票(可见作者深受成长投资的影响)。因此,自下而上的选股方式的难点是筛选出三类明星股票,然后分析其基本面(公司本身,行业本身,甚至再与国外市场对比)与投资面是否适宜。
</p>
<p>
选时方面作者介绍的相对少一些,值得一提的是针对制造类企业的费雪买点。但普世的选时方式,个人觉得可以首先分析市场情绪,大致判断涨跌的概率;再结合基本面,确认安全边际是否妥当。如果,一切顺利的话,便买入,等待并关注公司基本面情况直到假设逻辑不在再卖出股票。
</p>
<p>
本人理工科出身,以前的投资想法便是通过分析历史数据,构建各种指标为投资信号。但后来觉得宁要模糊的准确,勿要精确的错误其实很重要。模型很难顾及到各个方面,因而敏感性很大,而人的优势在于能够有把握的把握核心。不过,话虽如此,定量化的指标还是可以作为辅助的依据。但如何获得定量化的指标却是个主观但又很重要的内容,比如说『别人恐惧时我贪婪,别人贪婪时我恐惧』,那么如何衡量贪婪或者恐惧?假设测量出恐惧或贪婪之后,如何与以往的历史对比,而说明当前情绪的剧烈程度?
</p>
<p>
除了,选股选时之外,仓位的选择,信念的构建也是很重要的投资要素。
</p>
关于《专业投资者选股策略、方法和工具》的书评
毕设开题不会写,怎么破?快试试BiblioPy吧!
http://blog.greenwicher.com/2014/03/02/毕设开题不会写,怎么破?快试试BiblioPy吧!/
2014-03-02T12:25:43.000Z
2016-12-30T05:15:34.000Z
<p>春花秋月何时了,毕设开题开不了。导师昨夜又催稿,学渣不堪回首发呆中。学长论文应犹在,只是用不了。问君能有几多愁?恰似一江春水向东流。怎么破!怎么破!快来试试<a href="https://github.com/Greenwicher/BiblioPy" target="_blank" rel="external"><strong>BiblioPy</strong></a>吧!</p>
<a id="more"></a>
<h1 id="BiblioPy_u7B80_u4ECB"><a href="#BiblioPy_u7B80_u4ECB" class="headerlink" title="BiblioPy简介"></a>BiblioPy简介</h1><p>本科时我的毕业论文题目是『生产与运作管理研究趋势分析』,也就是对研究本身的研究啦,隶属文献计量学与自然语言处理范畴。<strong>主要目的是为生产与运作管理领域的研究者提供该领域的核心研究话题群以及话题演变动态模式。核心研究话题群可以为初涉该领域的人员提供宏观的鸟瞰,话题演变动态模式可以为久扎某个领域的人员提供新的研究方向。</strong>本人对Sebastian Grauwin的<a href="http://www.sebastian-grauwin.com/?page_id=492" target="_blank" rel="external">BiblioTools2</a>进行了部分修改重写,使之能按照文献计量学的主流方法co-citation来进行分析,目前只完成了核心研究话题群的识别。因为整套方法论基本适用于所有学科的分析,因此希望自己写的这个小脚本对大家学术研究入门之路能有所帮助,也希望大家能给我提些建议。</p>
<h1 id="u5DE5_u4F5C_u539F_u7406"><a href="#u5DE5_u4F5C_u539F_u7406" class="headerlink" title="工作原理"></a>工作原理</h1><p>因为牵涉到一些专业术语,我就简单的说明一下<a href="https://github.com/Greenwicher/BiblioPy" target="_blank" rel="external"><strong>BiblioPy</strong></a>的工作原理。</p>
<h2 id="step1__u6587_u732E_u6570_u636E_u83B7_u53D6"><a href="#step1__u6587_u732E_u6570_u636E_u83B7_u53D6" class="headerlink" title="step1 文献数据获取"></a>step1 文献数据获取</h2><p>据相应搜索条件从web of science核心数据库上下载文献数据(包括文章的标题、关键词、摘要、引文等等),文献数据格式为制表符分割的UTF8纯文本文件。因为web of science一次最多下载500条记录,如果记录过多的话,只能多次下载获得。</p>
<p><img src="http://greenwicher.qiniudn.com/20141204-BiblioPy-Intro/wos-txt.jpg" alt=""></p>
<h2 id="step2__u5EFA_u7ACB_u6587_u7AE0-_u5F15_u6587_u77E9_u9635"><a href="#step2__u5EFA_u7ACB_u6587_u7AE0-_u5F15_u6587_u77E9_u9635" class="headerlink" title="step2 建立文章-引文矩阵"></a>step2 建立文章-引文矩阵</h2><p>文章-引文矩阵的行标代表所有文章标号,列标代表所有引文标号。矩阵中的元素表示该行标所代表的文章是否引用了该列标所代表的引文,取值0或1,1表示二者存在引用关系。</p>
<h2 id="step3__u5EFA_u7ACB_u540C_u88AB_u5F15_u7F51_u7EDC"><a href="#step3__u5EFA_u7ACB_u540C_u88AB_u5F15_u7F51_u7EDC" class="headerlink" title="step3 建立同被引网络"></a>step3 建立同被引网络</h2><p>根据上述的文章-引文矩阵,以每篇引文作为网络中的结点,网络中边的权重表示相应结点的相似性(即都引用了这两篇引文的文章的数目),建立同被引网络(co-citation networks)。</p>
<p><img src="http://greenwicher.qiniudn.com/20141204-BiblioPy-Intro/co-citation-network.jpg" alt=""></p>
<h2 id="step4__u5BF9_u7F51_u7EDC_u8FDB_u884C_u805A_u7C7B"><a href="#step4__u5BF9_u7F51_u7EDC_u8FDB_u884C_u805A_u7C7B" class="headerlink" title="step4 对网络进行聚类"></a>step4 对网络进行聚类</h2><p>其实在step2结束之后,可以利用PCA或MDS进行降维处理,但是为了体现网络的结构特性,这里用了网络聚类。就是指利用网络的拓扑结构将网络中的结点分成不同的几个群体,不同的群体有不同的研究话题。</p>
<p><img src="http://greenwicher.qiniudn.com/20141204-BiblioPy-Intro/co-citation-network-cluster.jpg" alt=""></p>
<h2 id="step5__u53D1_u73B0_u8BDD_u9898"><a href="#step5__u53D1_u73B0_u8BDD_u9898" class="headerlink" title="step5 发现话题"></a>step5 发现话题</h2><p>目前使用的方法是自然语言处理中的TextRank,TF-IDF算法来对每一聚类中的关键词代表性进行排序。这里除了给出每个聚类的top关键词外,还给出了top reference和top author等,并利用LaTex生成了相应的聚类分析报告,如下图所示。</p>
<p><img src="http://greenwicher.qiniudn.com/20141204-BiblioPy-Intro/report.jpg" alt=""></p>
<p><img src="http://greenwicher.qiniudn.com/20141204-BiblioPy-Intro/graph.jpg" alt=""></p>
<h1 id="u7ACB_u523B_u5C1D_u8BD5"><a href="#u7ACB_u523B_u5C1D_u8BD5" class="headerlink" title="立刻尝试"></a>立刻尝试</h1><p>文献综述的撰写可以根据上述报告中的Top Keyword和Top Reference部分综合得出,Keyword体现了该话题下的研究人员们之前都做了什么(相当于综述啦),而Reference部分则体现了他们是怎么做的(大概搜下文献,稍微看下abstract就可以了)。也欢迎对学术有所兴趣,但不知道自己所学专业重要方向的同学来试试<a href="https://github.com/Greenwicher/BiblioPy" target="_blank" rel="external"><strong>BiblioPy</strong></a>~ 目前的脚本只是个demo,并且web of science的下载受到IP限制,后续有时间和精力的话,会把完善的<a href="https://github.com/Greenwicher/BiblioPy" target="_blank" rel="external"><strong>BiblioPy</strong></a>以网页版呈现并开发动态性话题变迁以及趋势发现的功能。因此目前,只能人工从web of science下载数据,然后自己运行脚本和LaTeX来分析和生成报告了。</p>
<p>对文献计量软件感兴趣的同学也可以试试类似的软件:</p>
<p>BiblioTools2.x: <a href="http://www.sebastian-grauwin.com/?page_id=492" target="_blank" rel="external">http://www.sebastian-grauwin.com/?page_id=492</a></p>
<p>CiteSpace: <a href="http://cluster.cis.drexel.edu/~cchen/citespace/" target="_blank" rel="external">http://cluster.cis.drexel.edu/~cchen/citespace/</a></p>
<p>HistCite: <a href="http://histcite.com" target="_blank" rel="external">http://histcite.com</a></p>
文献话题挖掘工具BiblioPy介绍