机器学习之非监督学习

监督式学习中已经给出了特征和标签,相当于告诉了机器正确答案,让机器去学习;而非监督式学习中,所有数据都是一样,机器不知道他们的特征,所以机器要根据算法进行聚类,找出相近的数据特征并进行分类。

在非监督学习中,我们用的数据会和监督学习里的有些不一样,在非监督学习中,没有属性或标签这一概念,也就是说所有的数据,都是一样的,没有区别,所以在非监督学习中,我们只有一个数据集,没人告诉我们该怎么做,我们也不知道,每个数据点究竟是什么意思,相反,它只告诉我们:现在有一个数据集,你能在其中找到某种结构吗?

监督学习:

https://static.surmon.me/17-4-27/54450795-file_1493308444866_58a8.png

非监督学习:

https://static.surmon.me/17-4-27/64831480-file_1493308330694_126c.png

对于给定的数据集,非监督学习算法可能判定,该数据集包含两个不同的聚类,如下图所示:

https://static.surmon.me/17-4-27/66170863-file_1493308622380_7dd6.png

我们使用标记标出了两个聚类,非监督学习算法,会把这些数据分成两个不同的聚类,这就是所谓的聚类算法,实际上它被用在许多地方。

我们来举一个聚类算法的例子,Google新闻的例子:你可以到news.google.com去看看,谷歌新闻每天都在干什么呢?他们每天会去收集成千上万的网络上的新闻,然后将他们分组,组成一个个新闻专题;谷歌新闻所做的就是,去搜索成千上万条新闻数据,然后自动的将他们根据一定特征聚合在一起,因此,有关同一主题的,新闻被显示在一起。

实际上,聚类算法和非监督学习算法,也可以被用于许多其他的问题,这里我们举个它在基因组学中的应用,下面是一个关于基因芯片的例子:

https://static.surmon.me/17-4-28/16684058-file_1493309390557_ef2.png

基本的思想是,给定一组不同的个体,对于每个个体,检测它们是否拥有某个特定的基因;也就是说:你要去分析有多少基因显现出来了;因此,这些颜色:红、绿、灰...等等,它们,展示了这些不同的个体是否拥有一个特定基因的不同程度;你能做的就是运行一个聚类算法,把不同的个体归入不同的类,或归为不同类型的人,这就是非监督学习,我们没有提前告知这个算法,哪些是第一类的人,哪些是第二类的人,哪些是第三类的人等等,相反我们只是告诉算法,你看,这儿有一堆数据,我不知道这个数据是什么东东,我不知道里面都有些什么类型,叫什么名字,我甚至不知道都有哪些类型,但是,请问你可以自动的找到这些数据中的类型吗?然后机器自动地按得到的类型把这些个体分类,虽然事先我并不知道哪些类型,因为对于这些数据样本来说,我们没有给算法一个正确答案,所以,这就是非监督学习。

非监督学习或聚类算法在其他领域也有着大量的应用,它被用于社交网络的分析,比如:如果可以得知,哪些朋友你用email联系的最多,或者知道你的Facebook好友,或者你Google+里的朋友,知道了这些之后,我们是否可以自动识别,哪些是很要好的朋友组,哪些仅仅是互相认识的朋友组。

还有在市场分割中的应用,许多公司拥有庞大的客户信息数据库,那么,给你一个客户数据集,你能否自动找出不同的市场分割,并自动将你的客户分到不同的细分市场中,从而有助于我在不同的细分市场中进行更有效的销售,这也是非监督学习,我们现在有这些客户数据,但我们预先并不知道有哪些细分市场,而且,对于我们数据集的某个客户,我们也不能预先知道,谁属于细分市场一,谁又属于细分市场二等等,但我们必须让这个算法自己去从数据中发现这一切。

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

现在我们了解另一种情景;想象一下:有一个宴会,有一屋子的人,大家都坐在一起,而且在同时说话,有许多声音混杂在一起,因为每个人都是在同一时间说话的,在这种情况下你很难听清楚你面前的人说的话;因此,我们简化一下场景,宴会上只有两个人A和B,两个人同时说话,我们准备好了两个麦克风,把它们放在房间里,然后,因为这两个麦克风距离这两个人的距离是不同的,每个麦克风都记录下了来自两个人的声音的不同组合,也许A的声音在第一个麦克风里的声音会响一点,也许B的声音在第二个麦克风里会比较响一些,因为2个麦克风的位置相对于2个说话者的位置是不同的,但每个麦克风都会录到来自两个说话者的重叠部分的声音,就像下图:

https://static.surmon.me/17-4-28/29819427-file_1493310540719_b018.png

这里有来自研究员同时录下的两个说话者的声音,我们分别得到两个麦克风的录音:

好吧,这大概不是什么有趣的酒会……,这俩人各自从1数到10,但用的是两种不同语言...

录音内容均为:1/UNO、2/DOS、3/TRES、4/CUATRO、5/CINCO、6/SEIS、7/SIETE、8/ocho、9/NUEVE、10/Y,DIEZ,不同之处为:由于麦克风距离两者的距离不同,故两者在两段录音中的距离麦克风近者在声音中的分贝较高,但内容一致。

所以,我们能做的,就是把这两个录音输入一种非监督学习算法中,让这个算法,帮你找出其中蕴含的分类,然后这个算法就会去听这些录音,根据分析知道这听起来像两个音频录音被叠加在一起,所以我们才能听到音频分离的效果; 此外,这个算法还会分离出这两个被叠加到一起的音频源;事实上,这是我们的算法的第一个输出:1、2、3、4、5、6、7、8、9、10,所以我们在一个录音中分离出了英文声音,这是第二个输出:Uno、dos、tres、quatro、cinco、seis、siete、ocho、nueve、y,diez

听起来不错!再举一个例子,现在有另一个录音,也是在一个类似的场景下:刚才那个可怜的家伙从鸡尾酒会回家了...他现在独自一人坐在屋里,对着录音机自言自语,情况变成了这样:

https://static.surmon.me/17-4-28/76112705-file_1493311726100_6c2d.png

同样,两个麦克风的录音内容均为:1、2、3、4、5、6、7、8、9、10,区别在于录音机一直在放一首Disco音乐,所以两个麦克风接收到的内容一致,但声音强度不同;当你把这两个麦克风录音,送给与刚刚相同的算法处理,它所做的,还是告诉你,这听起来有两种音频源,并且,算法说,这里是我找到的第一个音频源:1、2、3、4、5、6、7、8、9、10,恩!不是太完美,你会听到,算法提取到了人声,但还有一点音乐没有剔除掉;算法的第二个输出还好,在第二个输出中,它设法剔除掉了整个人声,只是清理了下音乐,剔除了从1到10的计数,所以你可以看到像这样的非监督学习算法。

也许你想问,要实现这样的算法,很复杂吧?看起来,为了构建这个应用程序做这个音频处理,似乎需要写好多代码啊,或者需要链接到一堆处理音频的Java库,貌似需要一个非常复杂的程序分离出音频等,实际上,要实现你刚刚听到的效果,只需要一行代码就可以了:

[W,s,v] = svd((repmat(sum(x.*x,1),size(x,1),1).*x)*x');

当然,研究人员,花了很长时间才想出这行代码的,不是说这是一个简单的问题,但事实上,如果你使用正确的编程环境,许多学习算法是用很短的代码写出来的,所以这也是为什么我们要使用Octave的编程环境,Octave是一个免费的、开放源码的软件,使用OctaveMatlab这类的工具,许多学习算法都可以用几行代码就可以实现。

事实上,在硅谷,很多的机器学习算法,都是先用Octave,写一个程序原型,因为在Octave中实现这些,学习算法的速度快得让你无法想象,在这里,每一个函数,例如SVD,意思是奇异值分解,但这其实是解线性方程的一个惯例,它被内置在Octave软件中了,如果你试图在C++Java中做这个,将需要写N多代码,并且还要连接复杂的C++Java库,所以你可以在C++JavaPython中实现这个算法,只是会更加复杂而已。

最后,总结一下,我们谈到了非监督学习,它是一种学习机制,你给算法大量的数据,要求它找出数据中蕴含的类型结构,看下面几个例子:

  • 还记得垃圾邮件文件夹问题吧?如果你已经标记过数据,那么就有垃圾邮件和非垃圾邮件的区别,我们会将此视为一个监督学习问题
  • 新闻故事的例子,正是我们在本文中讲到的,谷歌新闻的例子,我们介绍了你可以如何使用聚类算法这些文章聚合在一起,所以这是非监督学习问题
  • 市场细分的例子,上面也说了,这也是一个非监督学习问题,因为我是要拿到数据,然后要求它自动发现细分市场

内容衍生自:

Coursera - Andrew Ng

本文于 2017/4/27 下午 发布在 Code 分类下,当前已被围观 649 次

相关标签:机器学习

永久地址:https://surmon.me/article/49

版权声明:自由转载-署名-非商业性使用  |  Creative Commons BY-NC 3.0 CN