第一篇:一个IT菜鸟程序员的学习之路-机器学习
一个IT菜鸟程序员的学习之路—机器学习
今天我开通了博客,因为想学点技术的原因,以后不得不要经常来这里,也许前方的路不甚明了,但是既然选择了,我就会一直走下去,不管将来如何,我想在这里慢慢写下我这一路走来的经历,一为自勉;一为能够帮到别人。
现在是到了不得不学习点新东西的时候了。
这个时候还是来了,经历了10几年的学习生涯,到了终结的时候才感觉到自己什么都没有学到,也许这就是咱们国内大学生普遍经历的情况吧,都说大学是美好的,大学是绚烂和激情融合为恰到一体的那段年华。四年的大学时光,换来了今日艰难选择的到来,我感觉有点残酷,但是又总感觉无能为力,大的环境就是这样的,下面我在结合我自己的一些情况来说说我的一步步成长和蜕变。
四年苦逼的欢乐的大学生活(大家懂的),让我对计算机对网络对编程有了很大的了解。刚去的时候,相信很多人都是迷茫的选择了自己的专业,我也一样,因为是学计算机专业,就给爸妈说学这个的他们都买电脑,爸二话没说,用得着咱就买,就去电脑市场配了个台式机感觉配置还行吧,就这样不是用它学了四年的习,而是打了四年的游戏。但是我感觉从网上我天天看新闻,看资讯关于计算机方面的,慢慢的兴趣就养成了。感觉学习计算机真的不错,像马化腾,百度,新浪,搜狐,网易,盛大,,还有好多的国内有钱的大佬都是靠互联网发家的,幻想着,我要是哪天学好了,搞出来了个牛的软件,咱不也发了吗?不久就得知计算机搞编程不错,以后肯定有钱途,我就从那个时候开始在脑子力有了想做程序员的冲动。
本科学习,对我来说,只一件成功的事:就是选择了计算机学习,对编程产生了兴趣,这个我感觉对我作用最大。
毕业以后着了一份搞软件的工作,开始了每天睁眼闭眼都是代码的生活,随着日子一天天的过,渐渐有了压力,因为后来的同事多数都是硕士了,而且有了厌倦的感觉,心中隐隐开始想学点新鲜的东西,学什么好呢,很长时间都没有想明白。直到看到了很多人推崇的编程之美、数学之美,我开始琢磨着是不是要学学算法、机器学习、自然语言处理这些新东西。早先听朋友说过什么北京培乐园做机器学习的培训,好像还做搜索、推荐、海量数据处理的培训,开始我将信将疑,就去参加了他们的公开课,整体感觉还是不错的,映像最深刻的就是跟那个讲师之间的交流,让我坚定了学习机器学习,并在这个方向发展的信念。是时候该学点新东西了,我将慢慢养成习惯,在这期间把我的学习心得和体会慢慢的记录下来,学习是个长期的过程,我希望我能坚持下来不荒废,一个星期整理一篇,既是对这个星期学习的总结和反思,也是自己鼓励自己的一种方式吧。
今天我在这里写了这个文章,也算是我学习机器学习的开始吧,现在,我不再为学习哪种语言而犹豫不决了,因为我已经选择了机器学习这个方向,如今,我已不在迷茫,也不在觉得每天做同样的事情而枯燥,因为机器学习这种方法实在是其乐无穷,虽然问题远没有那么简单,但是我相信,我为自己寻找一个最好的出处,让我些许有了一些安慰和奔头,从此我一股脑的扎进machine learning之中。在此希望大家能够相互交流,共同成长。
第二篇:29.如何学习C语言-----程序员之路
作者:t5k5 日期:2007-10-24
一周没有写东西了,今天上校内的时候有个好友分享了这篇帖子,深有感触,以后坚决不用TC了,去下个VC++来学习C,哈哈~~还说我们用的教材太LJ了,这个我倒不怎么清楚,因为没学懂啊。。
看文章结尾的链接就知道是CSDN上的了,以下是原文:
=================T5K5的学习分割线=================
学习C语言不是一朝一夕的事情,但也不需要花费十年时间才能精通。如何以最小的代价学习并精通C语言是本文的主题。请注意,即使是“最小的代价”,也绝不是什么捷径,而是以最短的时间取得最多的收获,同时也意味着你需要经历艰苦的过程。
一、要读就读好书,否则不如不读
所有初学者面临的第一个问题便是:如何选择教材。好的开始是成功的一半,选择一本优秀的教材是事半功倍的关键因素。不幸的是,学校通常会帮你指定一本很差劲的C语言课本;而幸运的是,你还可以再次选择。
大名鼎鼎的谭浩强教授出了一本《C语言程序设计》,据说发行量有超过400万,据我所知,很多学校都会推荐这本书作为C语言课本。虽然本人的名字(谭浩宇)跟教授仅仅一字之差,但我是无比坚定地黑他这本书的。这本书不是写给计算机专业的学生的,而是给那些需要考计算机等级考试的其它专业学生看的。这本书的主要缺点是:例子程序非常不专业,不能教给你程序设计应该掌握的思考方式;程序风格相当地不好,会让你养成乱写代码的恶习;错误太多,曾经有人指出过这本书的上百个错误,其中不乏关键的概念性错误。好了,这本书我也不想说太多了,有兴趣大家可以百度一下:)
Kernighan和Ritchie的《The C Programming Language》(中译名《C程序设计语言》)堪称经典中的经典,不过旧版的很多内容都已过时,和现在的标准C语言相去甚远,大家一定要看最新的版本,否则不如不看。另外,即使是最经典最权威的书,也没有办法面面俱到,所以手边常备一本《C语言参考手册》是十分必要的。《C语言参考手册》就是《C Reference Manual》,是C语言标准的详细描述,包括绝大多数C标准库函数的细节,算得上是最好的标准C语言的工具书。顺便提一句,最新的《C程序设计语言》是根据C89标准修订的,而《C语言参考手册》描述的是C99标准,二者可能会有些出入,建议按照C99标准学习。还有一本《C和指针》,写得也是相当地不错,英文名是《Pointers on C》,特别地强调指针的重要性,算是本书的一个特点吧。不过这本书并不十分适合初学者,如果你曾经学过C语言,有那么一些C语言的基础但又不是很扎实,那么你可以尝试一下这本书。我相信,只要你理解了指针,C语言便不再神秘。
如果你已经啃完了一本C语言教材,想要更进一步,那么有两本书你一定要看。首先是《C Traps and Pitfalls》(中译名《C陷井与缺陷》),很薄的一本小册子,内容非常非常地有趣。要注意一点,这本书是二十多年前写成的,里面提到的很多C语言的缺陷都已被改进,不过能够了解一些历史也不是什么坏事。然后你可以挑战一下《Expert C Programming》(中译名《C专家编程》),书如其名,这本书颇具难度,一旦你仔细读完并能透彻理解,你便可以放心大胆地在简历上写“精通C语言”了。
切记一个原则,不要读自己目前还看不懂的书,那是浪费生命。如果你看不懂,那你一定是缺失了某些必需基础知识。此时,你要仔细分析自己需要补充哪些内容,然后再去书店寻找讲述的这些内容的书籍。把基础知识补充完毕再回头来学习,才会真正的事半功倍。
二、Unix/Linux还是Windows,这是个很大的问题
不同的编程环境会造就出不同思维的程序员。Windows的程序员大多依赖集成开发环境,比如Visual Studio,而Unix程序员更加钟爱Makefile与控制台。显而易见,集成开发环境更容易上手,在Windows上学习C语言,只需要会按几个基本的Visutal C++工具栏按钮就可以开始写Hello, World!了,而在Unix下,你需要一些控制台操作的基本知识。有人也许认为Unix的环境更简洁,但习惯的力量是很大的,大家都很熟悉Windows的基本操作,而为了学习C语言去专门装一个Unix系统,似乎有点不划算。
对于一个只懂得Windows基本操作、连DOS是什么都不知道的新手而言,尽快做一些有趣而有意义的事情才是最重要的。用C语言写一个小程序远比学习ls、cat等命令有趣,况且我们要专注于C语言本身,就不得不暂时忽略一些东西,比如编译链接的过程、Makefile的写法等等等等。
所以我建议初学者应该以Visual C++ 6.0(不是VisualC++.NET)或者Dev C++作为主要的学习环境,而且千万不要在IDE的使用技巧上过多纠缠,因为今后你一定要转向Unix环境的。Visual C++ 6.0使用很方便,调试也很直观,但其默认的编译器对C标准的支持并不好,而Dev C++使用gcc编译器,对C99的标准都支持良好。使用顺带提一下,很多大学的C语言课程还在使用Turbo C 2.0作为实验环境,这是相当不可取的,原因其一是TC 2.0对C标准几乎没有支持,其二是TC 2.0编译得到的程序是16位的,这对今后理解32位的程序会造成极大的困扰(当然,用djgpp之类的东西可以使TC 2.0编译出32位程序,不过那过于复杂了)。
等你学完一本C语言的教材,你一定要转向Unix平台继续学习,几乎所有的C语言高级教程都是基于Unix平台的(比如《C专家编程》)。转变的过程是痛苦的,你需要面对的是各种纷繁复杂的命令,完全不同于Windows平台的思考方式,但是这种痛苦是值得的。Unix与C是共生的,Unix的思考方式和习惯更加符合C语言的思考方式和习惯。在Unix下,你可以找到无数优秀的源代码供你尽情阅读,你可以方便地查看某个库函数的联机手册,还可以看到最优秀的代码风格(说到代码风格,我会专门写一篇文章详细叙述)。
归结起来就是一句话:初学C语言,建议使用Windows系统和集成开发环境,在准备向“高手”方向努力时,请先转向Unix平台。
三、万事俱备,你就是东风
书已选定,环境配置完成,正所谓万事俱备,只欠你自己的努力了。请从书的前言开始,仔细地阅读手头的教材,很多人看书喜欢直接从第一章开始看,这是错误的做法。前言是作者对整本书的大体介绍,作者一般会告诉你需要什么基础才能够顺利阅读本书,这可以帮助你检验自己的基础知识是否已经具备。看完前言,还要浏览一下目录,了解一下书的整体结构,顺便给自己安排一下学习计划。
学习C语言,必需注意每一个细节,书上的例子代码一定要自己亲自敲一遍,编译执行输出都跟书上说的一致才能算是学完了一个例子,如果不一致,就要仔细找原因。出了书本上有的例子,自己还要“创造”一些例子,比如学习运算符优先级的时候,可以写几个相同的表达式,在不同的位置加上括号,看看有哪些不同的行为,比如*p++和(*p)++,又比如a = b == c、(a = b)== c和a =(b == c)等等。自己抄的书上的例子以及改造之后的例子,还有自己“创造”的例子,都应该仔细地归类保存,并且要在源代码中写上简短的注释,阐述这个例子的意图。
例子之后就是习题了,我建议初学者把所有的习题都独立做一遍,然后对照答案的代码,看看自己的代码有那些不足,再试着修改自己的代码。很多人不重视习题,这是极大的错误,因为作者通常会在习题中说明一些重要的道理,而不是单纯地检验前面的知识。
也许你认为这样学习太慢,其实不然。学得细致就不用走回头路,等你学到后面才发现自己前面没搞清楚,那才是真的得不偿失。一般说来,整本书读完,你应该完成数千行乃至上万行的代码,无论是原封不动照抄书上的,还是自己心血来潮写就的,都是今后继续学习的一笔财富。以我自己举例,阅读《Windows核心编程》时(我只阅读了3/4的内容),除了抄书上的代码,还自己写了很多例子,一共有5574行(用unix下的wc工具统计),时隔多日,我早已记不清Windows的系统编程了,但只要花几分钟翻出以前的代码看看,便会重新了然于胸。所谓好记性不如烂笔头,就是这个道理。
仔细读书、认真抄写源代码、独立完成习题外加更进一步的实验,最后将所有的代码留下,成为自己的经验和财富,绝对的辛苦,也绝对的事半功倍。当然,这种方式只适合学习需要精通的技术,如果不是学习C语言,你还要具体情况具体分析。
写到最后,还有非常非常重要的一点没有提及──代码风格,从最开始学习就必须强迫自己模仿最优秀的代码风格。因为代码风格太重要内容也太多,我会用专门的一篇文章来详细讨论,请大家关注《程序员之路──关于代码风格》。
第三篇:-动力节点=java程序员菜鸟的成长之路
筑基阶段:
1.敲代码速度要快,要求手指灵活,尽量减少输入出错。这个是基本功,不然何以达到一定的代码量。
2.精通几个常用的代码编辑工具。(注意,这里说的是编辑工具,除了常用的eclipse,myeclipse,jBuilder等IDE工具外,还必须掌握文本编辑工具,如notepad++,vim)。
3.掌握Linux系统中常规命令。(这个是所有程序员都必须掌握的基本功)。
4.随时随地的做笔记。(这个就不解释了,反正善于总结经验不会错了,可以推荐使用有道笔记)。
5.学会一些主流的代码管理工具的使用。(如SVN,gitHub,maven等)
初级阶段:
动力节点
6.熟悉并精通某种编程语言的基础和特性。(java语言必须掌握corejava基础部分)
7.善于给自己写一些工具,拿来即用的那种。(如数据库连接,文件读写操作等等)
8.掌握web开发的常用技术。(如HTML,CSS,javascript,Ajax,JSP,jQuery)
9.掌握常用数据库的基本操作。(如oracle,mysql)
中级阶段
10.掌握一些主流开源框架,设计思想。(如,spring MVC,Struts2+hibernate+spring/SSH,EJB等)
11.掌握设计模式,学会使用一些开发模式。
12.掌握Linux中的shell编程
14.学会使用数据库的DDL,DML,以及存储过程。
15.熟悉项目的整个生命周期,从需求到上线中的各个阶段。
16.关注技术网站和社区,开拓思路,汲取他人的优序经验,同时分享自己经验。(如csdn ,oschina等)
17.熟悉整个项目周期的中的各类文档。
动力节点
18.定期给自己策划一个项目,练手。
高级阶段
19.关注科技,了解IT界动态,学会发现和创新。
20.开始学习项目管理相关知识,学会如何成为一个优秀的项目管理人。
21.适时给自己买一些书籍,给自己大脑及时充电。
22.经常参加一些培训讲座,开拓视野。
23.关注政策,了解时代互联网发展趋势,学习和创新。
动力节点
第四篇:程序员之路
程序员之路
“程序员”,提起这个名称便让我们的脑海中闪出一长串名字:一手开创现代软件业恐龙——Microsoft的比尔·盖茨;现在中华民族软件业之代表金山公司的掌门人——求伯君;微软的噩梦、自由软件的代表、Linux之父芬兰小伙Linus Torvalds……这些在IT业内被无数人津津乐道的名字,都是从一个小小的程序员开始做起的。随着他们的软件日益流行,他们的名字也逐渐为人人所推崇和尊敬。很多年轻人也以他们为榜样,梦想着做一名程序员,最后成为新一代的IT英雄。在这里,笔者作为一个职业程序员的角度,想和大家谈谈自己的感受。为什么要做一个程序员
谈到这个问题似乎会让人觉得太简单、太幼稚。看看现在程序员舒适的工作环境、丰厚的薪水、过着“快乐”的白领生活一切仿佛都不言自明。其实这是只看到了程序员的一面。我们的另一面则不为关注:没日没夜的工作,通宵加班是家常便饭;整天和键盘打交道,把自己的代码改来改去几十甚至上百遍,目的只是为了想抓住一个小小的Bug……这种枯燥的生活又有谁能切身体会?没有对软件事业本身的执著、对源代码近乎朝圣般的痴迷,这一切都是普通人不能忍受的。但是当你的程序完全通过了测试,成为一个合格的产品。这个时候的喜悦,又是如此强烈地激荡在你胸中。也只有真正热爱编程的人,才会感到其中真正的快乐。所以如果有人问你为什么要做一个程序员,那就告诉他你有足够的勇气面对每一次调试失败、有坚定耐心和信心来写好每一行代码。这是我的热爱,编程就是一种乐趣!
学编程是先学什么?
对于广大编程初学者来说,存在着这样普遍的认识:学习程序设计选择编程语言很重要,开口闭口就是Visual Basic、Visual C++、Delphi、Power Builder等一些现在一些比较流行的开发工具。经常看见有初学者问:我学C/C++,究竟是学Visual C++好呢,还是学Borland C++ Builder好呢?或者就是要求在Visual Basic和Delphi之间做出选择。学习程序设计和学习程序设计语言究竟是怎么一种关系呢?初学者究竟应该如何取舍呢?就此我们打个简单的比方:学习程序设计就好比学习射击,而程序设计语言就对应射击中的气枪、手枪、步枪等各种枪械。学习射击必须要选择一种枪械,不可能没有枪还能学好射击的,也不可能同时学会使用所有的枪械。但是,如果掌握一种枪械的射击,再学别的枪就触类旁通了。因为在熟悉一种枪械的同时,也学习了射击技术本身。再学其他的,自然事半功倍。学习程序设计也是一样,必然要从学习一门程序设计语言开始入手。同时在学习的过程中,不但要掌握这门语言语法本身,还要学会编程的思想,这是所有程序设计语言的基础。程序设计语言,是“一法通,万法皆通”的。
建议:学习程序设计不必苛求一定要从某一种语言入手,可以在Visual Basic、Delphi、Borland C++ Builder、DOS下的Pascal、Turbo C(或Borland C)等中间选择自己比较容易接受的一种进行学习。从中主要学习的是编程本身的思想,学习的是用程序设计的眼光来看待问题。或许,学习的效果不能马上看到,但是可以学到扎实的基本功,而这对于将来的进一步发展是有很大好处的。这些基本功包括:
一、强化逻辑分析和建立数学模型的能力 编程的目的是什么?是要解决现实中的问题。而现实中的问题是用自然语言描述
1 的,目前的计算机对之是无法理解。我们要做的就是必须用计算机能理解的方式将之“告诉”计算机。也就需要我们对现实问题进行逻辑分析,建立合适的数学模型,然后以程序和数据的形式输入计算机,让计算机帮我们来分析解决。一个简单的例子就是计算机对于颜色的处理办法:用R、G、B三色分量来各表示一种颜色,对于颜色的处理被转化为对R、G、B三个整数的处理。我们只要改变这三个整数,就可以改变成为另外一种颜色。对于其他的现实问题,我们也要象这样使之可以被计算机所“理解”。这是编程所要解决的第一步,否则就根本没有程可编。这是建立在“经验”上的,是要在学习过程中逐步积累的。
二、数据结构和算法知识
程序设计发展到现在,已经有了一套比较普遍、完整的数学模型(我们称之为数据结构)和对应这些数学模型的处理方法(也就是算法)。目前的程序就是以之为基础的。在程序员中间流传着一句经验之谈:“好的数据结构是程序的一半。”其重要性可见一斑。作为一个程序员,如果不知道数据结构中堆栈、队列、链表、树,不知道算法中的查找、排序、树的遍历、递归,这简直是不可想象的。我们所说的“编程的思想”也就是具体表现为这两点。所以,一般的数据结构和算法知识是学习程序设计过程中必须掌握的,这样在以后的程序开发过程中就可以觉得得心应手。
三、丰富的实践经验
程序设计本身就是一门实践性很强的学科。一个只存在于纸上的程序如同没有翅膀的鸟永远不能飞翔在现实的天空。任由代码写得再巧妙,风格再优美,也是一张纸上的一连串字符而已。就好比是一份作文练习,或许写得很好,但是不交给老师去批阅,和一张白纸又有什么区别呢?在这里,程序就是作文,而计算机就是老师。只有把“作文”交给“老师”,只有从通过调试的程序中才能印证自己的构想是否正确,或者看到有什么缺陷。当然也少不了要多和同行交流,尤其是随着互联网的普及,在网上我们也可以看到别人编写的例子和源程序,作为现代的程序员,这也是千万不可错过的好机会。
最后,作为一个程序员还有一点小要求:身体素质比较好,能熬夜才行。有规矩,成方圆
程序开发是一件灵活性很强的工作。例如:变量I增加1,在C语言里面可以有I++、++I、I+=
1、I=I+1等多种写法。但是,这并不说明编程就可以顺心所欲,天马行空。良好的编程习惯可以提高工作效率,减少不必要的失误。尤其是对于初学者来说更是要注意的:
第一点:编程的时候,首先要建立好的数据结构。在前面已指出“好的数据结构是程序的一半。”,这句经验之谈自然有其道理所在。编程序的时候,如果在开始的时候设计错数据结构,那么在后来不得不花大代价修改程序。笔者自己就曾有过这样的惨痛教训:一个程序写了2500多行,突然发现基本数据结构不合理,结果全部推翻重写。“磨刀不误砍柴工”绝对不是老生常谈。在开始写代码之前做好数据结构的研究和准备工作往往可以达到事半功倍的效果。
第二点:代码尽可能重用,尽量模块化。无论是面向过程还是面向对象,代码重用都是基本原则之一。例如:如果要画一个青苹果和一个红苹果,就写一个函数来画苹果,把颜色作为参数传进去。这样只要调用同一个函数传不同参数就可以实现画不同的苹果。这样做的好处一是程序比较容易理解,另外修改也方便,只要修改一个地方就可以让两个苹果都发生改变。这点在开发一些短小程序中还感觉不出,但是在以后开发大型程序的时候,工作的效率就明显提高不少。这就是
2 聪明人做聪明事,以最小的代价取得最大的收获。
第三点:良好的编写风格。一个程序,不可能是绝对完美,以后永不用修改的。既然要修改,就必然要重读和理解原来的代码。而良好的编程风格,可以使人更方便和迅速理解程序的结构,从而可以最大限度地提高修改的效率。在这里,笔者举出一些比较好编程的风格要求:1.统一有意义的命名规范:一个变量叫nCount明显比叫iii更容易被理解其真实逻辑含义和数据类型。所以不要怕麻烦,变量和函数名多起几个字母,有意义一点,将来理解起来比较方便。2.代码的逐层缩进格式。这几乎已经成为一种标准,这种格式使得代码之间的层次关系非常明显,对于程序的逻辑理解有很大的帮助。3.代码位置的有条理性。把相关功能的代码集中起来,放在一起,这样在以后阅读代码的时候,可以尽量避免在不同文件模块之间频繁切换。函数内部的逻辑不要太复杂,代码行数不要太长:由于要考虑到以后的理解,所以函数内部的逻辑不要写得很复杂,例如循环嵌套以三层为宜,代码行数以一屏左右为好,太长的代码不利于理解。如果循环的确多、代码的确长,就应该考虑重新再划分为更细的子函数。好的编程风格当然不止这些,这也需要在学习过程中慢慢体会。
第四点:注重程序测试,注意异常处理。这是业余编程爱好者和职业程序员的一个很明显的差别。业余编程爱好者往往只注重程序可以正常运行,而职业程序员除此之外还必须关注程序在异常情况下也必须正常运行,至少可以正常终止。而这是建立在对程序进行充分测试的基础上的。多用不同情况去测试自己的程序,可以发现更多的隐藏的Bug,从而提高自己程序的质量。
千里之行始于足下。做程序员也是这样,这世上不仅没有平坦大道,还有更多的曲折和困难。但是只要真心热爱软件开发,愿意为之而付出,最后胜利的金苹果必将使你体会到个中乐趣。来吧,还犹豫什么,踏上这条程序员之路,昂首向前走吧!
3
第五篇:机器学习报告
机器学习总结报告
刘皓冰
大部分人错误地以为机器学习是计算机像人一样去学习。事实上,计算机是死的,怎么可能像人类一样“学习”呢,机器学习依靠的是数学,更确切地说是靠统计。
如果我们让计算机工作,是给它一串指令,然后计算机会遵照这个指令一步步执行下去,有因有果,非常明确。但这种方式在机器学习中是行不通的。机器学习是不会接受你输入的指令的,它接受的是你输入的数据。也就是说,机器学习是一种让计算机利用数据而不是指令来进行各种工作的方法。这听起来非常不可思议,但结果上却是非常可行的。“统计”思想将在你学习“机器学习”相关理念时无时无刻不伴随,相关而不是因果的概念将是支撑机器学习能够工作的核心概念。
依据数据所做的判断跟机器学习的思想根本上是一致的。机器学习方法是计算机利用已有的数据(输入),得出了某种模型,并利用此模型预测未来(输出)的一种方法。从数据中学得模型的过程称为“学习”(learning)或“训练”(training),这个过程通过执行某个学习算法来完成。训练过程中使用的数据成为“训练数据”(training data),其中每个样本称为一个“训练样本”(training sample),训练样本组成的集合称为“训练集“(training set)。学得模型对应了关于数据的某种潜在的规律,因此亦称”假设“(hypothesis);这种潜在规律自身,则称为”真相“或”真实“(ground-truth),学习过程就是为了找出或逼近真相。模型有时也被称为”学习器“(learner),可看作学习算法在给定数据和参数空间上的实例化。
若欲预测的是离散值则此类学习任务被称为“分类”;若欲预测的是连续值则此类学习任务称为“回归”;对只涉及两个类别的“二分类”任务,通常称其中一个类为“正类”,另一个类为“反类”;涉及多个类别时,则称为“多分类”任务。
模型是否准确依赖与数据。如果我的数据越多,我的模型就越能够考虑到越多的情况,由此对于新情况的预测效果可能就越好。这是机器学习界“数据为王”思想的一个体现。一般来说(不是绝对),数据越多,最后机器学习生成的模型预测的效果越好。
机器学习里面有非常多的经典算法,每种算法都能形成一个模型。下面在简要介绍一下机器学习中的经典代表方法。重点介绍的是这些方法内涵的思想。
1、回归算法 在大部分机器学习课程中,回归算法都是介绍的第一个算法。原因有两个:一.回归算法比较简单,介绍它可以让人平滑地从统计学迁移到机器学习中。二.回归算法是后面若干强大算法的基石,如果不理解回归算法,无法学习那些强大的算法。回归算法有两个重要的子类:即线性回归和逻辑回归。
线性回归一般使用“最小二乘法”来求解。“最小二乘法”的思想是这样的,假设我们拟合出的直线代表数据的真实值,而观测到的数据代表拥有误差的值。为了尽可能减小误差的影响,需要求解一条直线使所有误差的平方和最小。最小二乘法将最优问题转化为求函数极值问题。函数极值在数学上我们一般会采用求导数为0的方法。但这种做法并不适合计算机,可能求解不出来,也可能计算量太大。计算机科学界专门有一个学科叫“数值计算”,专门用来提升计算机进行各类计算时的准确性和效率问题。例如,著名的“梯度下降”以及“牛顿法”就是数值计算中的经典算法,也非常适合来处理求解函数极值的问题。梯度下降法是解决回归模型中最简单且有效的方法之一。
逻辑回归是一种与线性回归非常类似的算法,但是,从本质上讲,线型回归处理的问题类型与逻辑回归不一致。线性回归处理的是数值问题,也就是最后预测出的结果是数字,例如预测一所房子大约可以买多少钱。而逻辑回归属于分类算法,也就是说,逻辑回归预测结果是离散的分类,例如判断肿瘤是恶性还是良性等等。实现方面的话,逻辑回归只是对对线性回归的计算结果加上了一个Sigmoid函数,将数值结果转化为了0到1之间的概率(Sigmoid函数的图像一般来说并不直观,你只需要理解对数值越大,函数越逼近1,数值越小,函数越逼近0),接着我们根据这个概率可以做预测,例如概率大于0.5,肿瘤就是恶性的等等。
2、神经网络
神经网络(也称之为人工神经网络,ANN)算法是80年代机器学习界非常流行的算法,不过在90年代中途衰落。现在,携着“深度学习”之势,神经网络重装归来,重新成为最强大的机器学习算法之一。
神经网络的诞生起源于对大脑工作机理的研究。早期生物界学者们使用神经网络来模拟大脑。机器学习的学者们使用神经网络进行机器学习的实验,发现在视觉与语音的识别上效果都相当好。在BP算法(加速神经网络训练过程的数值算法)诞生以后,神经网络的发展进入了一个热潮。
下图是一个简单的神经网络的逻辑架构。在这个网络中,分成输入层,隐藏层,和输出层。输入层负责接收信号,隐藏层负责对数据的分解与处理,最后的结果被整合到输出层。每层中的一个圆代表一个处理单元,可以认为是模拟了一个神经元,若干个处理单元组成了一个层,若干个层再组成了一个网络,也就是”神经网络”。
图神经网络的逻辑架构
在神经网络中,每个处理单元事实上就是一个逻辑回归模型,逻辑回归模型接收上层的输入,把模型的预测结果作为输出传输到下一个层次。通过这样的过程,神经网络可以完成非常复杂的非线性分类。
进入90年代,神经网络的发展进入了一个瓶颈期。其主要原因是尽管有BP算法的加速,神经网络的训练过程仍然很困难。因此90年代后期支持向量机(SVM)算法取代了神经网络的地位。
3、SVM(支持向量机)
支持向量机算法是诞生于统计学习界,同时在机器学习界大放光彩的经典算法。
支持向量机算法从某种意义上来说是逻辑回归算法的强化:通过给予逻辑回归算法更严格的优化条件,支持向量机算法可以获得比逻辑回归更好的分类界线。但是如果没有某类函数技术,则支持向量机算法最多算是一种更好的线性分类技术。
但是,通过跟高斯“核”的结合,支持向量机可以表达出非常复杂的分类界线,从而达成很好的的分类效果。“核”事实上就是一种特殊的函数,最典型的特征就是可以将低维的空间映射到高维的空间。
上述机器学习算法均为监督学习算法。监督学习,就是人们常说的分类回归,通过已有的训练样本(即已知数据以及其对应的输出)去训练得到一个最优模型(这个模型属于某个函数的集合,最优则表示在某个评价准则下是最佳的),再利用这个模型将所有的输入映射为相应的输出。在人对事物的认识中,我们从孩子开始就被大人们教授这是猫啊、那是狗啊、那是桌子啊,等等。我们所见到的景物就是输入数据,而大人们对这些景物的判断结果(是房子还是鸟啊)就是相应的输出。当我们见识多了以后,脑子里就慢慢地得到了一些泛化的模型,这就是训练得到的那个(或者那些)函数,从而不需要大人在旁边指点的时候,我们也能分辨的出来哪些是猫,哪些是狗。无监督学习则是另一种研究的比较多的学习方法,它与监督学习的不同之处,在于我们事先没有任何训练样本,而需要直接对数据进行建模。这听起来似乎有点不可思议,但是在我们自身认识世界的过程中很多处都用到了无监督学习。比如我们去参观一个画展,我们完全对艺术一无所知,但是欣赏完多幅作品之后,我们也能把它们分成不同的派别(比如哪些更朦胧一点,哪些更写实一些,即使我们不知道什么叫做朦胧派,什么叫做写实派,但是至少我们能把他们分为两个类)。无监督学习里典型的例子就是聚类了。聚类的目的在于把相似的东西聚在一起,而我们并不关心这一类是什么。因此,一个聚类算法通常只需要知道如何计算相似度就可以开始工作了。
那么,什么时候应该采用监督学习,什么时候应该采用非监督学习呢?一种非常简单的回答就是从定义入手,如果我们在分类的过程中有训练样本,则可以考虑用监督学习的方法;如果没有训练样本,则不可能用监督学习的方法。但是事实上,我们在针对一个现实问题进行解答的过程中,即使我们没有现成的训练样本,我们也能够凭借自己的双眼,从待分类的数据中人工标注一些样本,并把他们作为训练样本,这样的话就可以把条件改善,用监督学习的方法来做。然而对于不同的场景,正负样本的分布如果会存在偏移(可能是大的偏移,也可能偏移比较小),这样的话用监督学习的效果可能就不如用非监督学习了。
今天,在计算机科学的诸多分支学科领域中,都能找到机器学习技术的身影,尤其是在计算机视觉、语音识别、模式识别、自然语言处理等“计算机应用技术”领域,机器学习已成为最重要的技术进步源泉之一。此外,机器学习还为许多交叉学科提供了重要的技术支撑比如说“生物信息学”。
可以说“计算机视觉=图像处理+机器学习“。图像处理技术用于将图像处理为适合进入机器学习模型中的输入,机器学习则负责从图像中识别出相关的模式。计算机视觉相关的应用非常的多,例如百度识图、手写字符识别、车牌识别等等应用。这个领域是应用前景非常火热的,同时也是研究的热门方向。随着机器学习的新领域深度学习的发展,大大促进了计算机图像识别的效果,因此未来计算机视觉界的发展前景不可估量。
如果说“计算机视觉=图像处理+机器学习“,那么”语音识别=语音处理+机器学习“。语音识别就是音频处理技术与机器学习的结合。语音识别技术一般不会单独使用,一般会结合自然语言处理的相关技术。目前的相关应用有苹果语音助手siri、微软小娜等。
“自然语言处理=文本处理+机器学习“。自然语言处理技术主要是让机器理解人类的语言的一门领域。在自然语言处理技术中,大量使用了编译原理相关的技术,例如词法分析,语法分析等等,除此之外,在理解这个层面,则使用了语义理解,机器学习等技术。作为唯一由人类自身创造的符号,自然语言处理一直是机器学习界不断研究的方向。按照百度机器学习专家余凯的说法“听与看,说白了就是阿猫和阿狗都会的,而只有语言才是人类独有的”。如何利用机器学习技术进行自然语言的的深度理解,一直是工业和学术界关注的焦点。
谈到对数据进行分析利用,很多人会想到“数据挖掘”(data mining)。数据挖掘领域在二十世纪九十年代形成,它受到很多学科领域的影响,其中数据库、机器学习、统计学无疑影响最大。数据挖掘是从海量数据中发掘知识,这就必然涉及对“海量数据”的管理和分析。大体来说,“数据挖掘=机器学习+数据库“——数据库领域的研究为数据挖掘提供数据管理技术,而机器学习和统计学的研究为数据挖掘提供数据分析技术。由于统计学往往醉心于理论的优美而忽视实际的效用,因此,统计学界提供的很多技术通常都要在机器学习界进一步研究,变成有效的机器学习算法之后才能再进入数据挖掘领域。从这个意义上说,统计学主要是通过机器学习来对数据挖掘发挥影响,而机器学习和数据库则是数据挖掘的两大支撑技术。从数据分析的角度来看,绝大多数数据挖掘技术都来自机器学习领域,但机器学习研究往往并不把海量数据作为处理对象,因此,数据挖掘要对算法进行改造,使得算法性能和空间占用达到实用的地步。同时,数据挖掘还有自身独特的内容,即关联分析。
通过上面的介绍,可以看出机器学习是多么的重要,应用是多么的广泛。现随着大数据(big data)概念的兴起,机器学习大量的应用都与大数据高度耦合,几乎可以认为大数据是机器学习应用的最佳场景。例如经典的Google利用大数据预测了H1N1在美国某小镇的爆发、百度预测2014年世界杯结果从淘汰赛到决赛全部正确。这实在太神奇了,那么究竟是什么原因导致大数据具有这些魔力的呢?简单来说,就是机器学习技术。正是基于机器学习技术的应用,数据才能发挥其魔力。
大数据的核心是利用数据的价值,机器学习是利用数据价值的关键技术,对于大数据而言,机器学习是不可或缺的。相反,对于机器学习而言,越多的数据会越可能提升模型的精确性,同时,复杂的机器学习算法的计算时间也迫切需要分布式计算与内存计算这样的关键技术。因此,机器学习的兴盛也离不开大数据的帮助。大数据与机器学习两者是互相促进,相依相存的关系。
机器学习与大数据紧密联系。但是,必须清醒的认识到,大数据并不等同于机器学习,同理,机器学习也不等同于大数据。大数据中包含有分布式计算、内存数据库、多维分析等等多种技术。单从分析方法来看,大数据也包含以下四种分析方法:
1.大数据,小分析:即数据仓库领域的OLAP分析思路,也就是多维分析思想。2.大数据,大分析:这个代表的就是数据挖掘与机器学习分析法。3.流式分析:这个主要指的是事件驱动架构。4.查询分析:经典代表是NoSQL数据库。
也就是说,机器学习仅仅是大数据分析中的一种而已。尽管机器学习的一些结果具有很大的魔力,在某种场合下是大数据价值最好的说明。但这并不代表机器学习是大数据下的唯一的分析方法。