前言

Alpha Go在16年以4:1的战绩打败了李世石,17年又以3:0的战绩战胜了中国围棋天才柯洁,这真是科技界振奋人心的进步。伴随着媒体的大量宣传,此事变成了妇孺皆知的大事件。大家又开始激烈的讨论机器人什么时候会取代人类统治世界的问题。

其实人工智能在上世纪5、60年代就开始进入了理论研究阶段,人们在不断探索人工智能技术的同时,也担忧起机器人会不会替代人类。然而现实比理想残酷的多,由于当时各种条件的限制(理论基础、技术基础、数据基础、硬件性能等),人工智能相关的项目进度缓慢,也缺少实际成效,研发资金、社会关注度也越来越低,人工智能进入第一次低谷期。

到了80年代,卡内基梅隆大学为数字设备公司设计了一套名为XCON的“专家系统”。这是一种,采用人工智能程序的系统,可以简单的理解为“知识库+推理机”的组合,XCON是一套具有完整专业知识和经验的计算机智能系统。人工智能再一次被各国政府和科研机构看好,大量的资金投入到研发中,但是好景不长,几年后随着苹果和IBM公司研发出了性能强劲的PC机,导致“专家系统”变得没有竞争力,人工智能发展又一次进入寒冬。

随后若干年,人工智能的发展趋于平稳和低调。时间来到21世纪,随着互联网的普及,大量数据被积累下来;摩尔定律一次又一次的被证实,计算机硬件性能以极快的速度在增长;“云”的普及,让普通大众也能轻松拥有调度大量算力的机会,人工智能不再是科学家和专业人员在实验室才能研究的东西了。数据+算力+易得这几方面的因素结合之后,将人工智能再一次推向了高潮。

可能这一波热潮又是人工智能发展史上的一个波峰,未来人工智能还有很长的路要走。但目前的人工智能发展已经惠及到商业领域,在这样一种技术+商业的结合中,我个人还是很看好这次浪潮的。尤其是在看过《最强大脑》中,百度在图像、音频方面的人工智能技术发展到这样一个水平之后(图像识别已经超超越了人类大脑对图像的识别能力,声音识别也几乎和人类最高水平持平),很希望自己也可以有机会涉足到这个领域中。

机器学习基础入门知识

机器学习是人工智能的一个分支,主要是通过数据+算法来训练得出模型,再用模型来预测数据的一种技术。

刚开始接触机器学习,发现基础理论中好多都是大学里学过的数理知识(一直以来困扰我的“大学为什么要学这些东西”的谜团总算被解开了:)。我个人做了Web开发近十载,大部分是应用级的,很少涉及数理算法,看来今后还要慢慢拾起这些知识。不过刚开始入门可以循序渐进,先弄懂机器学习是怎么回事,动手做一个“Hello world”,然后再逐步深入原理层面的知识。

要涉足机器学习,最好会一种编程语言,这点上我们程序员有先天优势。目前用于机器学习的主流语言是PythonRR我个人还没研究过,个人觉得Python是一个比较好的选择,流行度高、上手难度低、科学计算类库丰富、语法精简,如果本身就有其他面向对象的编程语言基础,不到一周就可以基本掌握Python了。

机器学习从从业分布来看,可以分成基础算法研究(设计师)和应(ban)用(zhuan)两个领域,其中大部分人都是在应(ban)用(zhuan)这个领域。

如果从技术层面来看,机器学习分成监督学习无监督学习以及半监督学习。如何来区分呢?首先解释下机器学习中的几个名词。

  • 特性(Features) - 其实就是数据
  • 分类器(Classifier) - 其实就是算法
  • 标签(Labels) - 其实就是种类
  • 模型(Models) - 其实就是最终输出的分类公式

监督学习,就是在有标签的前提下,找到一种最合适的分类器,分析特性标签之间的关系。

无监督学习,就是没有标签的前提下,将数据进行聚类(Clusting)

半监督学习,就是部分特性标签,部分则没有的状况(大部分特性可能是没有标签的情况)下进行分类。

监督学习相对来说最简单,由已知特性标签,利用合适的分类器训练出模型,再以模型套用到数据中来预测出数据的标签。当然,分类器并不需要我们自己来发明创造,我们大部分人也没这个能力做这些事情,所有的理论研究、科学论证、代码实现都是现成的。Python中有很多相关类库,比如scikit-learn。应用层面的机器学习,其实就是通过不停的调参(收集更多的数据、变换算法、选取合适的特征数据等工作)来找到一种更精准的预测模型的工作。

Hello World In Machine Learning

假设我们现在需要区分皮球(以直径15cm-25cm之间的球为例)和甜瓜的图片,如果是传统的硬编码的方式来写代码的话,可能需要写几百上千个if-else才能完成一个基本的算法,而且可扩展性特别差,比如如果图片是黑白的或者图片中有干扰物品,那可能需要修改源代码,添加更多的if-else来增加准确度。更糟的是,真正执行的时候会遇到很多事先没有预料到的特殊情况。

但如果通过机器学习,这个事情可能就会变得很简单。大致步骤如下:

  1. 将图片转换成特征向量(这个进阶知识不在本篇中涉及)
  2. 决定一种合适当前场景的分类器
  3. 结合1中得到的特征2中得到的分类器训练出模型
  4. 模型中的公式预测数据,估算出其属于某个标签的可能性,最大可能性的那个即模型推算出的结果

数据准备

转换过程略,假设共N条数据,转换得到的特性如下:

直径(厘米) 形状 颜色 标签
24 round white melon
35 ellipse white melon
24 round orange ball
24 ellipse yellow melon
22 round yellow ball
... ... ... ...

实现代码

features = [
[24, 'round', 'white'],
[35, 'ellipse', 'white'],
[24, 'round', 'orange'],
[24, 'ellipse', 'yellow'],
[22, 'round', 'yellow'],
...
] labels = ['melon', 'melon', 'ball', 'melon', 'ball']

我们知道,计算机处理基础数据类型的速度,由快及慢为:boolintfloatstring...,因此,我们在处理数据的过程中,需要把原始数据抽象成计算机能最快处理的数据类型(因为机器学习运算量极大)。因此上面的代码经过转换之后:

# round:1, ellipse:2
# white:1, orange:2, yellow: 3
features = [[24, 1, 1], [35, 2, 1], [24, 1, 2], [24, 2, 3], [22, 1, 3]] # melon:1, ball: 2
labels = [1, 1, 2, 1, 2]

这里顺便提一下,大部分机器学习中,都是以GPU的性能来衡量处理速度的,而不是我们一般使用的CPU,这是因为GPU的物理架构和CPU不一样,GPU是专门为了处理图像而设计的,它对浮点数的处理速度是CPU的数十倍乃至数百倍。而机器学习基本上可以看做是对浮点数的大量运算,因此GPU更适合在机器学习领域被使用。

算法选取

机器学习中,解决一个问题的算法并不是唯一的,同一个问题可以适用不同的算法来解决,一般都会在效率准确率之间做权衡。本例中我们使用决策树(Deccision Tree)作为Classifier,关于决策树,可参考https://baike.baidu.com/item/%E5%86%B3%E7%AD%96%E6%A0%91

实现代码

from sklearn import tree
...
# 实例化classifier
clf = tree.DecisionTreeClassifier()

训练模型

scikit-learnclassifier中通过方法fit(features, labels)来训练模型。其返回值即我们所需的模型

实现代码

...
clf = tree.fit(features, labels)
...

预测数据

有了模型,我们就可以对今后的数据进行预测,以得出label值,从而达到对其归类的目的。

实现代码

...
# 假设现在有一个数据[23, 'round', 'white'],我们想知道他应该数据什么类型,先将其转换为[23, 1, 1], 然后调用模型的predict方法
print(clf.predict([[23, 1, 1]]))
...

得到的结果为:

# 代表机器学习测算得出结果是melon
[1]

完整代码

from sklearn import tree

# round:1, ellipse:2
# white:1, orange:2, yellow: 3
features = [[24, 1, 1], [35, 2, 1], [24, 1, 2], [24, 2, 3], [22, 1, 3]] # melon:1, ball: 2
labels = [1, 1, 2, 1, 2] # 实例化classifier
clf = tree.DecisionTreeClassifier()
# 训练
clf = clf.fit(features, labels) print(clf.predict([[23, 1, 1]]))

后记

上例中,如果通过真正的人工智能肉眼来看,[23, 'round', 'white']被推算为melon的准确度其实并不高,因为[23, 'round', 'white']归类为ball也完全是可以的。上文提到过,机器学习其实就是不停的寻找合适的数据和算法以提升准确率的过程。想要提升准确率,我们可以有以下思路:

  • 加大训练样本量(训练样本必须和训练效率做好权衡,另外,最好避免重复的特性浪费算力,比如有了直径这列,就不需要半径、周长这样的特性了,这三者代表的是一个意思)
  • 变换算法(可以选用更高级的算法或者多个算法组合,但必须在准确度和效率之间做好权衡)
  • 抽象出更多的特性数据(比如本例中,如果有办法抽象出质量这样的特性,那对于预测准确率会有极大的提升)

至此为止,我们机器学习的Hello World程序已经完成了,也基本了解了机器学习是怎么回事,是不是还挺有意思的?


本文在我的博客园我的个人博客上同步发布,作者保留版权,转载请注明来源。

机器学习笔记1 - Hello World In Machine Learning的更多相关文章

  1. 【原】Coursera—Andrew Ng机器学习—课程笔记 Lecture 17—Large Scale Machine Learning 大规模机器学习

    Lecture17 Large Scale Machine Learning大规模机器学习 17.1 大型数据集的学习 Learning With Large Datasets 如果有一个低方差的模型 ...

  2. 第二章——机器学习项目完整案例(End-to-End Machine Learning Project)

    本章通过一个例子,介绍机器学习的整个流程. 2.1 使用真实数据集练手(Working with Real Data) 国外一些获取数据的网站: Popular open data repositor ...

  3. 机器学习之强化学习概览(Machine Learning for Humans: Reinforcement Learning)

    声明:本文翻译自Vishal Maini在Medium平台上发布的<Machine Learning for Humans>的教程的<Part 5: Reinforcement Le ...

  4. 斯坦福机器学习视频笔记 Week6 关于机器学习的建议 Advice for Applying Machine Learning

    我们将学习如何系统地提升机器学习算法,告诉你学习算法何时做得不好,并描述如何'调试'你的学习算法和提高其性能的“最佳实践”.要优化机器学习算法,需要先了解可以在哪里做最大的改进. 我们将讨论如何理解具 ...

  5. 【机器学习|数学基础】Mathematics for Machine Learning系列之线性代数(1):二阶与三阶行列式、全排列及其逆序数

    @ 目录 前言 二阶与三阶行列式 二阶行列式 三阶行列式 全排列及其逆序数 全排列 逆序数 结语 前言 Hello!小伙伴! 非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出-   自我介绍 ...

  6. 斯坦福第十课:应用机器学习的建议(Advice for Applying Machine Learning)

    10.1  决定下一步做什么 10.2  评估一个假设 10.3  模型选择和交叉验证集 10.4  诊断偏差和方差 10.5  归一化和偏差/方差 10.6  学习曲线 10.7  决定下一步做什么 ...

  7. 学习笔记-----《Pattern Recognition and Machine Learning》Christopher M. Bishop

    Preface 模式识别这个词,以前一直不懂是什么意思,直到今年初,才开始打算读这本广为推荐的书,初步了解到,它的大致意思是从数据中发现特征,规律,属于机器学习的一个分支. 在前言中,阐述了什么是模式 ...

  8. Ng第十课:应用机器学习的建议(Advice for Applying Machine Learning)

    10.1  决定下一步做什么 10.2  评估一个假设 10.3  模型选择和交叉验证集 10.4  诊断偏差和方差 10.5  归一化和偏差/方差 10.6  学习曲线 10.7  决定下一步做什么 ...

  9. 10、应用机器学习的建议(Advice for Applying Machine Learning)

    10.1 决定下一步做什么 到目前为止,我们已经介绍了许多不同的学习算法,如果你一直跟着这些视频的进度学习,你会发现自己已经不知不觉地成为一个了解许多先进机器学习技术的专家了. 然而,在懂机器学习的人 ...

随机推荐

  1. jquery.editable-select 可编辑下拉框之获取select值和input值

    使用jquery.editable-select可以实现可编辑下拉框的功能,但需要先导入jquery.js,jquery.editable-select.css,jquery.editable-sel ...

  2. javascript创建css、js,onload触发callback兼容主流浏览器的实现

    http://www.fantxi.com/blog/archives/load-css-js-callback/ 由于需要写个函数,既可以加载css,又可以加载js,所以对各主流浏览器对加载js.c ...

  3. Python爬虫入门:Urllib库的基本使用

    1.分分钟扒一个网页下来 怎样扒网页呢?其实就是根据URL来获取它的网页信息,虽然我们在浏览器中看到的是一幅幅优美的画面,但是其实是由浏览器解释才呈现出来的,实质它 是一段HTML代码,加 JS.CS ...

  4. 分享如何将git项目导入GitHub(附创建分支)

    前言:我们应该很多都会有自己的私有项目,大多情况都是存放在自己的硬盘中,今天我分享一下怎么讲自己的私有项目更新到GitHub上,这样再也不用担心项目丢失了. 一:下载git 下载链接git链接,根据自 ...

  5. 高效sql2005分页存储过程

    高效分页存储过程 --分页存储过程示例 Alter PROCEDURE [dbo].[JH_PageDemo] @pageSize int = 9000000000, @pageIndex int = ...

  6. Java中swap()实现

    Java中swap()实现 1.今天可爱的谭老师发了一道题目,使用java写方法交换Integer类型数据,而且入参固定了,题目请下图: 入参固定的话,当时想到的是重新定义一个自己的Integer类型 ...

  7. [转载] Lucene 工作原理

    转载自http://www.cnblogs.com/dewin/archive/2009/11/24/1609905.html Lucene是一个高性能的java全文检索工具包,它使用的是倒排文件索引 ...

  8. canvas图表(2) - 折线图

    原文地址:canvas图表(2) - 折线图 话说这天气一冷啊, 就患懒癌, 就不想码代码, 就想着在床上舒舒服服看视频. 那顺便就看blender视频, 学习下3D建模, 如果学会了建3D模型, 那 ...

  9. 用StringBuilder和StringBuffer实现的Unicode解码方法的比较(Java)

    初衷是用正则来写一个Unicode字符串转码的方法,一开始是打算结合StringBuilder写的,但是看到jdk7的Matcher.appendReplacement文档中一段示例代码用了Match ...

  10. Chapter 7:Linking

    概述: 在linux上,从c源码到可执行文件主要需要经历translator(compiler.assembler)生成object file,再经由linker连接成executable objec ...