为什么机器学习这么流行
- 实际上,机器学习是从AI即人工智能发展出来的一个领域,机器学习是为计算机开发的一项新功能,如今它涉及工业和基础科学中的许多领域。
应用
- 数据挖掘,机器学习如此普遍的原因之一就是网络和自动化技术的发展,这意味着我们拥有了前所未有的大量的数据集。现在大量硅谷公司,收集网络点击数据或者说点击流数据,并试图采用机器学习算法来挖掘数据,更好地理解用户并更好地为用户服务。
- 医疗记录,随着自动化的出现,现在我们有了电子医疗记录,假如我们能将医疗记录转化为医疗知识,就能更好地理解疾病。
- 计算生物学,因为自动化生物学家收集了关于基因序列DNA序列等的大量数据,机器学习算法让我们更好地理解人类基因组,以及身为人类意味着什么;同样在工程学所有的领域,我们正设法采用学习算法,来理解越来越大的数据集。
- 机器应用的第二个领域是我们无法手动编写的程序,例如已经在自动直升飞机领域研究了很多年,我们就是不知道如何编写程序,使直升飞机自己飞行,唯一可行的就是,让计算机自己学习驾驶直升飞机。
- 手写识别,如今在美国国内或是跨国邮寄,不再昂贵的原因之一,就是当你写好这样一个信封后,学习算法能够读取你的手写体,然后自动地给你的信规划路线,因此邮寄几千公里之外的信也只需要花费几分钱。
- 事实上,假如你知道自然语言处理或计算机视觉,这些是AI中有关理解语言或理解图像的领域。现在大部分的自然语言处理和计算机视觉,就是应用了机器学习。
- 学习算法还广泛应用于私人定制程序中,每次当你使用亚马逊或者Netflix或iTunes Genius,它就会推荐电影、产品或者音乐给你,这就是机器学习。
- 最后机器学习还被用来理解人类的学习过程和大脑。
机器学习的定义
即使在机器学习从业者中,也没有对机器学习的统一定义。下面列举一些现有的对机器学习的定义:
- Arthur Samuel(1959)对机器学习的定义:在没有明确设置的情况下,使计算机具有学习能力的研究领域。
这是有点不正式也是比较陈旧的一个定义。下面是一个更新的定义 : - Tom Mitchell(1998)一个适当的学习问题定义:计算机程序从经验 E 中学习,解决某一任务 T 进行某一性能度量 P,通过 P 测定在 T 上的表现因经验 E 而提高。
例题
- 假设你的邮件程序观察你将哪些邮件标记为垃圾邮件,因此在这样的邮件客户端,你可能标记其中一些邮箱为垃圾邮件,而其他的不标记,基于你标记的垃圾邮件,你的邮件程序学会了如何更好地过滤垃圾邮件。
- 答:在这个例子中,任务 T 是指给邮件分类;观察你是否把邮件标记为垃圾邮件,这是经验 E;正确归类的邮件的比例,这是性能度量 P。
机器学习的类型
目前有各种不同类型的学习算法,最主要的两类是监督学习和无监督学习。
- 简单来说,监督学习就是我们会教计算机做某件事情,然而在无监督学习中,我们让计算机自己学习。
- 其他的热词:强化学习和推荐学习。最常使用的两类学习算法时监督学习和非监督学习。
监督学习(Supervised Learning)
- 监督学习是指我们给算法一个数据集,其中包含了正确答案,算法的目的就是给出更多的正确答案。
- 在监督学习中,对于数据集中的每个样本都有对应的标签,监督学习包括回归问题和分类问题。
- 回归是指我们的目标是预测一个连续值输出。
- 分类问题的目的是预测离散值输出。
- 你想用无限多种特征,好让你的算法可以利用大量的特征,或者说线索来做推测。那你怎么处理无限多个特征,甚至怎么存储这些特征都存在问题,你电脑的内存肯定不够用。我们以后会讲一个算法,叫支持向量机,里面有一个巧妙的数学技巧,能让计算机处理无限多个特征。
无监督学习
- 在无监督学习中,我们所用的数据和之前的不同,数据没有任何标签,都具有相同的标签或者都没有标签。
- 对于给定的数据集,无监督学习算法可能判定该数据集包含两个不同的簇,这就是聚类算法。
- 举例:谷歌新闻所做的就是每天去网络上收集几万条甚至几十万条新闻,然后将他们组合成一个个新闻专题。
- 著名的一个例子:鸡尾酒晚会,分离不同的声音。处理音频的需要用到C++或者Java库,很复杂的代码来分离音频,实际上,只需要一行代码
[W,s,v]= svd((repmat(sum(x.*x,1),size(x,1),1).*x)*x`);
- 编程环境:Octave 开源免费的软件,使用 Octave 或 Matlab 这类的工具,许多算法都可以用几行代码来实现,一般都是先用Octave 建立软件原型,因为 Octave 中实现这些,学习算法的速度很快,这里每一个函数,例如 svd 即奇异值分解的缩写,其实这个已经作为线性代数常规函数,内置在 Octave 软件中了,如果想要用 C++ 或者 Java 做这个,将需要写很多代码,还要连接复杂的 C++ 或 Java 库。
- 很多在硅谷大公司工作的人,会先用 Octave 来建立学习算法原型,只有在这个算法可以工作后,才将其迁移到 C++、Java 或其他编译环境。这样比一开始就用 C++,能够更快地实现算法。