等不上wwW65nf啦为什么应该,是php 跳转上一页到65nfcOm别的地方啦

&p&作者:&a href=&https://www.zhihu.com/people/fd7c571a0ada1a72e42e8d& class=&internal&&@萧井陌&/a&, &a href=&https://www.zhihu.com/people/d2facf05b31ad4& class=&internal&&@Badger&/a&&/p&&ul&&li&自由转载-非商用-非衍生-保持署名 | Creative Commons BY-NC-ND 3.0&/li&&li&&a href=&https://link.zhihu.com/?target=http%3A//cocode.cc/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&CoCode&/a&:一个让大家学习、成长、相聚并获得乐趣的技术社区&/li&&li&答疑邮箱: xiao. (&a href=&https://www.zhihu.com/people/fd7c571a0ada1a72e42e8d& class=&internal&&@萧井陌&/a&&/li&&li&编程入门指南学习群:&a href=&https://link.zhihu.com/?target=https%3A//jq.qq.com/%3F_wv%3DD4AoJu1a& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&&/a&&/li&&/ul&&p&---&/p&&br&&p&日 v1.5 更新&/p&&p&日 v1.4 更新&/p&&p&日 v1.3 更新&/p&&p&日 v1.2 更新&/p&&p&日 v1.1 更新&/p&&p&日 v1.0 更新&/p&&p&---&/p&&br&&p&文章结构:&/p&&ul&&li&o 前言&/li&&li&o 心态调整&/li&&ul&&li&o 确定目标&/li&&li&o 不要浮躁&/li&&li&o 培养兴趣&/li&&li&o 开始学习&/li&&li&o 令人警醒的故事&/li&&li&o 警醒后的反思&/li&&li&o 启蒙&/li&&li&o 入门&/li&&ul&&li&? 计算机系统基础&/li&&li&? 数据结构与算法基础&/li&&li&? 编程语言基础&/li&&li&? 其他&/li&&/ul&&li&o 小结&/li&&li&o 后记&/li&&/ul&&br&&ul&&li&o 附录&/li&&li&o @萧井陌 的编程类回答汇总&/li&&li&o ...&/li&&/ul&&/ul&&p&---&/p&&br&&p&&b&前言&/b&&/p&&p&如今编程成为了一个越来越重要的「技能」:作为设计师,懂一些编程可能会帮你更好地理解自己的工作内容;作为创业者,技术创始人的身份则会让你的很多工作显得更容易。而作为刚想入门的新手,面对眼前海量的信息,或许根本不知道从哪里开始;入门轻松度过初级材料的学习后,发现学习越来越困难,陡峭的学习曲线又让你望而却步;你知道如何在页面上打印输出一些文本行,但是你不知道何时该进行一个真正的有用的项目;你不清楚自己还有哪些不知道的东西,你甚至搞不清下一步该学什么。&/p&&p&这篇文章的内容对此不仅会有一些方向性的建议,还会包含一个&b&基础核心向&/b&的编程入门导引。当然,Step by Step 的路线是不现实的,并且每个人都会有自己的特点,所以给出的这个编程入门导引更多的是为了引发读者的思考,最终帮助你形成适用于自己的学习路线。&/p&&p&但要注意:这篇文章是写给那些真心想学编程的人看的——那些憋着一股狠劲儿,一定要做出个什么真东西,不学好不罢休的人;而不是那些「听说编程好玩」的人,在我看来,这种人永远都入不了编程的门,更别提做出个像样的东西来了。&/p&&p&---&/p&&p&「Disclaimer」: 虽然整篇文章的基调都是所谓的「Strong Opinions, Weakly Held」,但读者还是应该像怀疑身边所有东西那样 怀疑我们所写内容的准确性。若有任何相关疑问欢迎在知乎或技术社区 &a href=&https://link.zhihu.com/?target=http%3A//cocode.cc/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&CoCode&/a& 公开讨论。&/p&&br&&p&&b&心态调整&/b&&/p&&p&&b&确定目标&/b&&/p&&p&在你学习编程之前思考一下你的目标,当你有最终目标时道路会更加的清晰。那么,你想要写什么?网站?游戏? iOS 或者 Android 应用?或是你是想自动化完成一些乏味的任务让你有更多的时间看窗外的风景?也许你只是想更具有就业竞争力找个好工作。所有的这些都是有价值的目标,这些目标都是你编程学习推动力的一部分,没有推动力的人,是无法在略显枯燥的漫长学习之旅中走远的。&/p&&p&这段视频也许能给你启发:&a href=&https://link.zhihu.com/?target=http%3A//v.youku.com/v_show/id_XNTIzNzE2NzQ4.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&What Most Schools Don't Teach&/a&&/p&&p&&b&不要浮躁&/b&&/p&&p&Bad programming is easy. Even Dummies can learn it in 21 days. Good programming requires thought, but everyone can do it and everyone can experience the extreme satisfaction that comes with it.&/p&&p&不管是在线下还是线上的书店,满目都是《21天学通 X》这种速成书目,它们都承诺在很短一段时间内就让你能够学会相关技术。Matthias Felleisen 在他的著作 &a href=&https://link.zhihu.com/?target=http%3A//www.ccs.neu.edu/home/matthi& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&How to Design Programs&/a& 一书中明确指出了这种「速成」的趋势并予以了以上的讽刺。&/p&&p&所谓的「捷径」或者说「&a href=&https://link.zhihu.com/?target=http%3A//en.wikipedia.org/wiki/No_Silver_Bullet& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&银弹&/a&」是不存在的,智者说过,精通某个东西需要10年或10000个小时,也就是汉语中的「十年磨一剑」,所以不用着急,功不唐捐。&/p&&p&&b&培养兴趣&/b&&/p&&p&Most good programmers do programming not because they expect to get paid or get adulation by the public, but because it is fun to program.&/p&&p&– &a href=&https://link.zhihu.com/?target=http%3A//en.wikipedia.org/wiki/Linus_Torvalds& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Linus Torvalds&/a&&/p&&p&沉醉于编程,编程更是为了兴趣。兴趣是推动力的不竭源泉,保持这种充满兴趣的感觉,以便于你能将其投入到你的10年/10000小时的编程时间中。编程很有趣,那是探索的喜悦。那是创造的喜悦。看到自己亲手完成的作品显示在屏幕上很有趣。有人为你的代码而惊叹很有趣。有人在公共场合称赞你的产品、邻居使用你的产品、以及在媒体上讨论你的产品很有趣。编程应该十分有趣,若并非如此,就找出导致编程无趣的问题,然后解决之。&/p&&br&&p&&b&开始学习&/b&&/p&&p&&b&令人警醒的故事&/b&&/p&&p&刚上初中时我便开始了编程学习,很不幸,我读完了好几本当时普遍存在的诸如《21天精通C++》这类的垃圾书,当时读完也无大碍,甚至还能写点小程序。但是软件出故障了我不知道为什么,稍显庞大的编程问题无从下手,碰到现有的库做不到的事也只能两手一摊。虽然我每天不停地编码,但我发现自己的编程能力却是提高的如此缓慢,对于「迭代」与「递归」的概念只有极其有限的了解,可以说只是把计算机当成了计算器来使用。&/p&&p&进入大学后,我主修了物理学,最初的一段时间里我一直在记忆背诵那些物理公式,却不理解她们是如何得出的,她们之间有什么联系,亦或是她们的意义。我不停地学习如何计算解答一些常见的物理问题,却对在这些 How 背后的 Why 一无所知。&/p&&p&而在我尝试做一些基于物理行为的电脑游戏时我再次遇到了之前的的困难:面对新问题时无从下手,面对新问题时的恐惧不断累积滋生,我开始主动逃避,不去真正地理解,而是幻想能通过Google搜索复制粘贴代码解决问题。幸运的是,大二时的一堂课完全改变了我的学习方法。那是第一次我有了「开天眼」的感觉,我痛苦地意识到,我对一些学科只有少的可怜的真正的理解,包括我主修的物理与辅修的计算机科学。&/p&&p&关于那堂课:那时我们刚刚学习完电学和狭义相对论的内容,教授在黑板上写下了这两个主题,并画了一根线将他们连了起来。「假设我们有一个电子沿导线以相对论级别的速度移动…」,一开始教授只是写下了那些我们所熟悉的电学与狭义相对论的常见公式,但在数个黑板的代数推导后,磁场的公式神奇的出现了。虽然几年前我早已知道这个公式,但那时我根本不知道这些现象间的有着这样潜在的联系。磁与电之间的差别只是「观察角度」的问题,我猛然醒悟,此后我不再仅仅追求怎么做 (How),我开始问为什么 (why),开始回过头来,拾起那些最基础的部分,学习那些我之前我本该好好学的知识。这个回头的过程是痛苦的,希望你们能就此警醒,永远不要做这种傻事。&/p&&p&&b&警醒后的反思&/b&&/p&&figure&&img data-rawheight=&326& src=&https://pic4.zhimg.com/c158c3a0fc25db6ce30774_b.jpg& data-rawwidth=&600& class=&origin_image zh-lightbox-thumb& width=&600& data-original=&https://pic4.zhimg.com/c158c3a0fc25db6ce30774_r.jpg&&&/figure&&br&&p&这幅图取自 Douglas Hofstadter 的著作 &a href=&https://link.zhihu.com/?target=http%3A//en.wikipedia.org/wiki/G& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&G?del, Escher, Bach&/a&。图中的每一个字母都由其他更小的字母组成。在最高层级,我们看的是 &MU&,M 这个字母由三个 HOLISM (&a href=&https://link.zhihu.com/?target=http%3A//zh.wikipedia.org/wiki/%25E6%%25E5%%25E8%25A7%2580& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&整全观&/a&)构成,U则是由一个 REDUCTIONISM (&a href=&https://link.zhihu.com/?target=http%3A//zh.wikipedia.org/wiki/%5BF%5E5%2525& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&还原论&/a&)构成,前者的每一个字母都包含后者的后者整个词,反之亦然。而在最低层级,你会发现最小的字母又是由重复的 &MU& 组成的。&/p&&p&每一层次的抽象都蕴含着信息,如果你只是幼稚地单一运用整体论在最高层级观察,或运用还原论观察最低层级,你所得到的只有 &MU& (在一些地区的方言中 mu 意味着什么都没有)。问题来了,怎样才能尽可能多的获取每个层级的信息?或者换句话说,该怎样学习复杂领域(诸如编程)包含的众多知识?&/p&&p&教育与学习过程中普遍存在一个关键问题:初学者们的目标经常过于倾向&a href=&https://link.zhihu.com/?target=http%3A//zh.wikipedia.org/wiki/%25E6%%25E5%%25E8%25A7%2580& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&整全观&/a&而忽略了基础,举个常见的例子,学生们非常想做一个机器人,却对背后的&/p&&p&理解物理模型 → 理解电子工程基础 → 理解伺服系统与传感器 → 让机器人动起来&/p&&p&这一过程完全提不起兴趣。&/p&&p&在这里对于初学者有两个大坑:&/p&&ol&&li&1 如果初学者们只与预先构建好的「发动机和组件」接触(没有理解和思考它们构造的原理),这会严重限制他们在将来构建这些东西的能力,并且在诊断解决问题时无从下手。&/li&&li&2 第二个坑没有第一个那么明显:幼稚的「整体论」方法有些时候会显得很有效,这有一定的隐蔽性与误导性,但是一两年过后(也许没那么长),当你在学习路上走远时,再想回过头来「补足基础」会有巨大的心理障碍,你得抛弃之前自己狭隘的观念,耐心地缓步前进,这比你初学时学习基础知识困难得多。&/li&&/ol&&p&但也不能矫枉过正,陷入还原论的大坑,初学时便一心试图做宏大的理论,这样不仅有一切流于理论的危险,枯燥和乏味还会让你失去推动力。这种情况经常发生在计算机科班生身上。&/p&&p&为了更好理解,可以将学习编程类比为学习厨艺:你为了烧得一手好菜买了一些关于菜谱的书,如果你只是想为家人做菜,这会是一个不错的主意,你重复菜谱上的步骤也能做出不赖的菜肴,但是如果你有更大的野心,真的想在朋友面前露一手,做一些独一无二的美味佳肴,甚至成为「大厨」,你必须理解这些菜谱背后大师的想法,理解其中的理论,而不仅仅是一味地实践。但是如果你每天唯一的工作就是阅读那些厚重的理论书籍,因为缺乏实践,你只会成为一个糟糕的厨子,甚至永远成为不了厨子,因为看了几天书后你就因为枯燥放弃了厨艺的学习。&/p&&p&总之,编程是连接理论与实践的纽带,是&a href=&https://link.zhihu.com/?target=http%3A//zh.wikip& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&计算机科学&/a&与计算机应用技术相交融的领域。正确的编程学习方法应该是:通过自顶而下的探索与项目实践,获得编程直觉与推动力;从自底向上的打基础过程中,获得最重要的通用方法并巩固编程思想的理解。&/p&&p&作为初学者,应以后者为主,前者为辅。&/p&&p&&b&启蒙&/b&&/p&&p&「学编程应该学哪门语言?」这经常是初学者问的第一个问题,但这是一个错误的问题,你最先考虑的问题应该是「哪些东西构成了编程学习的基础」?&/p&&p&编程知识的金字塔底部有三个关键的部分:&/p&&ol&&li&o 算法思想:例如怎样找出一组数中最大的那个数?首先你得有一个 maxSoFar 变量,之后对于每个数…&/li&&li&o 语法:我怎样用某种编程语言表达这些算法,让计算机能够理解。&/li&&li&o 系统基础:为什么 while(1) 时线程永远无法结束?为什么 int *foo() { int x = 0; return &x; } 是不可行的?&/li&&/ol&&p&启蒙阶段的初学者若选择C语言作为第一门语言会很困难并且枯燥,这是因为他们被迫要同时学习这三个部分,在能做出东西前要花费很多时间。&/p&&p&因此,为了尽量最小化「语法」与「系统基础」这两部分,建议使用 Python 作为学习的第一门语言,虽然 Python 对初学者很友好,但这并不意味着它只是一个「玩具」,在大型项目中你也能见到它强大而灵活的身影。熟悉 Python 后,学习 C 语言是便是一个不错的选择了:学习 C 语言会帮助你以靠近底层的视角思考问题,并且在后期帮助你理解操作系统层级的一些原理。&/p&&p&下面给出了一个可供参考的启蒙阶段导引,完成后你会在头脑中构建起一个整体框架,帮助你进行自顶向下的探索。下面的材料没有先后顺序,如果卡壳的话可以考虑换另一份材料。&/p&&ol&&li&o 完成 &a href=&%22&&MIT 6.00.1x&/a& (&a href=&https://link.zhihu.com/?target=http%3A//www.xuetangx.com/courses/course-v1%3AMITx%2B6_00_1x%2Bsp/about& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&麻省理工:计算机科学和 Python 编程导论&/a&)。虽然该课程的教学语言为 Python,但作为一门优秀的导论课,它强调学习计算机科学领域里的重要概念和范式,而不仅仅是教你特定的语言。如果你不是科班生,这能让你在自学时开阔眼界;课程内容:计算概念,Python 编程语言,一些简单的数据结构与算法,测试与调试。&/li&&li&o 完成 &a href=&https://link.zhihu.com/?target=https%3A//www.edx.org/course/introduction-computer-science-harvardx-cs50x& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Harvard CS50x&/a& (&a href=&https://link.zhihu.com/?target=http%3A//v.163.com/special/opencourse/cs50.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&哈佛大学:计算机科学&/a&)。同样是导论课,但这门课与MIT的导论课互补。教学语言涉及 C, PHP, JavaScript + SQL, HTML + CSS,内容的广度与深度十分合理,还能够了解到最新的一些科技成果,可以很好激发学习计算机的兴趣。支线任务:阅读《&a href=&https://link.zhihu.com/?target=https%3A//book.douban.com/subject//& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&编码&/a&》&/li&&li&o 完成 &a href=&https://link.zhihu.com/?target=http%3A//www.liaoxuefeng.com/wiki/958fa6d3a2e542c000& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Python 教程&/a&。&/li&&/ol&&br&&p&&b&入门&/b&&/p&&p&结束启蒙阶段后,初学者积累了一定的代码量,对编程也有了一定的了解。这时你可能想去学一门具体的技术,诸如 Web 开发, Android 开发,iOS 开发什么的,你可以去尝试做一些尽可能简单的东西,给自己一些正反馈,补充自己的推动力。但记住别深入,这些技术有无数的细节,将来会有时间去学习;同样的,这时候也别过于深入特定的框架和语言,现在是学习&a href=&https://link.zhihu.com/?target=http%3A//zh.wikipedia.org/wiki/%25E8%25AE%25A1%25E7%25AE%& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&计算机科学&/a&通用基础知识的时候,不要试图去抄近路直接学你现在想学的东西,这是注定会失败的。&/p&&p&那么入门阶段具体该做些什么呢?这时候你需要做的是反思自己曾经写过的程序,去思考程序为什么 (Why) 要这样设计?,思考怎样 (How) 写出更好的程序?试图去探寻理解编程的本质:利用计算机解决问题。&/p&&p&设想 :&/p&&p&X = 用于思考解决方案的时间,即「解决问题」 部分&/p&&p&Y = 用于实现代码的时间,即「利用计算机」部分」&/p&&p&编程能力 = F(X, Y) (X&Y)&/p&&p&要想提高编程能力,就得优化 X,Y 与函数 F(X, Y),很少有书的内容能同时着重集中在这三点上,但有一本书做到了——&a href=&https://link.zhihu.com/?target=https%3A//github.com/sarabander/sicp-pdf& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Structure and Interpretation of Computer Programs&/a& (SICP)《&a href=&https://link.zhihu.com/?target=https%3A//book.douban.com/subject/1148282/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&计算机程序的构造和解释&/a&》,它为你指明了这三个变量的方向。在阅读 SICP 之前,你也许能通过调用几个函数解决一个简单问题。但阅读完 SICP 之后,你会学会如何将问题抽象并且分解,从而处理更复杂更庞大的问题,这是编程能力巨大的飞跃,这会在本质上改变你思考问题以及用代码解决问题的方式。此外,SICP 的教学语言为 Scheme,可以让你初步了解&a href=&https://link.zhihu.com/?target=http%3A//zh.wikipedia.org/wiki/%25E5%2587%25BD%25E6%%25E7%25A8%258B%25E5%25BC%258F%25E8%25AA%259E%25E8%25A8%2580& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&函数式编程&/a&。更重要的是,他的语法十分简单,你可以很快学会它,从而把更多的时间用于学习书中的编程思想以及复杂问题的解决之道上。&/p&&p&&a href=&https://link.zhihu.com/?target=http%3A//zh.wikipedia.org/wiki/%25E5%25BD%25BC%25E5%25BE%25B7%25C2%25B7%25E8%25AB%25BE%25E7%25B1%25B3%25E6%25A0%25BC& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Peter Norvig&/a& 曾经写过一篇非常精彩的 SICP &a href=&https://link.zhihu.com/?target=http%3A//www.amazon.com/review/R403HR4VL71K8/ref%3Dcm_cr_rdp_perm& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&书评&/a&,其中有这样一段:&/p&&p&To use an analogy, if SICP were about automobiles, it would be for the person who wants to know how cars work, how they are built, and how one might design fuel-efficient, safe, reliable vehicles for the 21st century. The people who hate SICP are the ones who just want to know how to drive their car on the highway, just like everyone else.&/p&&p&如果你是文中的前者,阅读SICP将成为你衔接启蒙与入门阶段的关键点&/p&&p&虽然SICP是一本「入门书」,但对于初学者还是有一定的难度,以下是一些十分有用的辅助资源:&/p&&ol&&li&o &a href=&https://link.zhihu.com/?target=https%3A//www.udacity.com/course/cs212& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Udacity CS212 Design of Computer Program&/a&:由上文提到的Google 研究主管 Peter Norvig 主讲,教学语言为 Python,内容有一定难度。&/li&&li&o &a href=&https://link.zhihu.com/?target=http%3A//www.ccs.neu.edu/home/matthias/HtDP2e/Draft/index.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&How to Design Programs, Second Edition&/a&:HtDP 的起点比SICP低,书中的内容循循善诱,对初学者很友好,如果觉得完成SICP过于困难,可以考虑先读一读 HtDP。&/li&&li&o &a href=&%22ht&&UC Berkeley SICP 授课视频&/a&以及 SICP 的两位作者给 Hewlett-Packard 公司员工培训时的录像(&a href=&https://link.zhihu.com/?target=https%3A//github.com/DeathKing/Learning-SICP/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&中文化项目&/a&)&/li&&li&o &a href=&https://link.zhihu.com/?target=http%3A//composingprograms.com/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Composing Programs&/a&:一个继承了SICP思想但使用Python作为教学语言的编程导论(其中包含了一些小项目)&/li&&li&o &a href=&https://link.zhihu.com/?target=http%3A//sicp.readthedocs.org/en/latest/index.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&SICP 解题集&/a&:对于书后的习题,作为初学者应尽力并量力完成。&/li&&/ol&&p&完成了这部分学习后,你会逐步建立起一个自己的程序设计模型,你的脑子里不再是一团乱麻,你会意识到记住库和语法并不会教你如何解决编程问题,接下来要学些什么,在你心里也会明朗了很多。这时候才是真正开始进行项目实践,补充推动力的好时机。关于项目实践:对于入门阶段的初学者,参与开源项目还为时过早,这时候应该开始一些简单的项目,诸如搭建一个网站并维护它,或是编写一个小游戏再不断进行扩展,如果你自己的想法不明确,推荐你关注 &a href=&http://zhuanlan.zhihu.com/alchemelon& class=&internal&&炼瓜研究所 &/a&,或者从 &a href=&https://link.zhihu.com/?target=https%3A//github.com/karan/Projects/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Mega Project List&/a& 中选取自己喜欢的项目。&/p&&p&如果你觉得 SICP 就是搞不定,也不要强迫自己,先跳过,继续走常规路线:开始读 &a href=&https://link.zhihu.com/?target=http%3A//book.douban.com/subject/1998341/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&The Elements of Computing Systems&/a& 吧,它会教会你从最基本的 Nand 门开始构建计算机,直到俄罗斯方块在你的计算机上顺利运行。 &a href=&https://link.zhihu.com/?target=http%3A//www.nand2tetris.org/course.php& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&具体内容&/a&不多说了,这本书会贯穿你的整个编程入门阶段,你入门阶段的目标就是坚持完成这本书的所有项目(包括一个&b&最简的&/b&编译器与操作系统)。&/p&&p&&b&为了完全搞定这本书,为了继续打好根基。为了将来的厚积薄发,在下面这几个方面你还要做足功课(注意:下面的内容没有绝对意义上的先后顺序):&/b&&/p&&br&&p&&b&计算机系统基础&/b&&/p&&p&有了之前程序设计的基础后,想更加深入地把握计算机科学的脉络,不妨看看这本书:&a href=&https://link.zhihu.com/?target=http%3A//csapp.cs.cmu.edu/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Computer Systems: A Programmer's Perspective, 3/E&/a&《&a href=&%22http:&&深入理解计算机系统&/a&》。这里点名批评这本书的中译名,其实根本谈不上什么深入啦,这本书只是 &a href=&https://link.zhihu.com/?target=http%3A//zh.wikipedia.org/wiki/%25E5%258D%25A1%25E5%E5%259F%25BA%25E6%25A2%%259A%%25A4%25A7%25E5%25AD%25A6& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&CMU&/a& 的「&a href=&https://link.zhihu.com/?target=https%3A//www.cs.cmu.edu/%7E213/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&计算机系统导论&/a&」的教材而已。CMU的计算机科学专业相对较偏软件,该书就是从一个程序员的视角观察计算机系统,以「程序在计算机中如何执行」为主线,全面阐述计算机系统内部实现的诸多细节。&/p&&p&如果你看书觉得有些枯燥的话,可以跟一门 Coursera 上的 MOOC: &a href=&https://link.zhihu.com/?target=https%3A//www.coursera.org/course/hwswinterface& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&The Hardware/Software Interface&/a&,这门课的内容是 CSAPP 的一个子集,但是最经典的&a href=&https://link.zhihu.com/?target=http%3A//csapp& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&实验部分&/a&都移植过来了。同时,可以看看 &a href=&https://link.zhihu.com/?target=http%3A//book.douban.com/subject/1139336/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&The C Programming Language&/a&,回顾一下C语言的知识。&/p&&p&完成这本书后,你会具备坚实的系统基础,也具有了学习操作系统,编译器,计算机网络等内容的先决条件。当学习更高级的系统内容时,翻阅一下此书的相应章节,同时编程实现其中的例子,一定会对书本上的理论具有更加感性的认识,真正做到经手的代码,从上层设计到底层实现都了然于胸,并能在脑中回放数据在网络-&内存-&缓存-&CPU 的流向。&/p&&br&&p&&b&数据结构与算法基础&/b&&/p&&p&如今,很多人认为编程(特别是做 web 开发)的主要部分就是使用别人的代码,能够用清晰简明的方式表达自己的想法比掌握硬核的数学与算法技巧重要的多,数据结构排序函数二分搜索这不都内置了吗?工作中永远用不到,学算法有啥用啊?这种扛着实用主义大旗的「码农」思想当然不可取。没有扎实的理论背景,遭遇瓶颈是迟早的事。&/p&&p&数据结构和算法是配套的,入门阶段你应该掌握的主要内容应该是:这个问题用什么算法和数据结构能更快解决。这就要求你对常见的数据结构和算法了熟于心,你不一定要敲代码,用纸手写流程是更快的方式。对你不懂的&a href=&https://link.zhihu.com/?target=http%3A//en.wikipedia.org/wiki/List_of_data_structures& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&数据结构&/a&和&a href=&https://link.zhihu.com/?target=http%3A//en.wikipedia.org/wiki/List_of_algorithms& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&算法&/a&,你要去搜它主要拿来干嘛的,使用场景是什么。&/p&&p&供你参考的学习资源:&/p&&ol&&li&o 《&a href=&https://link.zhihu.com/?target=http%3A//book.do& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&算法导论&/a&》:有人说别把这本书当入门书,这本书本来就不是入门书嘛,虽说书名是 Introduction to Algorithms,这只不过是因为作者不想把这本书与其他书搞重名罢了。当然,也不是没办法拿此书入门,读第一遍的时候跳过习题和证明就行了嘛,如果还觉得心虚先看看这本《&a href=&https://link.zhihu.com/?target=http%3A//book.douban.com/subject/1139426/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&数据结构与算法分析&/a&》&/li&&li&o Algorithms: Design and Analysis [&a href=&https://link.zhihu.com/?target=https%3A//www.coursera.org/course/algo& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Part 1&/a&] & [&a href=&https://link.zhihu.com/?target=https%3A//www.coursera.org/course/algo2& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Part 2&/a&]: Stanford 开的算法课,不限定语言,两个部分跟下来算法基础基本就有了;如果英文不过关:&a href=&https://link.zhihu.com/?target=http%3A//v.163.com/special/opencourse/algorithms.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&麻省理工学院:算法导论&/a&&/li&&li&o 入门阶段还要注意培养使用常规算法解决小规模问题的能力,结合前文的SICP部分可以读读这几本书:《&a href=&https://link.zhihu.com/?target=http%3A//book.douban.com/subject/3227098/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&编程珠玑&/a&》,《&a href=&https://link.zhihu.com/?target=http%3A//book.douban.com/subject/1173548/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&程序设计实践 &/a&》&/li&&/ol&&p&&b&编程语言基础&/b&&/p&&p&Different languages solve the same problems in different ways. By learning several different approaches, you can help broaden your thinking and avoid getting stuck in a rut. Additionally, learning many languages is far easier now, thanks to the wealth of freely available software on the Internet&/p&&p&- &a href=&%22https://&&The Pragmatic Programmer&/a&&/p&&p&此外还要知道,学习第 n 门编程语言的难度是第 (n-1) 门的一半,所以尽量去尝试不同的编程语言与编程范式,若你跟寻了前文的指引,你已经接触了:「干净」的脚本语言 Python, 传统的命令式语言 C, 以及&a href=&https://link.zhihu.com/?target=http%3A//matt.might.net/articles/i-love-you-in-racket/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&浪漫&/a&的函数式语言 Scheme 三个好朋友。但仅仅是接触远远不够,你还需要不断继续加深与他们的友谊,并尝试结交新朋友,美而雅的 &a href=&https://link.zhihu.com/?target=http%3A//mislav.uniqpath.com/poignant-guide/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Ruby&/a& 小姑娘,Hindley-Milner 语言家族的掌中宝 &a href=&https://link.zhihu.com/?target=http%3A//learnyouahaskell.com/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Haskell&/a& 都是不错的选择。至于 &a href=&%22http:/&&C++ &/a&,喜欢的话学学也无妨。&/p&&p&现实是残酷的,在软件工程领域仍旧充斥着一些狂热者,他们只掌握着一种编程语言,也只想掌握一种语言,他们认为自己掌握的这门语言是最好的,其他异端都是傻X。这种人也不是无药可救,有一种很简单的治疗方法:让他们写一个编译器。要想真正理解编程语言,你必须亲自实现一个。现在是入门阶段,不要求你去上一门编译器课程,但要求你能至少实现一个简单的解释器。&/p&&p&供你参考的学习资源:&/p&&ol&&li&o &a href=&https://link.zhihu.com/?target=http%3A//book.douban.com/subject/2152385/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&《程序设计语言-实践之路》&/a&:CMU 编程语言原理的教材,程序语言入门书,现在就可以看,会极大扩展你的眼界,拉开你与普通人的差距。&/li&&li&o &a href=&https://link.zhihu.com/?target=https%3A//www.coursera.org/course/proglang& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Programming Languages&/a&:课堂上你能接触到极端 FP (函数式)的 SML,中性偏 FP 的 Racket,以及极端 OOP (&a href=&https://link.zhihu.com/?target=http%3A//zh.wikipedia.org/wiki/%25E9%259D%25A2%25E5%E5%25AF%25B9%25E8%25B1%25A1%25E7%25A8%258B%25E5%25BA%258F%25E8%25AE%25BE%25E8%25AE& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&面向对象&/a&)的 Ruby,并学会问题的 FP 分解 vs OOP 分解、ML 的模式匹配、Lisp 宏、不变性与可变性、解释器的实现原理等,让你在将来学习新语言时更加轻松并写出更好的程序。&/li&&li&o &a href=&https://link.zhihu.com/?target=https%3A//www.udacity.com/course/cs262& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Udacity CS262 Programming Language&/a&:热热身,教你写一个简单的浏览器——其实就是一个 JavaScript 和 HTML 的解释器,完成后的成品还是很有趣的;接下来,试着完成一个之前在SICP部分提到过的项目:用Python写一个 &a href=&https://link.zhihu.com/?target=http%3A//inst.eecs.berkeley.edu/%7Ecs61a/fa13/proj/scheme/scheme.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Scheme Interpreter&/a&&/li&&/ol&&p&&b&其他&/b&&/p&&p&编程入门阶段比较容易忽视的几点:&/p&&ol&&li&1 学会提问:学习中肯定会遇到问题,应该学会正确的使用搜索引擎。当单靠检索无法解决问题时,去 &a href=&https://link.zhihu.com/?target=http%3A//stackoverflow.com/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Stack Overflow&/a& 或知乎提问,提问前读读这篇文章:&a href=&https://link.zhihu.com/?target=http%3A//mp.weixin.qq.com/s%3F__biz%3DMzI3NDI5ODQ2Ng%3D%3D%26mid%3D%26idx%3D1%26sn%3D201ccfdfb5d855& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&能有效解决问题的提问方法&/a&。&/li&&li&2 不要做一匹独狼:尝试在 &a href=&https://link.zhihu.com/?target=http%3A//cocode.cc/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&CoCode&/a& 与他人交流想法。尝试搭建一个像&a href=&%22h&&这样&/a&简单的个人网站。试着在博客上记录自己的想法。订阅自己喜欢的编程类博客,推荐几个供你参考:&a href=&https://link.zhihu.com/?target=http%3A//www.joelonsoftware.com/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Joel on Software&/a&, &a href=&https://link.zhihu.com/?target=http%3A//www.norvig.com/index.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Peter Norvig&/a&, &a href=&https://link.zhihu.com/?target=http%3A//blog.codinghorror.com/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Coding Horror&/a&&/li&&li&3 学好英语:英语是你获取高质量学习资源的主要工具,但在入门阶段,所看的那些翻译书信息损耗也没那么严重,以你自己情况权衡吧。&/li&&/ol&&p&&b&小结&/b&&/p&&p&以上的内容你不应该感到惧怕,编程的入门不是几个星期就能完成的小项目。期间你还会遇到无数的困难,当你碰壁时试着尝试&a href=&https://link.zhihu.com/?target=http%3A//www.quora.com/Education/How-can-you-learn-faster/answer/Acaz-Pereira& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&「费曼」技巧&/a&:将难点分而化之,切成小知识块,再逐个对付,之后通过向别人清楚地解说来检验自己是否真的理解。当然,依旧会有你解决不了的问题,这时候不要强迫自己——很多时候当你之后回过头来再看这个问题时,一切豁然开朗。&/p&&p&此外不要局限于上文提到的那些材料,还有一些值得在入门阶段以及将来的提升阶段反复阅读的书籍。这里不得不提到在 &a href=&https://link.zhihu.com/?target=http%3A//stackoverflow.com/questions/1711/what-is-the-single-most-influential-book-every-programmer-should-read& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Stack Overflow&/a& 上票选得出的程序员必读书单中,排在前两位的两本书:&/p&&p&&a href=&https://link.zhihu.com/?target=http%3A//book.douban.com/subject/Fi%3D0& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Code Complete&/a&:不管是对于经验丰富的程序员还是对于那些没有受过太多的正规训练的新手程序员,此书都能用来填补自己的知识缺陷。对于入门阶段的新手们,可以重点看看涉及变量名,测试,个人性格的章节。&/p&&p&&a href=&https://link.zhihu.com/?target=http%3A//book.douban.com/subject/1417047/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&The Pragmatic Programmer&/a& :有人称这本书为代码小全:从 &a href=&https://link.zhihu.com/?target=http%3A//zh.wikipedia.org/wiki/%25E4%25B8%%25AC%25A1%25E4%25B8%%25BB%%25B8%%25AC%25A1& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&DRY&/a& 到 &a href=&https://link.zhihu.com/?target=http%3A//zh.wikipedia.org/wiki/KISS%25E5%258E%259F%25E5%& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&KISS&/a&,从做人到做程序员均有涉及。&/p&&br&&p&这本书的作者 Dave ,在书中开篇留了这样一段话:&/p&&p&&b&You’re a Pragmatic Programmer. You aren’t wedded to any particular technology, but you have a broad enough background in the science, and your experience with practical projects allows you to choose good solutions in particular situations. Theory and practice combine to make you strong. You adjust your approach to suit the current circumstances and environment. And you do this continuously as the work progresses. Pragmatic Programmers get the job done, and do it well.&/b&&/p&&p&这段话以及他创立的 &a href=&https://link.zhihu.com/?target=https%3A//pragprog.com/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&The Pragmatic Bookshelf&/a& 一直以来都积极地影响着我,因此这篇指南我也尽量贯彻了这个思想,引导并希望你们成为一名真正的 Pragmatic Programmer 。&/p&&br&&p&&b&后记&/b&&/p&&p&如果你能设法完成以上的所有任务,恭喜你,你已经真正实现了编程入门。这意味着你在之后更深入的学习中,不会畏惧那些学习新语言的任务,不会畏惧那些「复杂」的 API,更不会畏惧学习具体的技术,甚至感觉很容易。当然,为了掌握这些东西你依旧需要大量的练习,腰还是会疼,走路还是会费劲,一口气也上不了5楼。但我能保证你会在思想上有巨大的转变,获得极大的自信,看老师同学和 &a href=&https://link.zhihu.com/?target=http%3A//www.csdn.net/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&CSDN&/a& 的眼光会变得非常微妙,虽然只是完成了编程入门,但已经成为了程序员精神世界的高富帅。不,我说错了,即使是高富帅也不会有强力精神力,他也会怀疑自己,觉得自己没钱就什么都不是了。但总之,你遵循指南好好看书,那就会体验「会当凌绝顶」的感觉。&/p&&figure&&img data-rawheight=&337& src=&https://pic3.zhimg.com/5d6f72ac17ad317be649f8_b.jpg& data-rawwidth=&600& class=&origin_image zh-lightbox-thumb& width=&600& data-original=&https://pic3.zhimg.com/5d6f72ac17ad317be649f8_r.jpg&&&/figure&&br&&p&欢迎实践过的同学现身说法。几位读者的实例:&/p&&ol&&li&o &a href=&https://link.zhihu.com/?target=http%3A//zhi.hu/hhiA& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&非计算机专业,计算机如何入门? - 浪无痕&/a&&/li&&li&o &a href=&https://link.zhihu.com/?target=http%3A//my.oschina.net/voler/blog/396424& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&我只想成为一名合格的程序员&/a&&/li&&li&o &a href=&https://link.zhihu.com/?target=http%3A//blog.csdn.net/a910626/article/details/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&知乎《编程入门指南v1.3》思维导图&/a&&/li&&/ol&&br&&p&附(zhèng)录(wén)&/p&&p&&b&@&/b&&b&萧井陌&/b&&b&的编程类回答汇总&/b&&/p&&p&方向:&/p&&ol&&li&o &a href=&http://www.zhihu.com/question//answer& class=&internal&&怎么成为一个优秀的程序员,而不是一个优秀的码农?&/a&&/li&&/ol&&p&优秀的程序员会告诉你打根基的重要性,会劝你在厚积薄发前要隐忍。&/p&&p&优秀的程序员应该善用包装...&/p&&ol&&li&o &a href=&http://www.zhihu.com/question//answer/& class=&internal&&计算机本科应届毕业生要有怎样的能力才算比较好的?&/a&&/li&&/ol&&p&对本科生的要求其实很简单,认真学过专业课就行。&/p&&p&所谓认真学过专业课的程度是:...&/p&&ol&&li&o &a href=&http://www.zhihu.com/& class=&internal&&想进入微软,本科该如何努力?&/a&&/li&&/ol&&p&你可以找一个美国大学学他们的计算机课程,课程设置和教材都能查到,书都能买到。那几所学校的本科课程安排差异比较大,全学也不是不可以。做好这几点: ...&/p&&ol&&li&o &a href=&http://zhihu.com/question//answer/& class=&internal&&大四学生,想通过两到三年的积累去Google工作,请问应如何准备?&/a&&/li&&/ol&&p&我觉得你得先找到一个技术方向,树立一个以此技术方向为首要目标的原则,做好这个方面的事情,对这个方面的所有技术细节都务求深入了解。然后呢...&/p&&ol&&li&o &a href=&http://zhihu.com/question//answer/& class=&internal&&文科生如何转行当程序员?考研是最好选择吗?&/a&&/li&&/ol&&p&0. 找一本《计算机导论》类的书籍看看,了解一下行业大致情况,随便翻翻就好&/p&&p&1. 去维基百科翻一下历年图灵奖得奖情况,粗略了解一下行业历史...&/p&&ol&&li&o &a href=&http://www.zhihu.com/question//a& class=&internal&&有哪些适合程序员读的人文书籍?&/a&&/li&&/ol&&p&程序员也是人, 程序员的整体素质在其他行业也是通用的.&/p&&p&so.... 这就产生了很多其他行业的书...&/p&&p&方法:&/p&&ol&&li&o &a href=&http://zhihu.com/question//answer/& class=&internal&&如何学习不感兴趣但自己也认为很重要的东西?&/a&&/li&&li&o &a href=&http://zhihu.com/question//answer/& class=&internal&&兴趣广泛和保持专注是否矛盾?&/a&&/li&&li&o &a href=&http://zhihu.com/question//answer/& class=&internal&&在学习编程的过程中如何权衡寻求方法工具和埋头苦干?&/a&&/li&&li&o &a href=&http://zhihu.com/question//answer/& class=&internal&&新手关于如何看编程经典书的一些疑惑?&/a&&/li&&li&o &a href=&https://link.zhihu.com/?target=http%3A//zhi.hu/aaOB& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&计算机方面的经典书籍,不做或少做习题会对学习效果造成多大影响呢?&/a&&/li&&li&o 有哪些老鸟程序员知道而新手不知道的小技巧?&/li&&li&o &a href=&https://www.zhihu.com/question//answer/& class=&internal&&改bug是程序员的任务里比较低贱的工作内容吗?&/a&&/li&&li&o &a href=&https://www.zhihu.com/question//answer/& class=&internal&&如何辨别一个程序员水平的高低?&/a&&/li&&/ol&&br&&p&细分:&/p&&ul&&ul&&li&o &a href=&http://zhihu.com/question//answer/& class=&internal&&如何去学习程序员的三大浪漫,编译原理,图形学,操作系统?&/a&&/li&&li&o &a href=&http://zhihu.com/question//answer/& class=&internal&&数据库、操作系统、编译原理应该以怎样的的顺序学习?&/a&&/li&&li&o &a href=&http://zhihu.com/question//answer/& class=&internal&&如何在六个月的时间内完成一个简单的操作系统,应该要学些什么?&/a&&/li&&li&o &a href=&http://zhihu.com/question//answer/& class=&internal&&计算机系大四学生如何在六个月的时间内完成一个编译器?要学些什么?&/a&&/li&&li&o &a href=&http://zhihu.com/question//answer/& class=&internal&&算法到底应该怎么学?&/a&&/li&&li&o &a href=&http://zhihu.com/question& class=&internal&&WEB 开发还有前途吗?&/a&&/li&&li&o &a href=&http://zhihu.com/question//answer/& class=&internal&&嵌入式开发还有前途吗?&/a&&/li&&li&o &a href=&http://zhihu.com/question//answer/& class=&internal&&已参加工作的程序员如何系统提升英语阅读能力?&/a&&/li&&/ul&&/ul&&br&&p&&b&@&/b&&b&萧井陌的知乎回答集锦&/b&(按赞同数排列) ( 更新)&/p&&ol&&li&o &a href=&%22&&PDF 格式&/a&&/li&&li&o &a href=&https://link.zhihu.com/?target=http%3A//pan.baidu.com/s/1qWqNzPi& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&ePub 格式&/a&&/li&&/ol&&figure&&img data-rawheight=&445& src=&https://pic1.zhimg.com/3d9d7ba432eabc38cd140_b.jpg& data-rawwidth=&600& class=&origin_image zh-lightbox-thumb& width=&600& data-original=&https://pic1.zhimg.com/3d9d7ba432eabc38cd140_r.jpg&&&/figure&&br&&p&---&/p&&br&&p&...&/p&
作者:, 自由转载-非商用-非衍生-保持署名 | Creative Commons BY-NC-ND 3.0:一个让大家学习、成长、相聚并获得乐趣的技术社区答疑邮箱: xiao. (编程入门指南学习群:--- 日 v1.5 更新2…
&figure&&img src=&https://pic7.zhimg.com/v2-d3d0f61b2a3ed175e7f8_b.jpg& data-rawwidth=&1440& data-rawheight=&800& class=&origin_image zh-lightbox-thumb& width=&1440& data-original=&https://pic7.zhimg.com/v2-d3d0f61b2a3ed175e7f8_r.jpg&&&/figure&&p&作者:Adam Geitgey&br&&/p&&p&原文:&a href=&http://link.zhihu.com/?target=https%3A//medium.com/%40ageitgey/machine-learning-is-fun-80ea3ec3c471%23.ak1of1xbg& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&medium.com/@ageitgey/ma&/span&&span class=&invisible&&chine-learning-is-fun-80ea3ec3c471#.ak1of1xbg&/span&&span class=&ellipsis&&&/span&&/a&&/p&&p&翻译:巡洋舰科技——赵95&/p&&p&校对:离线Offline——林沁&/p&&p&转载请联系译者。&/p&&p&你是否曾经听到过人们谈论机器学习,而你却对其含义只有一个模糊的概念呢?你是否已经厌倦了在和同事对话时只能点头呢?现在,让我们一起来改变这个现状吧!&/p&&h2&&b&这篇指南是为那些对机器学习感兴趣,但又不知从哪里开始的人而写的。我猜有很多人曾经尝试着阅读机器学习的维基百科词条,但是读着读着倍感挫折,然后直接放弃,希望能有人给出一个更直观的解释。本文就是你们想要的东西。&/b&&/h2&&p&本文的写作目标是让任何人都能看懂,这意味着文中有大量的概括。但是那又如何呢?只要能让读者对机器学习更感兴趣,这篇文章的任务也就完成了。&/p&&p&&b&什么是机器学习?&/b&&/p&&p&机器学习是一种概念:不需要写任何与问题有关的特定代码,&b&泛型算法(Generic Algorithms)&/b&[1]就能告诉你一些关于你数据的有趣结论。不用编码,你将数据输入泛型算法当中,它就会在数据的基础上建立出它自己的逻辑。&/p&&p&比如说,有一种算法被称为分类算法,它可以将数据分为不同的组。分类算法可以用来识别手写数字;不用修改一行代码,它也可以用来区分垃圾邮件和非垃圾邮件。如果给同样的算法输入不同的训练数据,它就能得出不同的分类逻辑。&figure&&img src=&https://pic3.zhimg.com/v2-23a81ef1c13b665e0d62_b.jpg& data-rawwidth=&1010& data-rawheight=&939& class=&origin_image zh-lightbox-thumb& width=&1010& data-original=&https://pic3.zhimg.com/v2-23a81ef1c13b665e0d62_r.jpg&&&/figure&&/p&&p&&i&机器学习算法是个黑盒,它可以重复使用于很多不同的分类问题。&/i&&/p&&p&「机器学习」是一个涵盖性术语,它覆盖了大量类似的泛型算法。&/p&&p&&b&两类机器学习算法&/b&&/p&&p&你可以把机器学习算法分为两大类:&b&监督式学习(supervised Learning)&/b&和&b&非监督式学习(unsupervised Learning)&/b&。要区分两者很简单,但也非常重要。&/p&&p&&b&监督式学习&/b&&/p&&p&假设你是一名房地产经纪人,你的生意蒸蒸日上,因此你雇了一批新员工来帮忙。但是问题来了——虽然你可以一眼估算出房子的价格,但新员工却不像你这样经验丰富,他们不知道如何给房子估价。&/p&&p&为了帮助你的新员工(也许就是为了给自己放个假嘻嘻),你决定写一个可以根据房屋大小、地段以及同类房屋成交价等因素来评估一间房屋的价格的小软件。&/p&&p&近三个月来,每当你的城市里有人卖了房子,你都记录了下面的细节——卧室数量、房屋大小、地段等等。&b&但最重要的是,你写下了最终的成交价:&figure&&img src=&https://pic2.zhimg.com/v2-aa95a053fbf2afd736d69_b.jpg& data-rawwidth=&800& data-rawheight=&437& class=&origin_image zh-lightbox-thumb& width=&800& data-original=&https://pic2.zhimg.com/v2-aa95a053fbf2afd736d69_r.jpg&&&/figure&&/b&&/p&&p&&i&这就是我们的「训练数据」。&/i&&/p&&p&使用这些训练数据,我们要来编写一个能够估算该地区其他房屋价值的程序:&figure&&img src=&https://pic3.zhimg.com/v2-d00f6b6ce46_b.jpg& data-rawwidth=&800& data-rawheight=&150& class=&origin_image zh-lightbox-thumb& width=&800& data-original=&https://pic3.zhimg.com/v2-d00f6b6ce46_r.jpg&&&/figure&&/p&&p&&i&我们希望使用这些训练数据来预测其他房屋的价格。&/i&&/p&&p&这就是&b&监督式学习&/b&。你已经知道了每一栋房屋的售价,换句话说,你已经知道了问题的答案,并且可以反向找出解题的逻辑。&/p&&p&为了编写你的软件,你将包含每一套房产的训练数据输入到你的机器学习算法当中去。算法会尝试找出需要做哪些数学运算来得出价格。&/p&&p&这就好像是你已经知道了数学测试题的答案,但是算式中的运算符号都被擦去了:&figure&&img src=&https://pic2.zhimg.com/v2-8cb3399d9_b.jpg& data-rawwidth=&800& data-rawheight=&388& class=&origin_image zh-lightbox-thumb& width=&800& data-original=&https://pic2.zhimg.com/v2-8cb3399d9_r.jpg&&&/figure&&/p&&p&&i&天啊!一个阴险的学生擦去了参考答案上的算术符号!&/i&&/p&&p&你能从这张图里看出来测验中的数学题是怎样的吗?你知道自己应该对左边的数字「做些什么」,才能得到右边的答案。&/p&&p&在监督式学习中,你让计算机为你算出这种关系。而一旦你知道了解决这类特定问题所需要的数学方法后,你就可以解答其它同类问题了!&/p&&p&&b&非监督式学习&/b&&/p&&p&让我们回到房地产经纪人的例子。如果你不知道每栋房子的售价怎么办?即使你所知道的仅仅是每栋房屋的大小、位置等信息,你也可以搞出一些很酷炫的花样来。这就是我们所说的&b&非监督式学习&/b&。&figure&&img src=&https://pic1.zhimg.com/v2-4e769fb74e53a2f44b770_b.jpg& data-rawwidth=&616& data-rawheight=&432& class=&origin_image zh-lightbox-thumb& width=&616& data-original=&https://pic1.zhimg.com/v2-4e769fb74e53a2f44b770_r.jpg&&&/figure&&/p&&p&&i&即使你并不是在尝试预测未知的数据(如价格),你也可以运用机器学习做一些有意思的事。&/i&&/p&&p&这就有点像有人给你一张纸,上面写了一列数字,然后说:「我不太清楚这些数字有什么意义,但也许你能找出些规律或是把它们分类什么的——祝你好运!」&/p&&p&所以该怎么处理这些数据呢?首先,你可以用个算法自动从数据中划分出不同的细分市场。也许你会发现,当地大学附近的购房者特喜欢户型小、卧室多的房子,而郊区的购房者偏好三卧室的大户型。了解这些不同消费者的喜好可以直接帮助你的营销。&/p&&p&你还可以做件很酷炫的事,就是自动找出非同寻常的房屋。这些与众不同的房产也许是奢华的豪宅,而你可以将最优秀的销售人员集中在这些地区,因为他们的佣金更高。&/p&&p&在接下来的内容中我们主要讨论监督式学习,但这并不是因为非监督式学习比较没用或是无趣。实际上,随着算法的改良,非监督式学习正变得越来越重要,因为即使不将数据和正确答案联系在一起,它也可以被使用。[2]&/p&&p&&b&太酷炫了,但是估算房价真能被看作「学习」吗?&/b&&/p&&p&作为人类的一员,你的大脑可以应付绝大多数情况,并且在没有任何明确指令时也能够学习如何处理这些情况。如果你做房地产经纪人时间足够长,你对于房产的合适定价、房屋的最佳营销方式以及客户会感兴趣类型等等都会有一种本能般的「感觉」。&a href=&http://link.zhihu.com/?target=http%3A//en.wikipedia.org/wiki/Strong_AI& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&强人工智能&/a&研究的目标就是要计算机复制这种能力。&/p&&p&但是目前的机器学习算法还没有那么强大——它们只能在非常特定的、有限的问题上有效。也许在这种情况下,「学习」更贴切的定义是「在少量样本数据的基础上找出一个公式来解决特定的问题」。&/p&&p&但是「机器在少量样本数据的基础上找出一个公式来解决特定的问题」不是个好名字。所以最后我们用「机器学习」取而代之。&/p&&p&当然了,如果你是在 50 年后的未来读的这篇文章,而我们人类也已经得出了强人工智能的算法的话,那这篇文章看起来就像个老古董了。那样的话,就别读了,去让你的机器佣人给你做份三明治吧,未来的人类。&/p&&p&&b&让我们愉快地写代码吧!&/b&&/p&&p&所以,你打算怎么写上面例子中评估房价的程序呢?在往下看之前先思考一下吧。&/p&&p&如果对机器学习一无所知,你很有可能会尝试写出一些基本规则来评估房价,如下:&/p&&div class=&highlight&&&pre&&code class=&language-python&&&span&&/span&&span class=&k&&def&/span&
&span class=&nf&&estimate_house_sales_price&/span&&span class=&p&&(&/span&&span class=&n&&num_of_bedrooms&/span&&span class=&p&&,&/span& &span class=&n&&sqft&/span&&span class=&p&&,&/span& &span class=&n&&neighborhood&/span&&span class=&p&&):&/span&
&span class=&n&&price&/span& &span class=&o&&=&/span& &span class=&mi&&0&/span&
&span class=&c1&&# 在我这地方,每平方英尺房屋均价是 200 美元&/span&
&span class=&n&&price_per_sqft&/span& &span class=&o&&=&/span& &span class=&mi&&200&/span&
&span class=&k&&if&/span&
&span class=&n&&neighborhood&/span& &span class=&o&&==&/span& &span class=&s2&&&hipsterton&&/span&&span class=&p&&:&/span&
&span class=&c1&&#&/span&
&span class=&err&&但是有些地段房价会贵一点&/span&
&span class=&n&&price_per_sqft&/span& &span class=&o&&=&/span& &span class=&mi&&400&/span&
&span class=&k&&elif&/span& &span class=&n&&neighborhood&/span& &span class=&o&&==&/span& &span class=&s2&&&skid row&&/span&&span class=&p&&:&/span&
&span class=&c1&&#&/span&
&span class=&err&&有些地段房价便宜点&/span&
&span class=&n&&price_per_sqft&/span& &span class=&o&&=&/span& &span class=&mi&&100&/span&
&span class=&c1&&# 我们先按面积大小估计房屋价格基准&/span&
&span class=&n&&price&/span& &span class=&o&&=&/span& &span class=&n&&price_per_sqft&/span& &span class=&o&&*&/span& &span class=&n&&sqft&/span&
&span class=&c1&&# 现在根据卧室数量微调价格&/span&
&span class=&k&&if&/span&
&span class=&n&&num_of_bedrooms&/span& &span class=&o&&==&/span& &span class=&mi&&0&/span&&span class=&p&&:&/span&
&span class=&c1&&#&/span&
&span class=&err&&工作室类型的公寓比较便宜&/span&
&span class=&n&&price&/span& &span class=&o&&=&/span& &span class=&n&&price&/span&&span class=&err&& — &/span&&span class=&mi&&20000&/span&
&span class=&k&&else&/span&&span class=&p&&:&/span&
&span class=&c1&&#&/span&
&span class=&err&&卧室数量越多,通常房价越贵&/span&
&span class=&n&&price&/span&
&span class=&o&&=&/span& &span class=&n&&price&/span& &span class=&o&&+&/span& &span class=&p&&(&/span&&span class=&n&&num_of_bedrooms&/span& &span class=&o&&*&/span& &span class=&mi&&1000&/span&&span class=&p&&)&/span&
&span class=&k&&return&/span& &span class=&n&&price&/span&
&/code&&/pre&&/div&&p&假如你像这样瞎忙几个小时,最后也许会得到一些像模像样的东西。但是你的程序永不会完美,而且当价格变化时很难维护。&/p&&p&如果能让计算机找出实现上述函数功能的办法,岂不更好?只要返回的房价数字正确,谁会在乎函数具体干了些什么呢?&/p&&div class=&highlight&&&pre&&code class=&language-python&&&span&&/span&&span class=&k&&def&/span&
&span class=&nf&&estimate_house_sales_price&/span&&span class=&p&&(&/span&&span class=&n&&num_of_bedrooms&/span&&span class=&p&&,&/span& &span class=&n&&sqft&/span&&span class=&p&&,&/span& &span class=&n&&neighborhood&/span&&span class=&p&&):&/span&
&span class=&n&&price&/span& &span class=&o&&=&/span& &span class=&o&&&&/span&&span class=&err&&计算机,请帮我算点数学题&/span&&span class=&o&&&&/span&
&span class=&k&&return&/span& &span class=&n&&price&/span&
&/code&&/pre&&/div&&p&考虑这个问题的一种角度是将&b&价格&/b&看作一碗美味的汤,而汤的原材料就是&b&卧室数量、面积和地段&/b&。如果你能算出每种原材料对最终的价格有多大影响,也许就能得到各种原材料混合形成最终价格的具体比例。&/p&&p&这样可以将你最初的程序(全是令人抓狂的 if else 语句)简化成类似如下的样子:&/p&&div class=&highlight&&&pre&&code class=&language-python&&&span&&/span&&span class=&k&&def&/span&
&span class=&nf&&estimate_house_sales_price&/span&&span class=&p&&(&/span&&span class=&n&&num_of_bedrooms&/span&&span class=&p&&,&/span& &span class=&n&&sqft&/span&&span class=&p&&,&/span& &span class=&n&&neighborhood&/span&&span class=&p&&):&/span&
&span class=&n&&price&/span& &span class=&o&&=&/span& &span class=&mi&&0&/span&
&span class=&c1&&# 一小撮这个&/span&
&span class=&n&&price&/span& &span class=&o&&+=&/span& &span class=&n&&num_of_bedrooms&/span& &span class=&o&&*&/span& &span class=&o&&.&/span&&span class=&mi&&213&/span&
&span class=&c1&&# 一大撮那个&/span&
&span class=&n&&price&/span& &span class=&o&&+=&/span& &span class=&n&&sqft&/span& &span class=&o&&*&/span& &span class=&mf&&&/span&
&span class=&c1&&# 或许再加一把这个&/span&
&span class=&n&&price&/span& &span class=&o&&+=&/span& &span class=&n&&neighborhood&/span& &span class=&o&&*&/span& &span class=&mf&&2.&/span&
&span class=&c1&&# 最后,再多加一点点盐&/span&
&span class=&n&&price&/span& &span class=&o&&+=&/span& &span class=&mf&&201.&/span&
&span class=&k&&return&/span& &span class=&n&&price&/span&
&/code&&/pre&&/div&&p&注意那些用粗体标注的神奇数字——&b&.213, , 2., 和201.&/b&。它们称为&b&权重(weight)&/b&。如果我们能找出对每栋房子都适用的完美权重,我们的函数就能预测所有的房价![3]&/p&&p&一种找出最佳权重的笨办法如下所示:&/p&&p&&b&第一步:&/b&&/p&&p&首先,将每个权重都设为 1.0:&/p&&div class=&highlight&&&pre&&code class=&language-python&&&span&&/span&&span class=&k&&def&/span&
&span class=&nf&&estimate_house_sales_price&/span&&span class=&p&&(&/span&&span class=&n&&num_of_bedrooms&/span&&span class=&p&&,&/span& &span class=&n&&sqft&/span&&span class=&p&&,&/span& &span class=&n&&neighborhood&/span&&span class=&p&&):&/span&
&span class=&n&&price&/span& &span class=&o&&=&/span& &span class=&mi&&0&/span&
&span class=&c1&&# 一小撮这个&/span&
&span class=&n&&price&/span& &span class=&o&&+=&/span& &span class=&n&&num_of_bedrooms&/span& &span class=&o&&*&/span& &span class=&mf&&1.0&/span&
&span class=&c1&&# 一大撮那个&/span&
&span class=&n&&price&/span& &span class=&o&&+=&/span& &span class=&n&&sqft&/span& &span class=&o&&*&/span& &span class=&mf&&1.0&/span&
&span class=&c1&&# 或许再加一把这个&/span&
&span class=&n&&price&/span& &span class=&o&&+=&/span& &span class=&n&&neighborhood&/span& &span class=&o&&*&/span& &span class=&mf&&1.0&/span&
&span class=&c1&&# 最后,再多加一点点盐&/span&
&span class=&n&&price&/span& &span class=&o&&+=&/span& &span class=&mf&&1.0&/span&
&span class=&k&&return&/span& &span class=&n&&price&/span&
&/code&&/pre&&/div&&p&&b&第二步:&/b&&/p&&p&将你知道的每栋房产的数据代入函数进行运算,检验估算值与正确价格的偏离程度:&figure&&img src=&https://pic2.zhimg.com/v2-cadddea5db9a07bbef1f9_b.jpg& data-rawwidth=&800& data-rawheight=&346& class=&origin_image zh-lightbox-thumb& width=&800& data-original=&https://pic2.zhimg.com/v2-cadddea5db9a07bbef1f9_r.jpg&&&/figure&&/p&&p&&i&用你的程序来预测每栋房屋的价格。&/i&&/p&&p&比如说,如果第一套房产实际成交价为 25 万美元,你的函数估价为 17.8 万美元,这一套房产你就差了 7.2 万。&/p&&p&现在,将你的数据集中的每套房产估价偏离值平方后求和。假设你的数据集中交易了 500 套房产,估价偏离值平方求和总计为 86,123,373 美元。这个数字就是你的函数现在的「错误」程度。&/p&&p&现在,将总和除以 500,得到每套房产的估价偏差的平均值。将这个平均误差值称为你函数的&b&代价(cost)&/b&。&/p&&p&如果你能通过调整权重,使得这个代价变为 0,你的函数就完美了。它意味着,根据输入的数据,你的程序对每一笔房产交易的估价都是分毫不差。所以这就是我们的目标——&b&通过尝试不同的权重值,使代价尽可能的低。&/b&&/p&&p&&b&第三步:&/b&&/p&&p&通过尝试&b&所有可能的权重值组合&/b&,不断重复第二步。哪一个权重组合的代价最接近于 0,你就使用哪个。当你找到了合适的权重值,你就解决了问题!&/p&&p&&b&兴奋的时刻到了!&/b&&/p&&p&挺简单的,对吧?想一想刚才你做了些什么。你拿到了一些数据,将它们输入至三个泛型的、简单的步骤中,最后你得到了一个可以对你所在区域任何房屋进行估价的函数。房价网站们,你们要小心了!&/p&&p&但是下面的一些事实可能会让你更兴奋:&/p&&p&1.
过去 40 年来,很多领域(如语言学、翻译学)的研究表明,这种「搅拌数字汤」(我编的词)的泛型学习算法已经超过了那些真人尝试明确规则的方法。机器学习的「笨」办法终于打败了人类专家。&/p&&p&2.
你最后写出的程序是很笨的,它甚至不知道什么是「面积」和「卧室数量」。它知道的只是搅拌,改变数字来得到正确的答案。&/p&&p&3.
你可能会对「&b&为何&/b&一组特殊的权重值会有效」一无所知。你只是写出了一个你实际上并不理解却能证明有效的函数。&/p&&p&4.
试想,如果你的预测函数输入的参数不是「面积」和「卧室数量」,而是一列数字,每个数字代表了你车顶安装的摄像头捕捉的画面中的一个像素。然后,假设预测的输出不是「价格」而是「方向盘转动角度」,&b&这样你就得到了一个程序可以自动操纵你的汽车了!&/b&&/p&&p&太疯狂了,对吧?[4]&/p&&p&&b&第三步里「尝试每个数字」是怎么一回事?&/b&&/p&&p&好吧,当然你不可能试遍所有权重组合来找到效果最好的组合。直到世界毁灭你也算不完,因为这数字和组合无穷无尽。&/p&&p&为了避免这种情况,数学家们找到了很多种&a href=&http://link.zhihu.com/?target=http%3A//en.wikipedia.org/wiki/Gradient_descent& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&聪明的办法&/a&来快速找到优秀的权重值。下面是一种:&/p&&p&首先,写出一个简单的等式表示上面的第二步:&figure&&img src=&https://pic2.zhimg.com/v2-b2e83b1fc1b4e9daea025_b.png& data-rawwidth=&955& data-rawheight=&313& class=&origin_image zh-lightbox-thumb& width=&955& data-original=&https://pic2.zhimg.com/v2-b2e83b1fc1b4e9daea025_r.jpg&&&/figure&&/p&&p&&i&这就是你的&b&代价函数(Cost Function)。&/b&&/i&&/p&&p&现在让我们,使用机器学习数学术语(现在暂时你可以忽略它们),重新改写同样的这一等式:&figure&&img src=&https://pic3.zhimg.com/v2-4b8a2ffc4e94a3dfd97bfdfa_b.png& data-rawwidth=&1374& data-rawheight=&344& class=&origin_image zh-lightbox-thumb& width=&1374& data-original=&https://pic3.zhimg.com/v2-4b8a2ffc4e94a3dfd97bfdfa_r.jpg&&&/figure&&/p&&p&&i& θ 表示当前的权重值。 J(θ) 表示「当前权重的代价」。&/i&&/p&&p&这个等式表示,在当前权重值下,我们估价程序的偏离程度。&/p&&p&如果我们为这个等式中所有卧室数和面积的可能权重值作图的话,我们会得到类似下图的图表:&figure&&img src=&https://pic1.zhimg.com/v2-d1bc23e6d9aad642eb4e0c_b.png& data-rawwidth=&1600& data-rawheight=&1114& class=&origin_image zh-lightbox-thumb& width=&1600& data-original=&https://pic1.zhimg.com/v2-d1bc23e6d9aad642eb4e0c_r.jpg&&&/figure&&/p&&p&&i&我们代价函数的图形就像一个碗。纵轴表示代价。&/i&&/p&&p&图中,蓝色的最低点就是代价最低的地方——在这里我们的程序偏离最小。最高点们意味着偏离最大。所以,如果我们能找到一组权重值让我们到达图中的最低点,我们就得到了答案!&figure&&img src=&https://pic4.zhimg.com/v2-82980fdcbcdda6c279a967e630e21053_b.png& data-rawwidth=&1432& data-rawheight=&946& class=&origin_image zh-lightbox-thumb& width=&1432& data-original=&https://pic4.zhimg.com/v2-82980fdcbcdda6c279a967e630e21053_r.jpg&&&/figure&&/p&&p&因此,我们需要做的只是调整我们的权重,使得我们在图上朝着最低点「走下坡路」。如果我们不断微调权重,一直向最低点移动,那么我们最终不用尝试太多权重就可以到达那里。&/p&&p&如果你还记得一点微积分的话,你也许记得如果你对一个函数求导,它会告诉你函数任意一点切线的斜率。换句话说,对于图上任意给定的一点,求导能告诉我们哪条是下坡路。我们可以利用这个知识不断走向最低点。[5]&/p&&p&所以,如果我们对代价函数关于每一个权重求偏导,那么我们就可以从每一个权重中减去该值。这样可以让我们更加接近山底。一直这样做,最终我们将到达底部,得到权重的最优值。(读不懂?不用担心,继续往下读)。&/p&&p&这种为函数找出最佳权重的方法叫做&b&批量梯度下降(Batch Gradient Descent)&/b&。如果你对细节感兴趣,不要害怕,可以看看这个&a href=&http://link.zhihu.com/?target=https%3A//hbfs.wordpress.com//introduction-to-gradient-descent/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&详细说明&/a&。&/p&&p&当你使用一个机器学习算法库来解决实际问题时,这些都已经为你准备好了。但清楚背后的原理依然是有用的。&/p&&p&&b&还有什么是本篇文章略过的内容?&/b&&/p&&p&上面我描述的三步算法被称为&b&多元线性回归(multivariate linear regression)&/b&。你在估算一个能够拟合所有房价数据点的直线表达式。然后,你再根据房子可能在你的直线上出现的位置,利用这个等式来估算你从未见过的房屋的价格。这是一个十分强大的想法,你可以用它来解决「实际」问题。&/p&&p&但是,尽管我展示给你的这种方法可能在简单的情况下有效,它却不能应用于所有情况。原因之一,就是因为房价不会是简简单单一条连续的直线。&/p&&p&不过幸运的是,有很多办法来处理这种情况。有许多机器学习算法可以处理非线性数据(如&a href=&http://link.zhihu.com/?target=http%3A//en.wikipedia.org/wiki/Artificial_neural_network& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&神经网络&/a&或带&a href=&http://link.zhihu.com/?target=https%3A//en.wikipedia.org/wiki/Kernel_method& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&核函数&/a&的&a href=&http://link.zhihu.com/?target=https%3A//en.wikipedia.org/wiki/Support_vector_machine& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&支持向量机&/a&)。除此之外,灵活使用线性回归也能拟合更复杂的线条。在所有的情况下,寻找最优权重这一基本思路依然适用。&/p&&p&另外,我忽略了&b&过拟合(overfitting)&/b&的概念。得到一组能完美预测原始数据集中房价的权重组很简单,但用这组权重组来预测原始数据集之外的任何新房屋其实都不怎么准确。这也是有许多解决办法的(如&a href=&http://link.zhihu.com/?target=http%3A//en.wikipedia.org/wiki/Regularization_%2528mathematics%2529%23Regularization_in_statistics_and_machine_learning& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&正则化&/a&以及使用&a href=&http://link.zhihu.com/?target=http%3A//en.wikipedia.org/wiki/Cross-validation_%2528statistics%2529& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&交叉验证&/a&的数据集)。学习如何应对这一问题,是学习如何成功应用机器学习技术的重点之一。&/p&&p&换言之,尽管基本概念非常简单,要通过机器学习得到有用的结果还是需要一些技巧和经验的。但是,这是每个开发者都能学会的技巧。&/p&&p&&b&机器学习是黑魔法吗?&/b&&/p&&p&一旦你开始明白,用机器学习技术解决那些看似困难问题(如字迹识别)有多便利时,你就会有一种,只要有足够的数据,你就能够用机器学习解决任何问题的感觉。只需要输入数据,计算机就能神奇地找出拟合数据的等式!&/p&&p&但是有一点很重要,你要记住,只有在你拥有的数据对于解决实际问题有效的时候,机器学习才能适用。&/p&&p&例如,如果你建立了一个根据每套房屋内盆栽种类的数量来预测房价的模型,那它永远都不会有效果。因为盆栽种类的数量和房价之间没有任何的关系。所以,无论你多卖力地尝试,计算机永远也推导不出两者之间的关系。&figure&&img src=&https://pic1.zhimg.com/v2-55cdb5bb8_b.jpg& data-rawwidth=&1010& data-rawheight=&322& class=&origin_image zh-lightbox-thumb& width=&1010& data-original=&https://pic1.zhimg.com/v2-55cdb5bb8_r.jpg&&&/figure&&/p&&p&&i&你只能模拟实际存在的关系。&/i&&/p&&p&所以请记住,如果一个问题人类专家不能手动用数据解决,计算机可能也不能解决。然而,对于那些人类能够解决的问题,如果计算机能够更快地解决,那岂不美哉?&/p&&p&&b&怎样学到更多机器学习的知识&/b&&/p&&p&我认为,目前机器学习的最大问题是它主要活跃于学术界和商业研究组织中。对于只想大体了解一下,而不打算成为专家的人们来说,简单易懂的资料不多。但是这种情况每天正在改善。&/p&&p&吴恩达教授(Andrew Ng)在 &a href=&http://link.zhihu.com/?target=https%3A//www.coursera.org/course/ml& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Coursera 上的免费机器学习课程&/a&非常棒。我强烈建议从此入手。对于任何拥有计算机或科学学位的人,或是还能记住一点点数学的人来说,都应该非常容易入门。&/p&&p&另外,你还可以通过下载安装 &a href=&http://link.zhihu.com/?target=http%3A//scikit-learn.org/stable/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&SciKit-Learn&/a&,用它来试验无数个机器学习算法。它是一个 Python 框架,包含了所有常见机器学习算法的「黑盒」版本。&/p&&p&&i&注:&/i&&/p&&p&&i&1.
译者注:泛型,即没有特定类型,泛型算法是一种对很多不同问题都适用的算法,也叫作通用算法。如果你现在还对这个概念一知半解没关系,相信你读过这篇文章之后会对「泛型算法」有一个更深入的理解。&/i&&/p&&p&&i&2.
作者注:还有很多&a href=&http://link.zhihu.com/?target=https%3A//en.wikipedia.org/wiki/Machine_learning%23Algorithm_types& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&其它种类&/a&的机器学习算法。但从这里开始讲起是一个不错的选择。&/i&&/p&&p&&i&3.
译者注:权重可能有很多种不同的组合,每一种权重最后给出的房价预测也不同,我们的目标就是要找出一组最终价格最接近真实值的权重。&/i&&/p&&p&&i&4.
译者注:到这里,你应该对泛型算法有一个更深刻的理解了。&/i&&/p&&p&&i&5.
译者注:如果你还记得微积分当中,一个点求出的导数是 0的话,那么这个点就是最低点。所以返回到刚刚的代价函数里面,代价函数就等于 0,也就意味着,你的预估和真实值没有任何差别。&/i&&/p&
作者:Adam Geitgey 原文:翻译:巡洋舰科技——赵95校对:离线Offline——林沁转载请联系译者。你是否曾经听到过人们谈论机器学习,而你却对其含义只有一个模糊的概念呢?你是否已经厌倦了在和同事对话时只能点头呢?现在,让我们一起…
作为一个文科妹子,我在看过几乎所有热门 github 教程之后依旧一头雾水,在近半年的摸索中终于明白啦~新年初,把自己纯小白的学习经验分享一下吧!&br&&br&&b&#什么是 Github ?&br&&/b&必须要放这张图了!!!&br&&figure&&img src=&https://pic4.zhimg.com/7c9d63fb_b.png& data-rawwidth=&600& data-rawheight=&412& class=&origin_image zh-lightbox-thumb& width=&600& data-original=&https://pic4.zhimg.com/7c9d63fb_r.png&&&/figure&(图片来源&a href=&https://www.zhihu.com/question//answer/& class=&internal&&GitHub 是怎样的一个存在? - Deep Reader 的回答&/a&)&br&&blockquote&&p&Git 是由 Linux 之父 Linus Tovalds 为了更好地管理linux内核开发而创立的分布式版本控制/软件配置管理软件。&/p&&/blockquote&好吧,我相信看到这里你已经晕了,这也是我一开始看那些所谓经典教程的感受。写这些教程的人都是几年以上的程序员呀,他们往往直接就告诉你所有命令的含义或者整个体系。&br&&blockquote&专家盲点(expert blind spot)就是对一个事物知道的越多,就越发不记得“不知道这个事”的情形。&/blockquote&&br&&b&简单来说,Git 是一个管理你的「代码的历史记录」的工具。&br&&/b&&figure&&img src=&https://pic1.zhimg.com/cd910ad32ac_b.jpg& data-rawwidth=&214& data-rawheight=&164& class=&content_image& width=&214&&&/figure&我不是程序员为什么要学这个啊啊啊!又不要管理代码们!&br&&br&别急,虽然 github 学习门槛高,一会你就知道为什么人人都应该会这个啦!&br&&br&----------------------------&br&&b&学习步骤&/b&&br&&br&##注册安装&br&去官网注册一个账号(这个你应该会,恩就不放链接了)&br&然后,下载一个&a href=&//link.zhihu.com/?target=https%3A//desktop.github.com/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&GitHub Desktop&/a& mac客户端是最方便的啦!(命令行什么的真的是会越来越晕!先别管他们!)&br&&br&假设33(珊姗就是我啦)、小四和你三个人一起写一本小说(澄清一下,并没有黑任何人的意思,恩!),暂且叫做...《梦里花落爱吃土时代》&br&--&br&图(脑补)&br&--&br&(⊙v⊙)嗯!终于可以正式开始了!&br&&br&&b&#step1:创建新项目&/b&&br&我们三个人在不同的城市要远程共同写一本书,要有一个漂亮的笔记本吧?&br&&figure&&img src=&https://pic3.zhimg.com/fa17ad198ae_b.png& data-rawwidth=&895& data-rawheight=&334& class=&origin_image zh-lightbox-thumb& width=&895& data-original=&https://pic3.zhimg.com/fa17ad198ae_r.png&&&/figure&&br&「repositories」就是你的笔记本们。你只需知道 Repository 是个放项目的地方就行。有时候会出现 Repositories,是多个 Repository 的意思。&br&&br&**fork**&br&如果你不想新建一个笔记本,看到小四之前写过一个好到炸裂的文章,想把他的直接全部偷过来,修改修改就成你自己的文章了,这应该怎么办呢?&br&github 还提供了一个很赞的功能叫做 fork ,你只需要点击这个神奇的按钮,就可以把他的「笔记本」变成你自己的啦!任意修改都可以哦~&br&&figure&&img src=&https://pic4.zhimg.com/ed6d6fdc68fbfa829997b_b.png& data-rawwidth=&808& data-rawheight=&201& class=&origin_image zh-lightbox-thumb& width=&808& data-original=&https://pic4.zhimg.com/ed6d6fdc68fbfa829997b_r.png&&&/figure&&br&&br&&b&#step2:把「笔记本」克隆到本地&/b&&br&「笔记本」在云端,你要把它摘下来放到自己的电脑上写小说才方便呀,在这里我们叫「clone」是不是很形象?步骤如图:&br&&figure&&img src=&https://pic4.zhimg.com/b5d537f10af3_b.png& data-rawwidth=&838& data-rawheight=&309& class=&origin_image zh-lightbox-thumb& width=&838& data-original=&https://pic4.zhimg.com/b5d537f10af3_r.png&&&/figure&或者是直接去我们的客户端&br&&figure&&img src=&https://pic3.zhimg.com/cde6dbb8be6_b.png& data-rawwidth=&1112& data-rawheight=&773& class=&origin_image zh-lightbox-thumb& width=&1112& data-original=&https://pic3.zhimg.com/cde6dbb8be6_r.png&&&/figure&&br&&b&#step3:可以开始写作啦!&/b&&br&你的笔记本里已经自动有一个文档了,这个时候让我们回到网页版[微笑脸]&br&你只需要在 web 端点开这个README.md可以开始在里面写你的小说了。&br&&figure&&img src=&https://pic4.zhimg.com/5cff90f3bd0cd5e400bcc637_b.png& data-rawwidth=&1024& data-rawheight=&335& class=&origin_image zh-lightbox-thumb& width=&1024& data-original=&https://pic4.zhimg.com/5cff90f3bd0cd5e400bcc637_r.png&&&/figure&或者直接点开刚刚 clone 到电脑上的文件夹直接在里面写。&br&ps:需要注意的是,文本支持 markdown 格式,可以先参考这个&a href=&//link.zhihu.com/?target=http%3A//www.jianshu.com/p/q81RER& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&献给写作者的 Markdown 新手指南&/a&。&br&&br&&b&#step4:上传你写的小说&/b&&br&在本地写完之后你要上传到云端让我和小四都能看见你写出什么幺蛾子了吧?&br&回到客户端,你发现有变化!!!&br&&figure&&img src=&https://pic4.zhimg.com/2e2d2a0da9ef8005ee01f_b.png& data-rawwidth=&517& data-rawheight=&542& class=&origin_image zh-lightbox-thumb& width=&517& data-original=&https://pic4.zhimg.com/2e2d2a0da9ef8005ee01f_r.png&&&/figure&没错,在你头像旁边给你这次提交内容起一个名字,以后如果再次寻找的时候会很方便。然后点下面的 Commit to master,还有右上角的 Sync 就好啦!&br&&br&&b&#step5:回退到之前的版本&/b&&br&夜深人静的时候,我趁着你们都在睡觉把小说的结局偷偷地改成女主死掉了!&br&你醒来觉得我这结局改的也太悲伤了,完全不能接受!结局必须要和之前那样王子公主幸福的生活在一起的 happy ending!&br&问题又来了,怎么退回到我修改结局之前的 happy ending?&br&&br&还是刚刚那个客户端,选择History 然后点击小齿轮,选择潇洒地点 roll back to this commit!&br&你又回到happy ending的状态啦!!&br&&figure&&img src=&https://pic4.zhimg.com/e2b413faf67ea77b36c93_b.png& data-rawwidth=&301& data-rawheight=&223& class=&content_image& width=&301&&&/figure&&br&&b&#step6:&/b&&br&小四写了一章华丽无比的番外,你要更新本地的小说和他写的保持一致怎么办?&br&git pull&br&&figure&&img src=&https://pic2.zhimg.com/f5c5c0b43d1f9f7ab27267fbcc16d9fd_b.png& data-rawwidth=&279& data-rawheight=&354& class=&content_image& width=&279&&&/figure&&br&-----------&br&好了,知道这些基本操作入门应该够了,我们来回顾一下(不要嫌弃我的画工啊喂!)&br&&figure&&img src=&https://pic4.zhimg.com/6c22d708defbc7df2240b_b.png& data-rawwidth=&800& data-rawheight=&600& class=&origin_image zh-lightbox-thumb& width=&800& data-original=&https://pic4.zhimg.com/6c22d708defbc7df2240b_r.png&&&/figure&&br&入门初期迅速得到一些正反馈对于学习一门新技能来说实在是太重要了!尤其是编程这么炫酷的事情!&br&所以先不要管什么复杂的 issue 呀 wiki 呀乱七八糟的操作,按照上面的一步一步来,如果遇到什么问题 google 之,一般都会解决的。&br&&br&有一个段子不就是说,当你遇到问题去找最高级的工程师,他们一般都会直接 google 吗?而且自带的帮助手册也是解决问题的好办法,比如你要新建一个 branch=》&a href=&//link.zhihu.com/?target=https%3A//github.com/Kunena/Kunena-Forum/wiki/Create-a-new-branch-with-git-and-manage-branches& class=& wrap exter

我要回帖

更多关于 php 跳转上一页 的文章

 

随机推荐