机器学习入门(2)--无监督学习
申明:此文章内容来自于 Doctor AndrewNG的视频,经过编辑而成
定义
监督学习中的每一个样本已经被清楚地告知了什么是所谓的正确答案。在非监督学中,我们的现有数据中并没有正确答案,我们有的只是特征,因而非监督学习要解决问题是发现这些数据是否可以分为不同的组。
直白一点,在无监督学习中 我们只有一个数据集 没人告诉我们该怎么做 我们也不知道 每个数据点究竟是什么意思 相反 它只告诉我们 现在有一个数据集 你能在其中找到某种结构吗? 我不知道这个数据是什么东东 我不知道里面都有些什么类型 叫什么名字 我甚至不知道都有哪些类型 但是 请问你可以自动的找到这些数据中的类型吗? 然后自动的 按得到的类型把这些个体分类对于给定的数据集 无监督学习算法可能判定该数据集包含两个不同的聚类,如下图:
无监督学习的无差别数据分类示意图例子:鸡尾酒会问题
一个宴会有一屋子的人 大家都坐在一起 而且在同时说话 有许多声音混杂在一起 因为每个人都是在同一时间说话的 在这种情况下你很难听清楚你面前的人说的话。命题是,如果使用一些麦克风录下房间中的声音,如何利用非监督学习算法来识别房间中某一个人所说的话。为简化问题,假设两个人在讲话,准备好了两个麦克风。因为这两个麦克风距离这两个人的距离是不同的,每个麦克风都记录下了来自两个人的声音的不同组合利用两个麦克风录音,如下图。也许Speaker#1的声音 在第一个麦克风里的声音会响一点 也许Speaker#2的声音 在第二个麦克风里会比较响一些 因为2个麦克风 的位置相对于 2个说话者的位置是不同的 但每个麦克风都会录到 来自两个说话者的重叠部分的声音。
鸡尾酒会简化模型所以 你可以看到 像这样的无监督学习算法 也许你想问 要实现这样的算法 很复杂吧? 看起来 为了 构建这个应用程序 做这个音频处理 似乎需要写好多代码啊 或者需要链接到 一堆处理音频的Java库 貌似需要一个 非常复杂的程序 分离出音频等。实际上使用Octave只需要一行代码就可以了,如下: [W,s,v] = svd((repmat(sum(x.*x,1),size(x,1),1).*x)*x');