Ubuntu下使用VSCode连接Github

VSCode是微软开源的一个很强大的IDE,可以支持几乎所有编程语言,而且是跨平台的,Linux用户终于可以用上宇宙最强IDE了。我最近在使用VSCode编写调试Python项目,其调试功能很强大,和VS上调试C++的感觉是一样的,强烈推荐。 VSCode还可以连接Github,进行版本控制。下面以我最近学习的深度学习项目为例,介绍下怎样在Ubuntu下使用VSCode连接Github。以我fork的repo为例:https://github.com/01joy/neural-networks-and-deep-learning。 连接Github有两种方式,一种是HTTPS,另一种是SSH,在每个repo页面的右边,有一个Clone or download按钮,可以获取到这两种连接方式的地址。HTTPS方式和网址类似,以HTTPS开头;SSH方式以git@githu.com开头。使用HTTPS连接比较简单,但是每次push的时候需要输入用户名和密码,比较麻烦,如果想记住密码,需要把用户名和密码以明文的形式保存到一个文件中,个人感觉不方便且不安全。下面以SSH连接为例进行介绍。 首先设置Github提交时的用户名和密码,一般设置成全局的:https://help.github.com/articles/setting-your-username-in-git/、https://help.github.com/articles/setting-your-commit-email-address-in-git/ 生成一对新的SSH公钥和私钥,并添加到ssh-agent中。注意生成的时候需要输入passphrase,这个passphrase不是Github的密码,自己随便取一个记住就好。https://help.github.com/articles/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent/ 把SSH的公钥添加到Github账号中:https://help.github.com/articles/adding-a-new-ssh-key-to-your-github-account/ 测试SSH连接是否成功:https://help.github.com/articles/testing-your-ssh-connection/ (可选)修改SSH密码,即第1步设置的passphrase:https://help.github.com/articles/working-with-ssh-key-passphrases/ 到这里,本级就能通过SSH连接Github了。 如果没有安装VSCode,可以直接通过Ubuntu的终端连接Github,步骤如下: 在本地创建一个和远程repo名称一样的空文件夹 终端cd到该文件夹内 git init # 在该文件夹内初始化 git remote add origin git@github.com:01joy/notes-on-writing.git # 使用repo的SSH地址 git pull origin master # 把远程代码拉到本地 修改代码 git add . # 在根目录执行,添加所有修改 git commit -m ‘comments’ # commit第7步添加的修改 git push origin master # 把第8步发布到远程 如果安装了VSCode,其实和直接用终端是一样的,在菜单栏的Terminal下新建一个终端,在这个终端内执行上述代码,如果在第4步出现”Enter password to unlock the private key”时,输入创建SSH时第2步的密码即可,只需一次,下次就不用再输入密码了。点击File的Open Folder打开本地repo文件夹。点击VSCode左边栏的Explorer可以在编辑器下修改代码。切换到左边栏的Source Control可以进行Git相关操作,修改的文件右边会出现一个M,点击这个M会出现diff视图;Source Control左边的右上角有三个点,点击这个按钮会出现很多Git操作,包括commit、push等,其实相当于调用上述代码,效果是一样的。 VSCode快捷键Ctrl+Shift+P会出现命令窗口,在里面输入commit、push等会出现相关操作的,能起到一定的加速效果,当然也可以自定义快捷键。 Have Fun!

November 13, 2018 · 1 min

Word2016批注行距太大的问题

最近导师给我批注文章,说我的Word文档的批注行距极大,从入学到现在一直都是如此,对他造成了极大的困扰,希望我能解决这个问题。 但是我自己用Word2016查看导师的批注,看不出行距极大的问题,显示完全是正常的。后来猜测导师用的是旧版的Word2010,于是在虚拟机中安装了Word2010,进行测试。 经过长时间的Debug,终于发现问题所在。Word针对批注有一个默认的样式,为“批注文字(使用前隐藏)”,可以点击样式右下角的箭头,或者直接按快捷键Ctrl+Shift+Alt+S调出样式窗口。然后点击底部的管理样式就可以看到所有的样式了。有意思的是,批注文字样式默认是隐藏的,所以在下图的样式列表中是找不到这个样式的。 找到批注文字样式,点击修改,在弹出的窗口中点击左下角的格式,选择段落,就可以看到批注的默认格式了。段落格式看不出什么异常,Word2016和Word2010的批注段落格式都是一样的,其中“如果定义了文档网格,则对齐到网格”都是默认选中的。 有意思的是,Word2016和Word2010对网格的默认设置却不一样。在布局、页面设置中点击右下角的箭头,打开页面设置对话框。切换到文档网格选项卡。 Word2016默认指定了行网格,而Word2010默认却是无网格。因为批注文字样式中选中了“如果定义了文档网格,则对齐到网格”这个选项,Word2016默认指定了行网格,所以批注文字会对齐到行网格,导致行间距太大,Word2010默认没有指定任何网格,所以其批注文字的行间距是正常。 Word2016文档网格,默认指定了行网格 Word2010文档网格,默认无网格 解决办法就是,修改Word2016的设置,选中“无网格”,并设置为默认值,这样以后新建的Word文档默认都是无网格,批注的行间距也就正常了。

September 1, 2018 · 1 min

2017年终总结

2017年是目前为止最折腾的一年。 科研工作 今年的科研任务包括两个方面,一方面是pLink2软件的完善和发布,另一方面是完成pLink2文章初稿。软件方面,上半年忙着修改完善算法,下半年重写界面代码,修改各种bug并反复测试。最终在12月31日晚通过邮件正式发布。文章方面,元旦软件发布之后,一月份抽两周时间完成了初稿,算是自己的第一篇全英文初稿,正文加附录接近一万词。不过因为有一个实验结果不太好,还需要接着完善算法,文字也很稚嫩,需要反复修改。希望能在2018年上半年投出去。 个人提高 上半年忙着找工作,一直在刷题看书攒面经,经过自己的不懈努力,收获了微软、百度、头条、Face++等心仪的Offer。在确定自己找工作没问题之后,被李沐的博客“忽悠”,下半年华丽丽的转博了,赶在了2015级最后一次转博前夕。 因为找工作,看了7本专业书;因为有Kindle,以及忙里偷闲,竟也看了9本非专业书。元旦完成软件发布任务之后,奖励自己去电影院连看了一整天的电影,这种休假方式也是蛮奇葩的,今年累计去电影院看的电影数已经达到16了。上半年和欣欣看了一场“OFO轻睐演唱会”,第一次参加演唱会,现场的感觉和看视频不一样,气氛很热烈,大家都很兴奋,会情不自禁跟着一起唱。国庆第一次一个人远行,去了郑州、登封和杭州,加上12月份参加厦门质谱会议,今年去的第三个城市已经达到了4个。 运动方面。在两个师兄的帮助以及室友的陪练下,真的学会了蛙泳,今年8月份还拿到了深水证,为此贺老师每个月奖励我100块钱,简单粗暴又有效的奖励机制:-)。临近年底的时候,心血来潮,准备提高乒乓球技术,混入了所里的乒乓球圈子,拜师王老师门下,经过训练以及看视频学习,竟偶尔能赢浩哥了,今年再接再厉。 今年约好了和哥一起回家过年,给家里买了一台55寸的乐视超级电视,给父母的红包也涨了不少。总体来说,家里在一年一年变好。 对照年初定的目标, 发表pLink 2文章。只完成了初稿。 至少完成毕业工作的80%。转博了。 刷完LeetCode所有简单题和中等题,找工作之前最好刷完两遍。完成。 找到一个满意的工作。完成,具体请看https://bitjoy.net/posts/2018-02-04-2018-campus-recruiting/。 读10本书。完成16:《编程珠玑》、《C++ Primer》、《程序员面试笔试宝典》、《STL源码剖析》、《剑指Offer》、《深度探索C++对象模型》、《编程之美》、《人间失格》、《枪炮、病菌与钢铁》、《杀死一只知更鸟》、《别闹了,费曼先生》、《月亮与六便士》、《突破极限》、《解忧杂货店》、《北京折叠》、《以色列,一个国家的诞生123》。 去电影院看10场电影。完成16:《爱乐之城》、《摔跤吧!爸爸》、《银河护卫队2》、《战狼2》、《敦刻尔克》、《羞羞的铁拳》、《看不见的客人》、《东方快车谋杀案》、《寻梦环游记》、《帕丁顿熊2》、《芳华》、《解忧杂货店》、《前任3:再见前任》、《无问西东》、《南极之恋》、《太空救援》。 看一场话剧(音乐会、歌剧等都可以)。完成。2017年7月2日,北京工人体育场,OFO轻睐演唱会。 学会游泳。完成,学会蛙泳和踩水,年中拿到深水证。 去第三个城市。完成,国庆去了郑州、登封、杭州,12月份第一次坐飞机去了厦门。 总体来说,2017年的目标都完成了,而且好几项是超额完成。2018年目标如下: 发表pLink2文章,科研的重中之重。 开展新课题,或SUMO或深度学习。 完成博士课程的学习。 读10本书。 去电影院看10场电影。 去北京公园年票范围中的19家公园。 看一场话剧(音乐会、歌剧等都可以)。 学会自由泳。 乒乓球稳赢。 去第三个城市。 机动目标,高温假带父母来北京玩。 突然发现每年的目标都差不多,读万卷书和行万里路是每年都有的保留项目。 找工作,分手,转博,软件发布,文章写作构成了我2017年的365天,喜忧参半,在跌跌撞撞中前行。2018年要保持一如既往的冲劲,打赢转博之后的第一仗!

February 18, 2018 · 1 min

一念成博

证明你能做一件事的最好方法就是做成这件事! 从保研开始,我根本就没打算读博士,心里想的是,好好学习,认真刷题,顺利毕业,高薪就业。 2016年底,也就是进实验室半年之后,贺老师开始“怂恿”我读博:“贫寒人家子弟,有个高学历,在这个拼爹的时代,更容易出人头地。年轻时多读点儿难读的书,也会更好地在未来人工智能时代生存。”我不为所动。 2017年春节在家,疯狂刷题看书,为开学后的实习面试以及半年之后的校招面试准备着。 2017年2月份,开年工作计划会,老师说只要我愿意读博,博士的三个课题都帮我规划好了,要知道我们实验室没有哪个博士生是在三年级之前就确定方向的,大家都是摸着石头过河。 我还是不为所动,疯狂刷题看书,攒实习面经。 到了8月,老师最后来信希望我能认真考虑一下读博的事情:“pFind+NIBS是难得的良性成长环境,换一个新环境未见得能成长像现在这么快”。甚至把我的博士女朋友都搬出来了。我跟欣欣聊了聊,思想开始有点动摇了。但是那段时间忙于找工作,没空想太多。 9月10日教师节,我和欣欣分手,与工作无关,与硕士博士无关。 后来有一天,当我在对比百度凤巢和微软的Offer时,偶然看到凤巢前辈李沐博士写的一篇博客:《博士这五年》。李沐是上海交大ACM班的,毕业之后去了百度凤巢,但是后来毅然辞职去CMU攻读博士学位。博士五年期间,他不但发表了多篇很牛的paper,而且亲手写了一个类似TensorFlow的深度学习平台MXNet,MXNet现已加入Apache家族,并被Amazon选为官方深度学习框架。他博士答辩的评委有来自Google, Amazon, Apple的AI负责人,阵容非常强大。最后,李沐光荣毕业,加入Amazon。 这篇博客的结尾在谈到如何选择工作和读博时有一段话,令我印象深刻:“不过我觉得还是会选择读博。赚钱以后还有大把时间可以,但是能花几年时间在某个领域从入门到精通甚至到推动这个领域发展的机会就一次……更重要的是理想和情怀。人一生要工作五十年,为什么不花五年来追求下理想和情怀呢?”。 看完这篇博客之后,那一整天,我都没心思上班。校招至今,拿了一堆Offer,不能说轻而易举,但是我现在知道拿Offer就跟考试一样,只要准备好,不会差到哪里去。甚至可以说,校招面试比回答贺老师的问题要简单多了。未来可以工作的时间还很长,何不花几年时间来挑战自己呢。当你在面对两难选择时,选择更难的那个,日后你会感谢当初自己的选择。 人拼了命的工作,到底是为了什么,除了更早的成为工厂里的螺丝钉,成为房奴、孩奴,你还能得到什么。是的,提前三年工作,你也许能赚到100万,能积累更丰富的工作经验和更广阔的人脉。但是,这又怎样,这些东西该来的肯定会来,博士毕业之后,我同样能得到,只是比大多数人晚了一点。 与其早早毕业,成为一个nobody,还不如再潜心修炼几年,成为somebody。博士这几年,我能得到更加系统全面的训练,pFind+NIBS的良性科研环境,也不可多得。曾经在知乎上看到有个人回答为什么选择读博:“在一个很安全的环境里,父母健在,自己不用操心赚钱养家;有老板给你提供指导、资金;你可以安心研究自己感兴趣的问题;发表的文章也将署上自己的名字,流传后世;习得的技能也将转化为自己的能力;获得的博士学位也将是自己的荣誉…”,这么好的事情,为什么不去做呢? 那一天之后,我内心几乎就决定要转博了。 然而,话虽如此,想到要放弃到手的大Offer,继续在实验室里待至少三年;想到免不了要经历大多数博士师兄师姐们经历过的痛苦日子;想到彼时同学们都已经年入x万,有房有车,说不定我日后的面试官就是现在的同学;想到我最亲密的女朋友对我的不信任;想到自己的苦衷无处倾诉… 那段日子过得很艰难,也许是我到目前为止最低谷的时期。左手是各大互联网公司的Offer,立即可以实现我很多的愿望;右手是若干年未知的博士磨砺。虽然内心知道往右走是正确的,但还是下不了这个狠心。脑海中的两个小人,吵个不停。 期间和很多在读的、已毕业的博士师兄师姐们聊过,也和很多公司的面试官聊过,当然也和老师父母聊过。得到的回答无外乎三种:读、不读,根据自己的情况决定。这些谈话更像是换了种方式的倾述,我已经记不清具体的内容了,只知道,我做选择的决心越来越坚定了。 之后恰逢十一长假,给自己放了一个长长的假。规划去了郑州、登封、杭州。了却夙愿,重新开始。 10月9日,长假结束。我给老师发了一封邮件:“贺老师,您好。非常感谢您的信任和等待,我决定读博了!这将是我人生二十多年来所作的第一个重大决定,我接受挑战!” 人这一生,说长也长,说短也短,去做你认为对的事情吧,去追求你想要的生活。愿我们都能绽放美丽,不负芳华!

February 14, 2018 · 1 min

伪·2018届校招面经

作为一名曾经的2018届硕士毕业生,为找工作忙活了大半年,最终收获了微软、百度、头条、Face++等十多个Offer。校招季对我来说,在9月份就差不多结束了。本来很早就酝酿了这篇博客,但是由于之后一系列事情,耽搁至今,趁着提交完年终技术报告,回家之前,把这段经历记录一下。 首先介绍一些计算机专业校招的基本情况。由于移动互联网、人工智能等浪潮的兴起,计算机专业的毕业生就业前景可谓一片大好,尤其是对于名校毕业基础扎实的同学,应届生薪资倒挂老员工的事情几乎每年都在上演。所以首先祝贺所有CSer,这是属于你们的时代,各行各业都有属于你的舞台,尽情去施展才华吧。 本专业的毕业生就业去向主要有这么几类:国内互联网公司、国外互联网公司(外企)、国企。其中国内互联网公司又分大厂和新兴创业公司,大厂如BAT、网易、360、京东、华为等,创业公司主要集中在人工智能这块,如商汤科技、Face++、头条、滴滴等。外企大概也分为两类,一类是来自日本的企业,比如Indeed、WAP;另一类是来自美国的企业,比如Microsoft、Google、Hulu、FreeWheel、Amazon等。国企是指传统的国有企业里面的IT部门,比如各大银行、证监会等。这几类公司的校招时间刚好都错开了,一般来说,日企来华校招是最早的,大概每年5月份就来了;接着是国内互联网公司的内推季,大概在7~8月份;进入9月份之后,就是国内互联网公司的正式校招了;美国的企业大概会在9~10月份启动校招,有可能一直持续到11月份;国企就比较晚了,听说最晚能持续到第二年3、4月份的。这种安排,对我们来说,既是好事,也是坏事,好处就是对于纠结的同学,可以每种类型的公司都试一试,多拿几个offer,最后根据自己的情况决定去哪里;坏处就是持续时间真的很长,面到最后,身心俱疲,需要做好心理准备。 我经历过的面试主要是国内互联网和部分外企的研发岗,下面也将主要介绍这两类企业,按时间先后顺序。 Indeed(FAILED) Indeed是全球最大的招聘信息搜索引擎公司,总部位于美国德州的首府奥斯汀,2012年被日本的Recruit收购,然后成立了Indeed Tokyo办公室。本文提到的Indeed都是指Indeed Tokyo,即拿到offer的话,要求去东京工作,不过可以轮转去奥斯汀总部。 Indeed是最早开始校招的,当国内公司还在实习招聘的时候,它就跑来进行校招了。我参加了2017年4月17日在北大举办的校园宣讲会,介绍了Indeed的基本情况和招聘流程,以及抽奖机械硬盘等。Indeed的办公室很有科技范,其工位设置尤为吸引人,是六边形的环形设计,每个人既可以专注于自己的工作,又便于和组内同事讨论。宣讲的人包括HR和从该校毕业的学长,这个HR是中国人,后面有一轮HR面也是他,大家可以多多留意。 Indeed最大的吸引力是,700万~800万日元的年薪,折合人民币大概四五十万吧,这样诱人的薪资,让每个路过其宣传海报的同学都驻足观看。当然其面试难度也不小,首先有一轮在线笔试,这个在线笔试有三次机会,只要有一次全部AC,就算通过。在线笔试题一共4道,难度比LeetCode稍大,但是一定提醒大家,他们家的题都有数据范围,而且范围很小,前3题用暴力解法几乎都可以过,所以一定要先试试暴力求解,不行再想DP。 通过在线笔试之后,会有一个大约30分钟的HR面,就是上面提到的来华宣讲的中国人。这个面试严格来说是Case interview,通过Skype进行,主要考察逻辑逻辑思维能力和英文口语能力。由于是中国人,所以刚开始会用中文介绍下题意,然后让你思考一下,最后用英文给出解答。我当时的题目是,如何把微信支付的流水从xxx提高到yyy。由于提前非常认真的看了http://www.caseinterview.com/的视频教学,学到很多,这次HR面顺利通过。 通过HR面之后,还有一轮Skype技术面,是从Indeed Tokyo那边打过来的,需要解算法题,通常是一题+好几个follow up。不过很多是往年的原题,在一亩三分地上都有,大家可以仔细在上面看看。我当时被问到的题是之前准备过的,但是没答好,比较突兀的给出了最优解,面试官可能觉得我是背答案了吧。。。 如果这轮Skype技术面也通过的话,就可以免费飞到东京参加on-site面了,听说on-site面是3轮面试,一整个上午或一整个下午,几乎也是原题,可以在一亩三分地上找到。 说来也奇怪,Indeed每年的面试题都差不多,但通过面试的人总是寥寥无几,这才是高级的面试官,考察的是应聘者的解题思路,而不是答案。 Indeed Tokyo很不错,如果能拿到Offer,说明你很优秀,离人生巅峰也不远了。 Works Applications(FAILED) Works Applications简称WAP,是一家日本的ERP软件开发公司,ERP全称是Enterprise Resource Planning,简单理解就是面向企业用户的各种管理系统。WAP是正宗的日本企业,其风格和Indeed Tokyo截然不同,上班要求穿正装,估计各种行为规范也不少,但是钱也不少,折合人民币估计也有四十多万吧。WAP虽然总部在东京,但它在上海有办公室,国内校招生基本上都在上海办公。 WAP的招聘流程和Indeed很像,首先会有一个宣讲会,建议大家都参加,类似于报名考试。宣讲会之后会收到一个在线笔试的链接,要求3天之内做完2道编程题,题目比较简单。在线笔试通过之后,有一轮在线技术面试,使用的是牛客网平台,要求视频面时不能离开面试页面查资料。视频面也比较简单,大概Leetcode的easy~medium题。 对于WAP,前期的在线面试只是开胃小菜,好戏还在后头。通过两轮在线面试之后,会邀请去某个酒店现场面试。现场面试有三轮,全程英文,一般是先来段英文自我介绍,然后开始做题。比较搞笑的是,见到一面面试官时,被问到感觉如何,我说good,然后面试官说别人都是很nervous,我居然说good,感觉要被自己坑了,还好出的题都会做。前两面都不难,大概LeetCode中等题,第三面感觉是一个boss,已经不考LeetCode算法题了,考类似智力题的东西,比如有人被考到囚犯和帽子颜色的问题,我被问到的是怎样实现求两数的平均值,常规的(a+b)/2有可能导致a+b溢出,我想了很多方法,面试官都不满意,后来发现《程序员面试笔试宝典》上有。求平均值的问题可以先转换为求和,用位运算是a+b=((a&b)«1)+(a^b),a+b就是按位加,对应二进制也是按位加,要进位的情况就是对应位都为1,所以先用a&b找出需要进位的位,然后左移1位表示进位;还有些位可能只有一个1或者没有1,这部分加和的结果可以用异或表示,即a^b,所以a+b=((a&b)«1)+(a^b)。那么,求平均值就是(a+b)/2=(a&b)+((a^b)»1)。要是早点看了《程序员面试笔试宝典》,我估计也能拿到WAP的Offer了。 三轮技术面之后,会有一个HR面,听说如果前面的技术面过关的话,HR面会遇到日本boss,直接发放Offer;否则是一个中国人,寒暄几句之后,被告知技术面没有通过,但是可以参加暑期为期一周的实习活动,实习通过的话,也可以获得Offer。每年的实习主题都差不多,比如做一个酒店管理系统、电影院管理系统之类的,由于我觉得时间代价太高了,没有参加暑期实习。 虽然WAP的工资很好,但是要想拿Offer,比Indeed简单,LeetCode中等题足够,好好准备一下现场第三面。另外,即使拿到Offer,也要考虑一下工作内容是否符合自己的兴趣,毕竟ERP和当前火热的AI相比还是太古老了,而且穿正装上班估计也只此一家了。 深信服(OFFER) 深信服公司是面向企业的安全与云计算解决方案供应商,可以理解为企业版360。听说创始人是从华为跳出来的,公司整体风格和华为很像,从宣讲会上还听说这家薪资不错,尤其是博士,宣称比BAT华为都高。 深信服的提前批招聘也很早,7月初就来所里宣讲了。首先有两轮电话技术面试,面试官都会提前短信约时间,给人感觉不错。电话面试的内容比较广,网络、操作系统、C++、算法等都会问到。面试官手里应该有一个问题清单,挨个问下去,不会的跳过,节奏比较快。所以面试深信服之前,要好好复习计算机基础,尤其是网络相关的,因为其主营业务和网络密切相关。 能通过前两轮电话面试的,基础都很扎实,接下来会邀请去参加他们的星云计划暑期夏令营。原本夏令营是要去深圳总部的,但是北京的很多同学都没时间,于是临时把夏令营分成了南北两波,北京的同学被安排在九华山庄度假村。在这里会听好多深信服的介绍和讲座,其中有一个清华的博士,在校期间发过很牛的Paper,自称是那一届的全国博士Top5,谈了很多选择去深信服的理由,核心思想是博士在深信服有很大的自主权,可以试错,主导一些项目,而且薪资估计真的很高。最后会有一个Boss面,主要是问项目经历,Boss是连夜赶来北京的,面试的时候哈欠连天,也没问什么实质性的问题。去的人应该都过了。其实这个夏令营主要是去体验生活的:) 最后的Offer,中规中矩,薪资并没有想象的高,也不是自己喜欢做的事情,拒。 华为(OFFER) 华为就不用介绍了,早年凭借电信网络产品赚得盆满钵满,近几年的智能手机业务更是冲出国门走向世界,真的是我国民族企业的榜样。华为严格来说是一个制造商企业,不算互联网企业,而且其招聘比较看重学历,给人感觉有点像国企。但是毕竟其产品都是计算机相关设备,对计算机专业人才的需求还是很旺盛的。华为的另一大特点是有钱,并且舍得给员工砸钱,我上一届的硕士师兄去了华为,工资碾压BAT,成功倒挂一大批老员工。仔细看看近几年各大重点高校的毕业生去向,去华为的占了很大比例,如果你想快速积累财富,又能吃苦,去华为能很好的满足你的要求。 因为师兄去了华为,3月份收到内部通知说可以提前批内推了,于是把简历给了师兄进行内推。7月初的时候要求做一个性格测试,华为特色,其他公司都没有这一环节,据说是在筛选符合华为价值观的同学。7月22日参加华为提前批优招,真的是优招,去的大部分是清北中科院的,猜测还要求本科是985高校。 优招面试很简单,因为是业务面试,主要问问项目,面试官是那种成功人士风格的Boss。二面就不问技术了,会问周围同学老师是怎样评价自己的,科研压力大吗,想去哪工作之类的,类似的问题也是在衡量应聘者和华为公司的match程度。我应该是非常match的,面试结束的时候,Boss还跟我握手了! 优招面试结束后没几天,会有一个在线笔试,编程题,三道题,最好全AC,我是前两题AC,第三题过了80%。至此,华为所有的笔试面试都结束了。但是直到9月初,才被再次邀请去华为北研参加Offer沟通会,这个会和大一刚入学参加各大社团的招新差不多,华为的各大部门开始抢人,我去了2012实验室中央软件院。 四维图新(OFFER) 华为虽然是最早面完的,但是Offer迟迟没有下来,国内其他互联网公司又还没开始面试,心急之下,看到四维图新在招聘C++研发工程师,做地图搜索的,和自己有点关系。网上查了一下,发现还是腾讯地图的数据供应商,而且还是母校武大测绘学院有很紧密的合作,应该是个靠谱的公司。 跑去面试,可能是公司比较小,面试流程还很原始,直接在接待室问了我几个问题,有些题目有一定难度,连红黑树都被问到了。然后被直接拉去工位,打开VS,开始编程,所幸全部AC。等了一会,直接HR面,拿到普通OFFER。我说想申请SP,HR说下周再来一轮Boss面吧。于是下周又跑去Boss面,Boss果然是Boss,气场就不一样,问题也很灵活,都是他们地图搜索开发过程中的实际问题,比如给定中国地图和一个GPS坐标,怎样快速定位这个坐标。类似的题目很有意思,虽然有一个题目回答得不是很好,但总体上聊得还比较开心。Boss面完之后,又一轮HR面,被告知拿到SP,而且如果能来实习,实习表现好,且能申请到户口指标,则有可能有户口。 这个Offer是我校招季拿到的最早的Offer,薪资还不错,也算是稳住了阵脚。但是公司规模和名气都不算大,暂时拿来保底吧。 百度(OFFER) 百度公司和我的专业是最匹配的了,国内做搜索技术最强的,非百度莫属。百度很人性化的一点是,公司不同部门的招聘分开进行,互不冲突,所以可以同时向不同部门投递简历。我就一口气投递了网页搜索部、商务搜索部和基础架构部。很幸运,同时拿到了这三个部门的提前批Offer。 百度各部门的面试流程都很像,前两轮技术面,第三轮是Boss面或者HR面,越往后面试官的级别越高,第三面的面试官很可能就是你未来的Leader。第一轮面试比较基础,问一些网络、操作系统、C++的基础知识,然后写两道算法题。第二面先写两道算法题,然后问项目,项目问得很细,我的几个搜索引擎的项目,不但问了项目的实现细节,还问了很多follow up,比如,在实战场景中,千亿级别的数据量,怎样建索引使得查询更高效,如何实现怎个搜索过程等。因为面的是搜索部门,他们对相关的技术非常了解,不要抱任何侥幸心理,不会就说不会,切莫班门弄虎。第三面Boss面比较宏观,问问职业规划,如果面试官对你比较感兴趣,会主动介绍本部门的工作,凤巢的三面面试官甚至直接加了我的微信,受宠若惊啊。 提前批面试完毕之后,9月初会有一个在线笔试,这个笔试也会刷人,所以不要掉以轻心,一定要认真准备。我当时是因为宿舍网络问题,被坑死了,那个在线笔试的系统也很变态,是个国外的系统,动不动就掉线,还只能登陆3次,超过自动退出。于是,很悲剧的3题只AC了2题。之后的几天,一直寝食难安,担心会栽在最后的笔试上。 所幸,没过多久,收到了电话通知,笔试通过,需要确定部门,让我从三个部门中选一个。我当时那个纠结啊,网页搜索部、商务搜索部和基础架构部都是百度非常核心的部门,基架的低层技术很强,网搜是典型的文本检索,商搜是广告检索,网搜的三面面试官对我很好,时不时在微信上联系我;我和商搜的三面面试官也聊得很开心,商搜是百度最赚钱的部门,各种大牛非常之多。几番权衡之后,选择了商搜(凤巢),同时也拿到了SP。 Microsoft(OFFER) 微软是我面的唯一一个美国外企,面试流程数它最多了,前后经历了:1轮在线笔试+2轮skype面试+3轮on-site面试。 首先,要拿到微软的skype面试机会就很难,需要通过Hihocoder的在线笔试。Hihocoder的题型和难度都相比于LeetCode复杂得多,我有一次很幸运的做到了前100名好像,拿到了skype面试机会。两轮skype面试难度也不小,比如search range,不但要求bug free,还要求你写测试用例;还比如对快排进行优化;手写堆排序;概率题等。微软的在线编程和skype面试和国内互联网不太一样,建议大家看看一亩三分地上的面经。 过了两轮skype面之后,会被邀请去参加他们的探星夏令营,大概是在8月中旬,地点就在丹棱街的微软大厦。探星夏令营第一天是参观,我因为实验室忙就没去,第二天是三轮面试。我因为研究的方向是搜索引擎,所以被安排到bing组面试了。微软的现场面试难度也不小,不是像LeetCode那样直接叫你写个DP、排序什么的,而是给出一个实际问题,需要将其抽象成一个计算机问题,然后才是代码实现。前两面顺利通过。此时已经是下午4点多了,HR说三面安排不过来,让回去等。这一等直接从8月中旬等到9月初,期间还以为是二面挂了,“让回去等”是委婉的拒绝 ,看来微软还是说话算话的。三面是Boss面,和国内互联网比较像,面项目,问了很多细节,然后根据项目衍生出一个字符串压缩的题目,让写压缩和解压缩的代码。虽然写完了,但是没保证bug free,和面试官聊了聊可能的bug以及解决方案。 过了大概一周,面试结果出来了,没有直接说给Offer,但是说面试反馈非常Positive,让加一个微信群。国庆节之前,收到微软HR电话,让我们稍安勿躁,国庆后会给正式Offer。后来直到10月31日,才收到HR的电话,正式通知Offer详情。接起电话,HR就说准备好纸笔,因为Offer内容比较多,然后就说了Package里面的各种福利,各种美金。总的来说,Package加起来在硕士里面应该是Top级别的,外企各种Balance,不加班,做的是自己喜欢的方向,而且还有可能拿户口,甚至人肉翻墙,可以说这个Offer是非常诱人的。 京东(OFFER) 京东和百度类似,也是部门自己招聘,所以可以面多个部门。我面了AI和大数据部门以及商业推荐部门。印象比较深的是,原本面了一个做分布式的组,一面发现我更适合做搜索和架构,然后就被推荐到一个做京东智能音箱的组,这个组的三面面试官是从雅虎北研过来的,听口音感觉是广东人。因为我是做搜索,智能音箱里面也需要搜索,两个人聊得很不错,面试官当场就说帮我争取SP。 面完技术面之后,过了大概一周,还要进行HR面。面试通知邮件也没说是哪个部门的。其中有个部门的HR面居然是群面,太奇葩了,也是我经历过的唯一一个群面。一屋子3个面试官,6个学生,就菜鸟网络和京东物流的对比展开讨论。首先自我介绍,有清华北大的,也有中科院各所的,还有北邮的。每次讨论我都是倒数几个发言的,对于这种压力测试,真是不适用。不过还好,HR后来跟我说我的表现不错。 HR跟我谈薪资的时候,我客套说差不多就行,后来这两个部门都拿到了Offer,薪资还真的就是差不多,白菜价。因为已经有其他选择,也没有再争取SP。听别人说争取一下能有28左右?感觉京东的定价真是因人而异啊。后来有一天还收到三面面试官的电话,问我去向定哪了,真觉得有点愧对他。 360(OFFER) 本来不打算面360,但是该公司在8月8号组织了一场中科院专场招聘会,在所有OFFER都还没有最终确定的情况下,去360逛一逛也没坏处。360的办公楼在酒仙桥,和MTK在一起,周围在施工,几乎没有吃饭的地方,给人的第一印象不是很好。10点钟到现场之后,已经人山人海了,和菜市场没什么区别,中间等待的时间都超过了面试时间。 面试分为三轮,前两轮是技术面,第三轮是HR面。一面问了一些基础知识,写了一两个算法题。二面遇到了负责360地图开发的程序员,因为地图中也涉及POI搜索,聊得很欢。HR面被问到知道360的哪些产品,虽然我现在一个360的产品都不用了,但是知道的还是不少。 面完之后,觉得Offer稳了,然后开心的回所里。第二天收到邮件通知,面试通过,还需参加一个在线笔试,类似于行测。做完之后,查看状态,被告知所有面试笔试都通过了,个人信息已经在Offer池中,但是没有正式Offer。Offer池是什么鬼,也就是没人要被扔到池子里等人捞呗。问了下其他人,大部分也是被扔到池子里了,只听说有一个人收到书面Offer。从此对360无感,无论是你们组织面试,还是我们参加面试,费了一天劲,硬是不发OFFER,坑爹。后来在10月16日,收到一封360的邮件,正式书面Offer,难道是被人相中捞起来了,真是无语。拒。 阿里巴巴(FAILED) 阿里内推只能选一个部门,内推失败之后也只有一次校招机会,所以大家选部门一定要慎重,根据自己的实力和兴趣进行选择。当时群里给出了蚂蚁金服的内推消息之后,我第一时间就选择内推蚂蚁金服了。结果面了两轮之后查状态已经挂了,也没感觉面得差。可能是因为内推蚂蚁金服的人太多了,实力要求也很高,而且自己做搜索引擎的,和蚂蚁金服不太match。 因为内推挂了之后,无法再面其他部门了。只能参加校招流程,校招在线笔试之后一直就没消息,状态也没更新,难度笔试挂了? ...

February 4, 2018 · 1 min

厦门之行

2017年12月7日~13日,打着参加“第三届全国质谱分析学术报告会”的旗号,实验室一行11人开启了为期一周的厦门之旅。有关学术交流的总结报告,已经在实验室内部分享了,这篇博客还是来聊聊吃喝玩乐的事吧:) 第一次乘坐飞机 本次出行分为飞机组和火车组,大部队说飞机不安全要坐火车,我因为想体验一下乘坐飞机的感受,于是选择了飞机组。第一次坐飞机,体验有三点:1)快。从北京到厦门,横跨整个中国,只花了3个小时,真的好快,除去吃午餐等时间,连一部电影都没看完!2)噪。起飞和降落的时候噪声特别大,平飞的时候噪声也不小,而且快要到目的地时,会有短暂的耳胀,孙老师说第一次坐飞机的人好像都会出现耳胀的情况。还有就是有时候飞机比较颠簸,放在桌子上的水都快晃出来了。3)美。我因为第一次坐飞机,特地选了一个靠窗的位置,想体验一把俯瞰神州大地的感觉。从窗户往下看时,地形地貌和谷歌卫星地图一摸一样,窗外的云就像一朵朵棉花糖,很漂亮,很像各种神话剧中的天庭。 飞机上不让开手机,这是在北京首都国际机场起飞前抓拍的照片,以后坐飞机记得带相机 南国风光 下飞机之后,立即体验到了厦门这座城市的“热情”,20℃左右的温度,卸下厚重的羽绒服,看着路边的红花绿叶正艳,来到沙滩上,吹吹海风,一身清爽。南方的城市由于经常下雨,街道看起来很干净,柏油马路显露着其原本的黝黑色,路边的叶子绿的发亮,不像在北京被蒙上厚厚的一层灰。路上车辆和红绿灯不多,也很少听到鸣笛,听说厦门全岛禁止鸣笛,斑马线处虽然没有红绿灯,但是有摄像头,强制车辆遇到行人时必须礼让。这种规定在北京是不可能实行的吧。总体而言,厦门彰显了南方城市应有的魅力,和杭州类似,但又更加清新靓丽,是一个休闲生活的好地方。 厦门大学——也许是中国最美丽的大学 本次参会,我们特地提前一天到达,留出时间来参观游览,地点之一就是厦门大学。厦大很美,这是来自一个在武大待了4年的人的由衷赞美。得益于其依山傍水的地理位置,校园内有锦绣的芙蓉湖、美丽的情人谷水库等景点,气氛十分静谧,这点相比于武大小小的鉴湖就好很多。由于地处热带,校园内随处可见高大挺拔的棕榈树,配上古朴的清水墙、多彩的琉璃顶,给人一种别样的美感。如果你要问厦大和武大哪个更美,我只能说她们都美!武大是幽静娴雅的大家闺秀,厦大则像开放热情的新时代女子。武大更加符合中国传统的园林审美,厦大更具风情和现代气息。两校都有山有水,都无愧于中国最美丽的大学的称号! 看见有人在厦大的情人谷水库泛舟,真是“亦可赛艇”呀:) 厦大还有一个特别的地方——芙蓉隧道,长达一公里,隧道内壁两侧,画满了风格各异,色彩缤纷的涂鸦,号称是中国最文艺的隧道,中国最长的涂鸦隧道。致青春,怀念那种开放、包容的大学氛围。 环游鼓浪屿 会议结束的那天下午,我们前往国家5A级旅游景区鼓浪屿风景名胜区游玩。鼓浪屿,面积不到2平方千米,人口约2万,有“海上花园”、“万国建筑博览会”、“钢琴之岛”之美称。除环岛电动车外不允许机动车辆上岛,因此气氛幽静。2005年《中国国家地理》杂志将鼓浪屿评为“中国最美的城区”第一名。2017年7月在波兰克拉科夫举行的第41届世界遗产大会上被正式列入《世界遗产名录》。鼓浪屿、厦门岛和大陆的关系,就像月球、地球和太阳的关系。 我们首先从厦门国际邮轮中心乘坐邮轮前往鼓浪屿的三丘田码头,邮轮北边能看到远处横跨鹭江海沧大桥,非常的简洁漂亮,据说是亚洲第一、世界第二(仅次于丹麦)的三跨连续全漂浮钢箱梁悬索桥,代表着20世纪中国建桥水平最高成就。由于是国际邮轮中心,所以也能看到不少外国邮轮,我当时就看到了欧洲和韩国的邮轮经过。 20分钟之后,就到达了鼓浪屿的三丘田码头。我们沿着鼓浪屿的海岸线,优哉游哉的走着,嬉笑打闹,听着浪涛声,赏着落日余晖,好不惬意。 我们原本是打算步行环岛游览一周的,但是走到卢戆章雕塑的地方,好多人都走不动了,打算穿过岛屿,提前返回。我个人其实挺想继续前进到鼓声洞的,鼓浪屿名称的由来就是因为在鼓声洞能听到阵阵浪涛拍击岩洞而发出轰隆巨响。 横穿鼓浪屿的路不是很好走,蜿蜒曲折、上下颠簸,走到龙头路小吃街的时候,大家都饿得不行。小吃街排队的食客特别多,为了早点吃饱,大家分头行动,每两三个人排一家店,所以最终还吃了不少美食,比如沈家闽南肠粉、小马哥起司马铃薯、汤满贯等。有意思的是,在沈家闽南肠粉和小马哥起司马铃薯的中间,有一家土耳其冰淇淋店,两边的食客都排起了长龙,唯独这家店门前冷落鞍马稀。大家吃着美食就开始聊起来了,虽说厦门冬天不冷,但也没有热到对冰淇淋有那么大的渴望。更重要的是,走到此处的游客肯定饿了,首先想到的是填饱肚子,冰淇淋属于饭后甜点,应该算“奢侈品”了,如果这个店换成“土耳其烤肉”,估计能火,哈哈。 岛上其实还有很多景点,比如风琴博物馆、菽庄花园、日光岩、海底世界等,但是我们都没进去,可能是因为沿途的风景太美了,这些收费的室内景点还不足以吸引我们吧。鼓浪屿的风景太美,可玩、可看的景点太多,半天的时间绝对不够用。下次再去,一定要细细品味。 http://j.map.baidu.com/M2cPN 厦门植物园 回北京之前,我们去了火车站附近的厦门植物园游玩。厦门植物园也称为万石植物园,背靠五老峰南普陀,集植物景观、自然景观、人文景观于一体,景色相当不错。我们沿路经过了百花厅、奇趣植物区、新碑林、摩崖石刻、长寿峡、半山观景台、多肉植物区、雨林世界、药用植物区,看到了很多奇花异草,整个行程在多肉植物区看到高大的仙人掌时达到高潮,非常值得游览的一个景点。 厦门植物园石碑 类似食人花的猪笼草,开启之后像一个笼子 奇丑无比的白花异木棉 万石丛中 半山观景台,背景是厦门世茂双子塔 疯狂生长的仙人掌和仙人球 类似毛毛虫的仙人掌。。。 放了一个大招,生出许多仙人掌:) 胡吃海喝 在厦门的这一周,大家都说不是在吃就是在吃的路上,不论是酒店的自助餐还是在外面吃饭,都吃得很不错,我基本上每餐都是十分饱。在酒店的伙食,相对来说,早餐是最好的,午餐和晚餐比较一般,可能是因为早餐酒店提供,午餐和晚餐是会议主办方提供吧,毕竟会议注册费很便宜,伙食也不会太好。不过每餐都有海鲜、厦门特色沙茶面、各种肉、水果、甜点、饮料,相比于北京的食堂是好太多了。 丰盛的早餐 到厦门的第一天晚上,我和师弟去中山路小吃街逛了逛,结果并没有任何惊喜,感觉全国的小吃街都差不多:烧烤、臭豆腐、各种煎饼包子、粥、饼。中山路的新华书店倒是值得一逛,他们家第三层的书不少,国内外文学、小说、工具书一应俱全,一改我对新华书店只有教科书的旧思想。 在外面吃的话,每餐必点被称为花蛤的“虫子”,还有另一种称为蛏(cheng)子的“虫子”,和花蛤很像,但是是长方形,且有两条美腿。知乎上有一个回答仔细的辨析了花蛤、蛏子、蚬子、蚶子、蛤蜊、海瓜子、贝壳的区别,很有意思。不过话说这些海底动物长得都很奇怪,有些还有很多软体触角,看着让人恶心。席间,有个师兄讲了个笑话,问为啥海底动物长得都这么丑,答案是因为海底没光,反正都看不见,大家就随便长长了:)。 说到海产品,必不可少的是鱼了,厦门的清蒸金昌鱼非常好吃,味道鲜美,没有小刺,和上次在杭州吃到的西湖醋鱼简直是一个天上,一个地下,强烈推荐。 ...

December 16, 2017 · 1 min

逻辑回归之Python应用实例

上一篇博客主要介绍了逻辑回归的理论知识,这篇博客咱们用Python机器学习包sklearn中的LogisticRegression做一个分类的实例。 数据还是学生样本,只有两个特征,分别是两门课的分数score1和score2,类标号y表示这个学生是否能被录取。先上分类效果图: 完整的Python代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 # -*- coding: utf-8 -*- """ Created on Wed Nov 08 17:49:41 2017 @author: zhenlin """ import numpy as np import pandas as pd from sklearn.cross_validation import train_test_split from sklearn.linear_model import LogisticRegression import matplotlib.pyplot as plt from sklearn.metrics import precision_recall_curve from sklearn.metrics import classification_report # 1. 构造数据 sample_number = 200 # 第一个高斯分布参数 mean1 = [0, 4] # 两个维度上的均值 cov1 = [[5, 3], [3, 10]] # 两个维度的协方差矩阵,必须满足对称半正定 # 第二个高斯分布参数 mean2 = [7, 5] cov2 = [[7, 2], [2, 15]] # 从两个二元高斯分布中随机采样数据点 class1_x1, class1_x2 = np.random.multivariate_normal(mean1, cov1, sample_number).T # .T表示转置 class2_x1, class2_x2 = np.random.multivariate_normal(mean2, cov2, sample_number).T # 两个高斯分布对应两个类标号 data = [[class1_x1[i],class1_x2[i],0] for i in range(sample_number)]+[[class2_x1[i],class2_x2[i],1] for i in range(sample_number)] # 填充到pandas中 data = pd.DataFrame(data,columns=['score1','score2','result']) score_data = data[['score1','score2']] result_data = data['result'] # 2. 训练模型 average_precision = 0 # 平均准确度 iters = 10 # 交叉验证次数 for i in xrange(iters): # 数据划分,80%用于训练,20%用于预测 x_train, x_test, y_train, y_test = train_test_split(score_data, result_data, test_size = 0.2) # 构造默认逻辑回归模型 model = LogisticRegression() # 训练 model.fit(x_train, y_train) # 预测 predict_y = model.predict(x_test) # 计算测试集上的准确度 average_precision += np.mean(predict_y == y_test) average_precision /= iters # 3. 绘制分类面 - 法1 x1_min, x1_max = score_data['score1'].min() - .5, score_data['score1'].max() + .5 def generate_face(prob): y = -np.log(1.0 / prob - 1.0) n = 500 x1 = np.linspace(x1_min, x1_max, n) # w1x1+w2x2+b=y x2 = (-model.coef_[0][0] / float(model.coef_[0][1])) * x1 + (y - model.intercept_) / float(model.coef_[0][1]) return x1, x2 pos_data = data[data['result'] == 1] neg_data = data[data['result'] == 0] plt.scatter(x = pos_data['score1'], y = pos_data['score2'], color = 'black', marker = 'o') plt.scatter(x = neg_data['score1'], y = neg_data['score2'], color = 'red', marker = '*') face_04_x1, face_04_x2 = generate_face(0.4) face_05_x1, face_05_x2 = generate_face(0.5) face_06_x1, face_06_x2 = generate_face(0.6) plt.plot(face_04_x1, face_04_x2) plt.plot(face_05_x1, face_05_x2) plt.plot(face_06_x1, face_06_x2) plt.xlim(score_data['score1'].min(), score_data['score1'].max()) plt.ylim(score_data['score2'].min(), score_data['score2'].max()) plt.xlabel('score1') plt.ylabel('score2') plt.legend(['prob_threshold = 0.4', 'prob_threshold = 0.5', 'prob_threshold = 0.6'], loc='center left', bbox_to_anchor=(1, 0.865)) plt.show() # 4. 绘制分类面 - 法2 pos_data = data[data['result'] == 1] neg_data = data[data['result'] == 0] h = 0.02 s1_min, s1_max = score_data['score1'].min() - .5, score_data['score1'].max() + .5 s2_min, s2_max = score_data['score2'].min() - .5, score_data['score2'].max() + .5 # 生成s1在[s1_min, s1_max],且s2在[s2_min, s2_max]的网格数据点 # meshgrid含义参见:http://blog.sciencenet.cn/blog-791749-675394.html s1, s2 = np.meshgrid(np.arange(s1_min, s1_max, h), np.arange(s2_min, s2_max, h)) # 把两个坐标的值按列拼在一起构成二维数据点 Z = model.predict(np.c_[s1.ravel(), s2.ravel()]) # 绘制边界和散点 Z = Z.reshape(s1.shape) # 坐标点是(s1[i], s2[i]),对应颜色是Z[i],颜色主题使用plt.cm.Paired plt.pcolormesh(s1, s2, Z, cmap = plt.cm.Paired) plt.scatter(x = pos_data['score1'], y = pos_data['score2'], color = 'black', marker = 'o') plt.scatter(x = neg_data['score1'], y = neg_data['score2'], color = 'red', marker = '*') plt.xlim(s1.min(), s1.max()) plt.ylim(s2.min(), s2.max()) plt.xlabel('score1') plt.ylabel('score2') plt.show() # 5. 评估模型 # 对于测试数据,模型输出1的概率 answer = model.predict_proba(x_test)[:,1] # 计算不同概率阈值下的P和R precision, recall, thresholds = precision_recall_curve(y_test, answer) # prob > 0.5的报告为1 report = answer > 0.5 print(classification_report(y_test, report, target_names = ['neg', 'pos'])) print('average precision: %f'%average_precision) # 6. 绘制PRC曲线 # step阶跃图,在点(recall[i],precision[i])进行跳变 plt.step(recall, precision, color='b', alpha=0.2, where='post') # 对PRC下方填充颜色 plt.fill_between(recall, precision, step='post', alpha=0.2, color='b') plt.xlabel('Recall') plt.ylabel('Precision') plt.ylim([0.0, 1.05]) plt.xlim([0.0, 1.0]) plt.title('2-class Precision-Recall curve') plt.show() 下面将逐模块介绍代码细节,大神可以略过。 ...

December 5, 2017 · 4 min

初探逻辑回归

最近实验室在组织学习NG的机器学习视频,我也跟进了一下。讲到逻辑回归那一课,一直想不明白,逻辑回归到底是怎样分类的?逻辑回归的分类面在哪里?逻辑回归有像SVM的max margin那样清晰的推导过程吗?为什么需要Sigmoid函数?今天就让我们来一窥逻辑回归的始末。 假设有一堆学生样本,为了简单起见,只有两个特征,分别是两门课的分数score1和score2,类标号y表示这个学生是否能被录取。可视化如下图,黑点表示y=1即被录取,红点表示y=0即未被录取,可以看到黑点处在score1和score2都比较高的区域。我们的任务就是给定这些训练样本,需要确定一个分类面来划分这两类数据。 分类面的实质就是\(y=\mathbf{w^T x}+b\),其中\(\mathbf{w}\)和\(\mathbf{x}\)都是向量,对应到本例中,展开为\(y=w_1x_1+w_2x_2+b\)。所以,寻找分类面的过程就是寻找倾斜度\(\mathbf{w}\)和截距\(b\)。 因为分类的结果是离散的,只有0或者1,可以用感知机来分类。即 但是怎样找这里的\(\mathbf{w}\)和\(b\)使得分类结果最好呢,我们需要定义一个优化的目标函数或者说损失函数。这里只能定义为分类错误的个数,只能一点点挪动超平面来找分类错误最少的超平面了,即只能用暴力枚举的方法来找\(\mathbf{w}\)和\(b\)。 另一种方法是令我们的分类面算出来的值和真实标号越接近越好,即最小化误差\((\mathbf{w^T}x^{(i)}+b-y^{(i)})^2\),然后通过梯度下降求解\(\mathbf{w}\)和\(b\)。 但是这会有一个问题,对于上图数据,可以求到一个比较好的分类面,如下左图。但是如果数据中出现了如下右图右边的一个离群点或者噪声,为了最小化这个点的误差,即\((\mathbf{w^T}x^{(i)}+b-1)^2\),导致分类面往右偏了,这一偏直接导致很多y=1的样本分类错误。所以这种最小化误差的方法对离群点很敏感。 假设分类超平面还是\(f(\mathbf{x})=\mathbf{w^T x}+b\),我们希望的分类效果是这样的:\(f(\mathbf{x})=0\)是分类面;\(f(\mathbf{x})>0\)分类为1,且不管\(f(\mathbf{x})\)多大,都分为1;\(f(\mathbf{x})<0\)分类为0,且不管\(f(\mathbf{x})\)多小,都分为0。 因为类标号是离散的{0,1},所以想到把\(f(\mathbf{x})\)映射到[0,1]之间,即\(g(f(\mathbf{x}))\)。为了满足上述条件,\(g(f(\mathbf{x}))\)需要满足: \(g(0)=0.5\),即在分类面上无法判断类标号是0还是1 当\(f(\mathbf{x})>0\)时,\(g(f(\mathbf{x}))>0.5\) 当\(f(\mathbf{x})\rightarrow+\infty\),\(g(f(\mathbf{x}))\rightarrow 1\),且\(g'(f(\mathbf{x}))\rightarrow 0\),即对于上右图右边的离群点,分类为1,且导数趋近于0,表示对其不敏感 当\(f(\mathbf{x})<0\)时,\(g(f(\mathbf{x}))<0.5\) 当\(f(\mathbf{x})\rightarrow-\infty\),\(g(f(\mathbf{x}))\rightarrow 0\),且\(g'(f(\mathbf{x}))\rightarrow 0\),和第3点类似 满足上述性质的函数之一就是Sigmoid函数,其定义域为\([-\infty,+\infty]\),值域为[0,1],正好把原始的函数结果\(f(\mathbf{x})\)映射到了[0,1],而概率的取值范围正好是[0,1],所以Sigmoid函数正好可以作为分类为1的概率。 所以逻辑回归最终的形式就是: $$g(\mathbf{x})=\frac{1}{1+e^{-(\mathbf{w^T x}+b)}}$$分类面依然还是\(f(\mathbf{x})=\mathbf{w^T x}+b=0\),因为\(f(\mathbf{x})=0\)时,\(g(\mathbf{x})=0.5\),正好满足上述条件1。 Sigmoid函数的另一个优点是,它把原始函数值映射到了概率空间,这样就可以用极大似然的方法求解参数\(\mathbf{w}\)和\(b\)。下面用参数\(\mathbf{\theta}\)代表参数\(\mathbf{w}\)和\(b\),用\(h_{\mathbf{\theta}}(\mathbf{x})\)代表\(g(f(\mathbf{x}))\)。则有: $$P(y=1|\mathbf{x};\mathbf{\theta})=h_{\mathbf{\theta}}(\mathbf{x})$$$$P(y=0|\mathbf{x};\mathbf{\theta})=1-h_{\mathbf{\theta}}(\mathbf{x})$$合并成一个式子就是: $$P(y|\mathbf{x};\mathbf{\theta})=h_{\mathbf{\theta}}(\mathbf{x})^y(1-h_{\mathbf{\theta}}(\mathbf{x}))^{1-y}$$由于所有样本独立同分布(I.I.D.),似然函数就是 $$L(\mathbf{\theta})=P(\mathbf{y}|X;\mathbf{\theta})=\prod\limits_{i}P(y^{(i)}|\mathbf{x}^{(i)};\mathbf{\theta})=\prod\limits_{i}h_{\mathbf{\theta}}(\mathbf{x}^{(i)})^{y^{(i)}}(1-h_{\mathbf{\theta}}(\mathbf{x}^{(i)}))^{1-y^{(i)}}$$最大化似然的含义就是,在给定样本\(X\)的情况下,我们想找一个参数\(\mathbf{\theta}\),使得观测到类标号\(\mathbf{y}\)的概率最大。 最大化似然等价于最大化log似然,log展开之后就是: $$l(\mathbf{\theta})=logL(\mathbf{\theta})=\sum\limits_{i}y^{(i)}logh_{\mathbf{\theta}}(\mathbf{x}^{(i)})+(1-y^{(i)})log(1-h_{\mathbf{\theta}}(\mathbf{x}^{(i)}))$$而很巧的是,最大化log似然,其实等效于最小化log对数损失。对于单个样本,损失为: $$cost(h_{\theta}(\mathbf{x}),y) = \begin{cases}-log(h_{\theta}(\mathbf{x})) & \text {if y=1} \\ -log(1-h_{\theta}(\mathbf{x})) & \text{if y=0} \end{cases}$$即如果正确类标号是1,但算出来的\(h_{\theta}(\mathbf{x})\)很接近0的话,则损失\(-log(h_{\theta}(\mathbf{x}))\)就会很大。类标号为0的情况类似。把这两种情况合成一个式子就是: $$cost(h_{\theta}(\mathbf{x}),y) = -ylog(h_{\theta}(\mathbf{x})) – (1-y)log(1-h_{\theta}(\mathbf{x}))$$所有样本的损失之和就是: $$J(\mathbf{\theta})=cost(h_{\theta}(X),\mathbf{y}) = \sum\limits_{i}-y^{(i)}logh_{\mathbf{\theta}}(\mathbf{x}^{(i)})-(1-y^{(i)})log(1-h_{\mathbf{\theta}}(\mathbf{x}^{(i)}))$$所以最大化对数似然\(\max l(\mathbf{\theta})\)和最小化对数损失\(\min J(\mathbf{\theta})\)是等效的!最优化求解的方法用梯度下降和牛顿法都可以。 和Sigmoid很像的函数还有很多,比如y=arctan(x)也可以,不过Sigmoid有一个很好的特点,即它的导数可以由自身算出来,\(f'(x)=f(x)(1-f(x))\)。 传统的逻辑回归只能处理二分类问题,那么怎样将其扩展到解决多分类问题呢?有两种方法,一种方法是建立k个二元分类器,比如类标号有A,B,C,则建立3个二元分类器,分别是1)A和非A;2)B和非B;3)C和非C。训练每个2元分类器时,都对所有的数据重新标号为0或1,这样共需要训练k个二元分类器。 还有一种方法是直接将二元逻辑回归推广到多元回归,即Softmax回归,有关Softmax回归的内容,请参考此博客,非常详细。简单来说,二元逻辑回归的假设函数是:多元Softmax回归的假设函数在形式上有所不同:其中是模型的参数。请注意这一项对概率分布进行归一化,使得所有概率之和为1。 Softmax回归的损失函数如下,其实就是logistic回归损失函数的推广: 二元逻辑回归是多元Softmax回归在k=2时的特例,令k=2并利用Softmax回归参数冗余的特点,可以得到一般形式的二元逻辑回归假设函数,具体可以看原博客。 面对一个多元分类问题,是选择Softmax回归还是k个二元分类器呢,这取决于你的类别之间是否互斥,如果互斥,可以用Softmax回归,否则,请用k个二元分类器。 这就是逻辑回归的理论知识,下一篇博客将介绍逻辑回归在Python中的应用。 参考: http://www.cnblogs.com/sparkwen/p/3441197.html https://tech.meituan.com/intro_to_logistic_regression.html http://blog.csdn.net/bitcarmanlee/article/details/51165444 http://ufldl.stanford.edu/wiki/index.php/Softmax%E5%9B%9E%E5%BD%92

November 26, 2017 · 1 min

2017年国庆旅行——郑州、杭州

今年国庆假期连着中秋,加起来有8天时间,考虑到上半年忙着找工作,太累了,打算利用这个假期好好放松一下。 一、行程规划 9月份的某个周末,规划好行程,制定了人生第一份独自出游的计划。整个过程只花了一天的时间,包括景点规划、住宿、车票购买。其实9月初就在脑海中规划这个事情,当时想的还是2个人同行,但是中间遇到了一些事情,最终只能一个人出游。一个人的话,不用考虑太多,为了节省路上的时间,全程购买高铁票,唯独从杭州回北京的高铁票没有了,幸运的是利用分流抢票软件抢到了一张硬座。住宿方面,一个人住青旅是再好不过了,既便宜、又可以遇到有意思的驴友。国内正规青旅可以在YHAChina上预定,我就是在这个网站上预定了杭州荷方青年旅社。没有在YHA上注册的青旅,可以通过booking.com预定,booking的优势是预定不收费,入住当天前取消也不收费,很不错,我就是在这个网站上预定了郑州的畅旅太空舱宾馆,不过到店之后老板建议我取消网站上的预定,进行线下支付,可以便宜几块钱。。。 二、郑州半日游 3号到达郑州之后开始下雨,booking上的青旅地址有误,浪费了不少时间才找到宾馆并办理了入住。这个太空舱宾馆是在某个高层小区的6层,由居住房改造而成的,开始我还担心是黑店,要求查证件,毕竟第一次住青旅,还是有点担心。后来陆续来了一些驴友,有俄罗斯帅哥、韩国萌妹,又考察了一下房间和网上的照片是一样的,也就不太担心了。太空舱宾馆在医学院地铁站旁边,楼下有一个永辉超市,地理位置还是很不错的。 办完入住之后已经4点多了,行程单上的郑州大学、河南博物馆肯定是没时间去了。于是去了农科路的一家巴奴火锅店吃火锅,一个人吃火锅心里真不是滋味。 回青旅的路上,需要经过二七广场站,虽然有点晚了,但想着别错过郑州为数不多的景点,就跑出来看了看。二七广场周边都是一些商场,没啥意思,二七纪念塔也已经闭馆了。看着联体双塔造型的二七纪念塔,觉得好奇怪,为什么要建成联体的呢,网上查阅资料才得知,此塔为纪念二七大罢工(也称为京汉铁路工人大罢工)中牺牲的汪胜友、司文德两位烈士,我猜大多数郑州人也不知道吧。 三、少林寺一日游 4号早上6:30起床,7点出门去郑州长途汽车中心站,准备坐大巴前往登封市。无奈天公不作美,还在下雨,汽车中心站在郑州火车站旁边,地铁只能到郑州火车站,前前后后还要步行。所以虽然青旅离中心站不远,但到中心站的时候已经8:15了。 中心站大厅有很多自动售票机,而且可以在线支付,所以快速购买了8:40前往登封的汽车票,票价28元。进站的时候,安检居然不让带水进去,太可恶了,只能把水扔掉。上车之后,磨蹭到9点才发车,到达登封汽车站的时间已经是中午11点了。这个时候,有很多黑车拉客去少林寺景区,需要四五十块钱,在我犹豫的时候,直达少林寺景区的8路公交来了,只要5块钱,所以这里提醒大家,从登封汽车站去少林寺景区,等8路公交是最实惠的。 前往少林寺景区的路上拥堵不堪。将近12点才到达景区门口。买了少林寺景区通票100元(学生票半价,后悔本科的时候没多出去玩玩)。 进入景区之后,跟着人群,先后经过了演武厅、少林寺常住院、塔林。演武厅要2点才上演武术表演,所以略过。少林寺常住院里面就是各种殿,比如大雄宝殿、藏经阁。基本上每个殿里面都会有一个佛像,供游客参拜。说实话,这些殿堂,没有解说,看完也就看完了,并没有留下深刻的印象。 3点钟的时候,做了个明智的选择,乘少林索道去看自然风光了(注意嵩杨索道是去看二祖庵的,还是人文景观)。下了索道,瞬间被眼前的景色惊艳住,由于下雨,山上烟雾缭绕,如临仙境;山涧瀑布飞流直下,哗哗作响;三皇栈道奇峰怪石,好不惊险。本来还想去感受下垂悬雾中的吊桥,由于时间关系只得作罢。 回来的路上,雨过天晴,一扫连日来的阴霾,真是豁然开朗,心情极其舒畅! 返程时没必要先坐8路公交到登封汽车站了,在景区出口右侧有从少林寺直达郑州火车站的大巴,票价30,很方便。 四、杭州半日游 5号早上6点起床,赶8点去杭州的高铁。下午1点多到达杭州,根据导航前往荷方青年旅社。走出定安路地铁口,扑鼻而来的桂花香,甜到心里了,看着周围的白墙黛瓦、花格窗棂,我知道我来到江南了! 入住的杭州荷方青年旅社在清河坊步行街的尽头,所以导航的时候,顺带逛了逛清河坊小吃街。沿街的酒幡和各种幌子瞬间有种回到南宋的感觉。旅舍由二十世纪五六十年代的传统江南风格的四合院民居改建而成,傍山而居。白墙黛瓦,花格窗棂,青石板,柚子树,清爽舒适。 办理好入住之后,根据计划前往浙大紫金港校区。浙大今年120周年校庆,校门口站了两个志愿者,看起来一脸青涩,我问他们浙大的外语学院和计算机学院在哪里,他们说他们是大一新生,不知道这两个学院在哪…真不知道志愿者是干啥的。 浙大紫金港校区里面有个人工湖,叫启真湖,还挺大的,有点类似于北大未名湖,湖里还养殖了黑天鹅,比武大的鉴湖有意思。除此之外,其他的建筑并没有太多的特点,也就是一个正常的学校了。走在校园里,也是满园的桂花飘香,此时好想回到武大。 吃过晚饭之后,听说南山路的夜景不错,于是在南山路上溜达了一圈,权当饭后消食。 五、西湖一日游 西湖很大,为了不错过每一个景点,我在网上查了很多攻略,其中知乎上一个用户的骑行线路深得我心,我是完完全全的根据他给的线路图一个景点一个景点遍历的。虽然清河坊离柳浪闻莺最近,但我还是硬生生先骑车到断桥残雪作为起点,固执可见一斑:-) 另外,吸取了游少林寺看不懂人文景观的教训,这次我提前下载了一个口袋导游APP,该APP可以根据定位自动播放所在景点的介绍,很不错。 漫步在西湖边,给我最大的感受就是舒适、悠闲。依然是熟悉的桂花香,随处可见的荷叶,清风徐来,杨柳依依。若是走累了,坐在湖边的石头上,观鱼逗鱼也别有一番乐趣。 这次环游西湖很有意思的一件事是自己和自己玩定向越野。当我来到第一个景点断桥残雪时,我发现有一个御碑亭和对应的标志碑,上面都写着“断桥残雪”,只不过御碑亭上是康熙、乾隆等皇帝题写的,标志碑是中华人民共和国国务院立的。所以西湖十景的每个景点肯定都有对应的御碑亭和标志碑,我当时就决定,每到一个景点,请路人帮我拍一张和标志碑的合影,一来观景有了目标,二来强迫自己开口说话,和路人搭讪。 由于我是严格按照上面的路线图游完的,没有经过双峰插云和三潭印月,所以只有8张合影。 看着这些照片,我只想说路人和路人的拍照水平差别好大:-) 其实重点不是照片,而是寻找标志碑和找路人拍照的过程。比如雷锋夕照的标志碑并不在雷峰塔脚下,而是要走出雷峰塔,去到旁边的小山丘上才能找到。而柳浪闻莺的标志碑就更难找了,这个公园很大,标志碑的位置很隐蔽,我用百度地图导航来回走了3遍都没找到,最后问了景点的一个售货员才知道,这个标志碑在钱王祠前面,路的内测,需要绕一个很长的弯才能找到。最后当我找到柳浪闻莺的标志碑的时候,天已经黑了,由于位置比较偏僻,几乎没有游客,我等了十分钟,终于等来一个游客,帮我拍了一张合影,我猜80%的游客都未曾找到过这个标志碑。 关于拍照。以前自己不敢也不想麻烦路人帮忙拍照,现在算是勇敢的做出尝试,其实路人是很愿意帮助别人的,当然我找的都是年轻人。有意思的是,在雷峰塔脚下,我看到一个和我一样独自游览雷峰塔的年轻人,想自拍又苦于无人帮助,于是我主动提出帮忙,正好也借机让他帮我拍照。互拍完之后我们就散了,没想到登上雷峰塔塔顶之后,我们又相遇了,一阵欣喜之后,又决定互拍。真是猿粪呀。 环游西湖结束之后,准备找一个特色餐厅吃饭。阿溜说她之前在西湖边的外婆家吃过,挺不错的。外婆家的slogan是“我家就在西湖边”,那就去尝尝地道的外婆菜咯。取完号之后发现前面还有40+桌在等,火爆程度可见一斑。幸好带了kindle,就坐在湖边的长凳上看起了《月亮与六便士》。等到大概8点的时候,终于叫上号了。点了西湖有名的西湖醋鱼和东坡肉,还点了一杯稻花米乳。这大概是我点菜最失败的一次了,西湖醋鱼是草鱼,刺太多,而且有点腥;东坡肉一整块也没完全切开,拿下去重新切了之后,一块块七零八落,观感极差。至于稻花米乳,就是真真正正的稻米磨成的汁,无味。虽然菜不好吃,但没尝试过怎么知道呢,所以秉承“勇于尝试”的精神,我并没有感到太沮丧。 回到清河坊特色街已经晚上10点了,为了挑选纪念品,挨个店进去考察。到最后发现能体现杭州西湖特色的也就是印有西湖十景的冰箱贴了,以后决定每去一个地方都买当地的冰箱贴,争取博士毕业前把工位上的墙贴满。 六、西溪一日游 制定计划的时候,考虑到6号骑行环游西湖肯定会很累,所以决定7号去西溪,乘坐游船转一圈,正好歇歇脚。 西溪湿地很大,分为东、中、西三个部分,中部是生活街区,免费开放的,东西部要收费。门票全价80,船票全价60,电瓶车5元。 我在西溪天堂买好所有的票之后,乘坐电瓶车到天目山路周家村出入口,沿着游船线路,先后游玩了周家村→渔村烟雨→深潭口。 周家村在办火柿节,没什么好玩的。渔村烟雨的花样比较多,主要有三个展厅,第一个展厅演示了西溪当地人养蚕织布的情景;第二个展厅西溪人家展示了西溪当地人家的家具、饮食等风格,诸如灶台、风车、打谷机等都和我老家的很像;第三个展厅表演西溪当地人婚嫁的情景,因为此处陆路不通,迎娶新娘只能乘船,挺有意思的。深潭口有一片养殖珍珠的水域,电影《非诚勿扰》曾在这里取景,除此之外,好像没有什么特别的地方。 西溪游船如下左图所示,十几分钟就能从一个景点到达下一个景点,每经过一个景点,就会在船票上戳一个孔表示你不能再在这个点上船了。下次有机会要试一下右图的摇橹船,哈哈。 西溪湿地公园给我的感觉和西湖是完全不一样的,西湖是美景+人文情怀,是阳春白雪似的美,声名远扬,游人如织;而西溪湿地更多的是江南水乡的体现,是下里巴人的美,更加贴近普通老百姓的生活,游人可能只有西湖的20%? ...

October 8, 2017 · 1 min

Gperftools性能分析工具使用教程

上一篇博客简单介绍了Linux平台下不同性能分析工具的特点,最后是Google出品的gperftools胜出。今天我们将举一个用gperftools对链接库进行性能分析的例子。 假设我们创建了一个TestGperftools项目,其中包括一个动态链接库模块complex和主程序main,build文件夹用于存放动态链接库和可执行程序,文件结构如下所示。 1 2 3 4 5 6 7 8 9 10 11 12 13 czl@ubuntu:~/czl/TestGperftools$ tree . ├── build ├── complex │ ├── complex.cpp │ ├── complex.h │ └── Makefile ├── main │ ├── main.cpp │ └── Makefile └── Makefile 3 directories, 6 files 其中complex借用了这篇博客的第三个公式计算圆周率π,主要用来模拟一个很耗时的操作。该模块会生成一个libcomplex.so动态链接库供外部调用。其complex.cpp函数如下: ...

February 7, 2017 · 3 min