0%

斯坦福机器学习课程 第一周 (3)无监督学习

无监督学习

视频地址

在这段视频中我们要讲第二种主要的机器学习问题,叫做无监督学习.

在上一节视频中,我们已经讲过了监督学习。回想起上次的数据集,每个样本,都已经被标明为正样本或者负样本,即良性或恶性肿瘤。

因此,对于监督学习中的每一个样本,我们已经被清楚地告知了什么是所谓的正确答案,即它们是良性还是恶性。在无监督学习中,我们用的数据会和监督学习里的看起来有些不一样。在无监督学习中,没有属性或标签这一概念,也就是说所有的数据都是一样的,没有区别。

所以在无监督学习中我们只有一个数据集,没人告诉我们该怎么做,我们也不知道,每个数据点究竟是什么意思。相反,它只告诉我们现在有一个数据集,你能在其中找到某种结构吗?对于给定的数据集,无监督学习算法可能判定该数据集包含两个不同的聚类。

你看,这是第一个聚类。

然后这是另一个聚类。

你猜对了,无监督学习算法会把这些数据分成两个不同的聚类。

所以这就是所谓的聚类算法,实际上它被用在许多地方。

我们来举一个聚类算法的栗子。Google新闻的例子,如果你还没见过这个页面的话,你可以到这个URL news.google.com去看看。谷歌新闻每天都在干什么呢?他们每天会去收集成千上万的网络上的新闻,然后将他们分组,组成一个个新闻专题。

比如让我们来看看这里:

这里的URL链接连接着不同的有关BP油井事故的报道。所以让我们点击这些URL中的一个,然后我们会来到这样一个网页。

这是一篇来自华尔街日报的,有关BP油井泄漏事故的报道,标题为《BP杀死了Macondo》。Macondo是个地名,就是那个漏油事故的地方。如果你从这个组里点击一个不同的URL,那么你可能会得到不同的新闻:这里是一则CNN的新闻,是一个有关BP石油泄漏的视频。

如果你再点击第三个链接,又会出现不同的新闻。这边是英国卫报的报道,也是关于BP石油泄漏。

所以,谷歌新闻所做的就是,去搜索成千上万条新闻,然后自动的将他们聚合在一起。因此,有关同一主题的新闻被显示在一起。

实际上聚类算法和无监督学习算法也可以被用于许多其他的问题。这里我们举个它在基因组学中的应用。

下面是一个关于基因芯片的例子,基本的思想是:给定一组不同的个体 对于每个个体,检测它们是否拥有某个特定的基因。也就是说,你要去分析有多少基因显现出来了。因此,这些颜色:红、绿、灰等等,它们 展示了这些不同的个体是否拥有一个特定基因的不同程度。

然后你能做的就是,运行一个聚类算法,把不同的个体归入不同的类或归为不同类型的人。

这就是无监督学习。我们没有提前告知这个算法:这些是第一类的人,这些是第二类的人,这些是第三类的人等等。相反我们只是告诉算法:你看!这儿有一堆数据,我不知道这个数据是什么东东,我不知道里面都有些什么类型,叫什么名字,我甚至不知道都有哪些类型。但是,请问你可以自动的找到这些数据中的类型吗?然后自动的按得到的类型把这些个体分类。虽然事先我并不知道哪些类型。因为对于这些数据样本来说,我们没有给算法一个正确答案,所以,这就是无监督学习。

无监督学习或聚类算法在其他领域也有着大量的应用,它被用来组织大型的计算机集群。

我有一些朋友在管理大型数据中心,也就是大型计算机集群,并试图找出哪些机器趋向于协同工作,如果你把这些机器放在一起,你就可以让你的数据中心更高效地工作。

第二种应用是用于社交网络的分析

如果可以得知哪些朋友你用email联系的最多,或者知道你的Facebook好友或者你Google+里的朋友,知道了这些之后,我们是否可以自动识别哪些是很要好的朋友组,哪些仅仅是互相认识的朋友组。

还有在市场分割中的应用中,许多公司拥有庞大的客户信息数据库。那么,给你一个客户数据集,你能否自动找出不同的市场分割,并自动将你的客户分到不同的细分市场中,从而有助于我在不同的细分市场中进行更有效的销售。

这也是无监督学习。我们现在有这些客户数据,但我们预先并不知道 有哪些细分市场。而且,对于我们数据集的某个客户,我们也不能预先知道谁属于细分市场一、谁又属于细分市场二等等。但我们必须让这个算法自己去从数据中发现这一切。

最后,事实上无监督学习也被用于天文数据分析。通过这些聚类算法我们发现了许多惊人的、有趣的,以及实用的,关于星系是如何诞生的理论。

所有这些都是聚类算法的例子。而聚类只是无监督学习的一种,现在让我来告诉你另一种,我先来介绍一下鸡尾酒宴问题:

恩,我想你参加过鸡尾酒会的,是吧?嗯,想象一下,有一个宴会,有一屋子的人,大家都坐在一起,而且在同时说话,有许多声音混杂在一起。因为每个人都是在同一时间说话的,在这种情况下你很难听清楚你面前的人说的话。

因此,比如有这样一个场景:宴会上只有两个人,两个人同时说话。恩,这是个很小的鸡尾酒宴会,我们准备好了两个麦克风,把它们放在房间里,然后,因为这两个麦克风距离这两个人的距离是不同的,每个麦克风都记录下了来自两个人的声音的不同组合。也许A的声音在第一个麦克风里的声音会响一点,也许B的声音在第二个麦克风里会比较响一些。因为两个麦克风的位置相对于两个说话者的位置是不同的,但每个麦克风都会录到来自两个说话者的重叠部分的声音。

这里有一个来自一个研究员录下的两个说话者的声音,让我先放给你听。第一个这是第一个麦克风录到的录音:

Microphone #1
一 (UNO) 二 (DOS) 三 (TRES) 四 (CUATRO) 五 (CINCO) 六 (SEIS) 七 (SIETE) 八 (ocho) 九 (NUEVE) 十 (Y DIEZ)

好吧 这大概不是什么有趣的酒会…… ……在这个酒会上,有两个人,各自从1数到10。但用的是两种不同语言。你刚才听到的是第一个麦克风的录音,这里是第二个的:

Microphone #2

一 (UNO) 二 (DOS) 三 (TRES) 四 (CUATRO) 五 (CINCO) 六 (SEIS) 七 (SIETE) 八 (ocho) 九 (NUEVE) 十 (Y DIEZ)

所以,我们能做的就是把这两个录音输入一种无监督学习算法中,称为“鸡尾酒会算法”,让这个算法帮你找出其中蕴含的分类,然后这个算法就会去听这些录音,并且你知道这听起​​来像两个音频录音被叠加在一起,所以我们才能听到这样的效果。此外这个算法还会分离出这两个被 叠加到一起的音频源。事实上,这是我们的鸡尾酒会算法的第一个输出:

Output #1

一 二 三 四 五 六 七 八 九 十

所以我在一个录音中分离出了英文声音。这是第二个输出:

Output #2

Uno dos tres quatro cinco seis siete ocho nueve y diez

听起来不错嘛。再举一个例子,这是另一个录音,也是在一个类似的场景下,这是第一个麦克风的录音:

Microphone #1

一 二 三 四 五 六 七 八 九 十

OK,这个可怜的家伙从鸡尾酒会回家了,他现在独自一人坐在屋里对着录音机自言自语,这是第二个麦克风的录音:

Microphone #2

一 二 三 四 五 六 七 八 九 十

当你把这两个麦克风录音送给与刚刚相同的算法处理,它所做的还是 告诉你这听起来有两种音频源,并且算法说,这里是我找到的第一个音频源:

Output #1

一 二 三 四 五 六 七 八 九 十

恩,不是太完美,提取到了人声,但还有一点音乐没有剔除掉。这是算法的第二个输出:

Output #2

还好,在第二个输出中,它设法剔除掉了整个人声,只是清理了下音乐剔除了从一到十的计数。

所以,你可以看到,像这样的无监督学习算法,也许你想问,要实现这样的算法很复杂吧? 看起来为了构建这个应用程序做这个音频处理似乎需要写好多代码啊,或者需要链接到一堆处理音频的Java库,貌似需要一个非常复杂的程序分离出音频等。

实际上,要实现你刚刚听到的效果,只需要一行代码就可以了。写在这里呢。

当然,研究人员花了很长时间才想出这行代码的^-^,我不是说这是一个简单的问题,但事实上,如果你使用正确的编程环境,许多学习算法是用很短的代码写出来的。所以这也是为什么在这门课中我们要使用Octave的编程环境。

Octave是一个免费的、开放源码的软件。使用Octave或Matlab这类的工具,许多学习算法都可以用几行代码就可以实现。在后续课程中,我会教你如何使用Octave。你会学到如何在Octave中实现这些算法,或者如果你有Matlab,你可以用它。

事实上,在硅谷,很多的机器学习算法,我们都是先用Octave写一个程序原型。因为在Octave中实现这些学习算法的速度快得让你无法想象。

在这里每一个函数,例如:SVD意思是奇异值分解,但这其实是解线性方程的一个惯例,它被内置在Octave软件中了。

如果你试图在C++或Java中做这个,将需要写N多代码,并且还要连接复杂的C++或Java库。所以,你可以在C++或Java或Python中实现这个算法,只是会更加复杂而已。

在教授机器学习将近10年后,我得出的一个经验就是,如果你使用Octave的话,会学的更快。并且如果你用Octave作为你的学习工具 和开发原型的工具,你的学习和开发过程会变得更快。而事实上在硅谷 很多人会这样做。他们会先用Octave来实现这样一个学习算法原型,只有在确定这个算法可以工作后,才开始迁移到C++、Java或其它编译环境。事实证明,这样做实现的算法,比你一开始就用C++实现的算法要快多了。

所以我知道,作为一个老师,我不能老是念叨:“在这个问题上相信我“ 但对于那些从来没有用过这种类似Octave的编程环境的童鞋,我还是要请你相信我这一次,我认为你的时间,研发时间,是你最宝贵的资源之一。

当见过很多的人这样做以后,我觉得如果你也这样做,作为一个机器学习的研究者和开发者,你会更有效率。如果你学会先用Octave开发原型,而不是先用其他的编程语言来开发。

最后,总结一下。这里有一个问题需要你来解答:

我们谈到了无监督学习,它是一种学习机制,你给算法大量的数据,要求它找出数据中蕴含的类型结构,以下的四个例子中,哪一个您认为是 无监督学习算法,而不是监督学习问题?

  • 通过标记邮件是否为垃圾邮件来实现的垃圾邮件过滤器。
  • 从网络中爬取一些新闻,按照相同的类别进行自动分组。
  • 通过一个市场数据库,来自动的发现市场细分类别。
  • 通过一系列糖尿病患者的数据信息来学习,达到能分辨一个新的患者是否得了糖尿病。

恩,没忘记垃圾邮件文件夹问题吧?如果你已经标记过数据,那么就有垃圾邮件和非垃圾邮件的区别,我们会将此视为一个监督学习问题。

新闻故事的例子正是我们在本课中讲到的谷歌新闻的例子。我们介绍了你可以如何使用聚类算法这些文章聚合在一起,所以这是无监督学习问题。

市场细分的例子,我之前有说过这也是一个无监督学习问题。因为我是要拿到数据,然后要求它自动发现细分市场。

最后一个例子,糖尿病。这实际上就像我们上节课讲到的乳腺癌的例子 只不过这里不是好的或坏的癌细胞,良性或恶性肿瘤。我们现在是有糖尿病或没有糖尿病。所以这是有监督的学习问题,像处理那个乳腺癌的问题一样。我们会把它作为一个有监督的学习问题来处理。

好了,关于无监督学习问题就讲这么多了,下一节课中我们会涉及到更具体的学习算法,并开始讨论这些算法是如何工作的,以及我们如何来实现它们。