吴恩达课程系列
1-3监督学习【监督学习的定义,监督学习的分类(回归与分类)】
1-4 非监督学习Unsupervised Learning
首先回顾监督学习的例子(上面图中的左图),这个数据集中每条数据都已经标明是阴性或阳性,即是良性或恶性肿瘤。所以,对于监督学习里的每条数据,我们已经清楚地知道,训练集对应的正确答案,是良性或恶性了。
在无监督学习中,我们已知的数据看上去有点不一样(上图中的右图),不同于监督学习数据的样子,即无监督学习中没有任何的标签或者是有相同的标签或者就是没标签。所以我们已知数据集,却不知如何处理,也未告知每个数据点是什么。别的都不知道,就是一个数据集。你能从数据中找到某种结构吗?针对数据集,无监督学习就能判断出数据有两个不同的聚集簇。这是一个,那是另一个,二者不同。
无监督学习算法可能会把这些数据分成两个不同的簇。所以叫做聚类算法。事实证明,它能被用在很多地方。
聚类应用的一个例子就是在谷歌新闻中。如果你以前从来没见过它,你可以到这个 URL 网址 news.google.com 去看看。谷歌新闻每天都在,收集非常多,非常多的网络的新闻内容。它再将这些新闻分组,组成有关联的新闻。所以谷歌新闻做的就是搜索非常多的新闻事件, 自动地把它们聚类到一起。所以,这些新闻事件全是同一主题的,所以显示到一起。 事实证明,聚类算法和无监督学习算法同样还用在很多其它的问题上。
其中就有基因学的理解应用,上面是一个 DNA 微观数据的例子。
基本思想是输入一组不同个体,对其中的每个个体,你要分析出它们是否有一个特定的基因。技术上,你要分析多少特定基因已经表达。所以这些颜色,红,绿,灰等等颜色,这些颜色展示了相应的程度,即不同的个体是否有着一个特定的基因。你能做的就是运行一个聚类算法,把个体聚类到不同的类或不同类型的组(人)……
所以这个就是无监督学习,因为我们没有提前告知算法一些信息,比如,这是第一类的人,那些是第二类的人,还有第三类,等等。我们只是说,这是有一堆数据。我不知道数据里面有什么。我不知道谁是什么类型。我甚至不知道人们有哪些不同的类型,这些类型又是什么。但你能自动地找到数据中的结构吗?就是说你要自动地聚类那些个体到各个类,我没法提前知道哪些是哪些。因为我们没有给算法正确答案来回应数据集中的数据,所以这就是无监督学习。
无监督学习或聚集(clustering)有着大量的应用。它用于组织大型计算机集群。作者有些朋友在大数据中心工作,那里有大型的计算机集群,他们想解决什么样的机器易于协同地工作,如果你能够让那些机器协同工作,你就能让你的数据中心工作得更高效。
第二种应用就是社交网络的分析(让我想起了学校这窒息的“复杂网络”课程。。。)。所以已知你朋友的信息,比如你经常发 email 的,或是你 Facebook 的朋友、谷歌+圈子的朋友,我们能否自动地给出朋友的分组呢?即每组里的人们彼此都熟识,认识组里的所有人?
还有市场分割。许多公司有大型的数据库,存储消费者信息。所以,你能检索这些 顾客数据集,自动地发现市场分类,并自动地把顾客划分到不同的细分市场中,你才能自动并更有效地销售或不同的细分市场一起进行销售。这也是无监督学习,因为我们拥有所有的顾客数据,但我们没有提前知道是什么的细分市场。 我们不知道谁是在一号细分市场,谁在二号市场,等等。那我们就必须让算法从数据中发现这一切。
最后,无监督学习也可用于天文数据分析,这些聚类算法给出了令人惊讶、有趣、有用的理论,解释了星系是如何诞生的。这些都是聚类的例子,聚类只是无监督学习中的一种。
现在解释无监督学习的另一种问题(第一种是聚类问题,上面已经提及)。
先来介绍鸡尾酒宴问题。可以想像下,有个宴会房间里满是人,全部坐着,都在聊天,这么多人同时在聊天,声音彼此重叠,因为每个人都在说话,同一时间都在说话,你几乎听不到你面前那人的声音。假设现在是在个有些小的鸡尾酒宴中(人数少)。我们放两个麦克风在房间中,因为这些麦克风在两个地方,离说话人的距离不同,每个麦克风记录下不同的声音(虽然是同样的两个说话人,如下图所示)。听起来像是两份录音被叠加到一起,或是被归结到一起,产生了我们现在的这些录音。另外,这个算法还会区分出两个音频资源,这两个可以合成或合并成之前的录音,实际上,鸡尾酒算法的第一个输出结果是: 1,2,3,4,5,6,7,8,9,10, 所以,已经把英语的声音从录音中分离出来了。
看看这个无监督学习算法,好像实现这个得要多么的复杂。为了构建这个应用,完成这个音频处理似乎需要你去写大量的代码或链接到一堆的合成器 JAVA 库,处理音频的库,看上去绝对是个复杂的程序,从音频中分离出音频。事实上,这个算法对应你刚才知道的那个问题可以就用一行代码来完成。 就是下面展示的代码:
1
[W,s,v] = svd((repmat(sum(x.*x,1),size(x,1),1).*x)*x');
关于这行代码的python使用 我在本博客后面详细说明。
研究人员花费了大量时间才最终实现这行代码。我不是说这个是简单的问题,但它证明了,当你使用正确的编程环境,许多学习算法是相当短的程序。所以,这也是为什么在本课中,我们打算使用 Octave 编程环境。Octave,是免费的开源软件,使用一个像 Octave 或Matlab 的工具,许多学习算法变得只有几行代码就可实现。
备注:我不打算用octave,我只想用python
后面,吴恩达老师会教你们一点关于如何使用 Octave 的知识,你就可以用 Octave 来实现一些算法了。或者,如果你有 Matlab(盗版?),你也可以用 Matlab。
事实上,在硅谷里,对大量机器学习算法,我们第一步就是建原型(在 Octave 建软件原型),因为软件在 Octave 中可以令人难以置信地、快速地实现这些学习算法。这里的这些函数比如 SVM(支持向量机)函数,奇异值分解(上面那行代码的svd),Octave 里已经建好了。如果你试图完成这个工作,但借助 C++或 JAVA 的话, 你会需要很多很多行的代码,并链接复杂的 C++或 Java 库。所以,你可以实现这些算法, 借助 C++或 Java 或 Python,它只是用这些语言来实现会更加复杂。
我已经见到,在我教机器学习将近十年后的现在,发现,学习可以更加高速,如果使用Octave 作为编程环境,如果使用 Octave 作为学习工具(以及作为原型工具),它会让你对学习算法的学习和建原型快上许多。
事实上,许多人在大硅谷的公司里做的其实就是,使用一种工具像 Octave 来做第一步的学习算法的原型搭建,只有在你已经让它工作后,你才移植它到 C++或 Java 或别的语言。事实证明,这样做通常可以让你的算法运行得比直接用 C++实现更快,所以,我知道,作为一名指导者,我必须说“相信我”,但对你们中从未使用过 Octave 这种编程环境的人,我还是要告诉你们这一点一定要相信我,我想,对你们而言,我认为你们的时间,你们的开发时间是最有价值的资源。我已经见过很多人这样做了,我把你看作是机器学习研究员,或机 器学习开发人员,想更加高产的话,你要学会使用这个原型工具,开始使用 Octave。
测验:
答案:2, 3
1:如果你有标记好的数据,区别好是垃圾还是非垃圾邮件,这个是监督学习问题。
2:新闻事件分类的例子,就是那个谷歌新闻的例子,可以用一个聚类算法来聚类这些文章到一起,所以是无监督学习。
3:细分市场的例子,无监督学习问题,因为只是拿到算法数据,再让算法去自动地发现细分市场。
4:糖尿病,这个其实就像是1-3这一节的乳腺癌的例子,只是替换了好、坏肿瘤,良性、恶性肿瘤,改用糖尿病或没病。所以我们把这个当作监督学习。
到底选什么语言学习机器学习?
- 如果你是机器学习新手: 强烈建议从 Python 开始。 Python 易于学习,拥有完善的机器学习生态系统,并且可以免费使用。 先学习 Python 的基础知识,然后学习 NumPy、Pandas、Scikit-learn 等库。
- 如果你已经熟悉 MATLAB: 并且主要从事科学计算、工程仿真等领域,MATLAB 仍然是一个不错的选择。 特别是当你需要使用 MATLAB 提供的特定工具箱或 Simulink 时。
- 如果你想从事深度学习研究: Python 是更好的选择,因为它拥有 TensorFlow 和 PyTorch 等强大的深度学习框架。
- 如果你在学术界工作: MATLAB 仍然在某些学术领域被广泛使用,你需要根据你的研究方向和导师的要求来选择。
长远来看,Python 是更值得投资的技能。它的生态系统更现代化,应用范围更广,而且免费开源的特性可以随时随地学习和实践。建议从 Python 入门,可以先学习基础语法,再结合 scikit-learn 这样的库开始机器学习实践。如果在学校或工作中已经有了 MATLAB 的基础,不妨先用 MATLAB 过渡,然后逐步转向 Python。
关于那句代码的python使用
1
[W,s,v] = svd((repmat(sum(x.*x,1),size(x,1),1).*x)*x');
上面的这一行代码是matlab语言的,执行的是矩阵的奇异值分解 (Singular Value Decomposition, SVD) 的操作。
如何在python(比如Jupyter notebook)中进行测试?
在 Python 中,我们可以用 NumPy 库来实现相同的功能。以下是等价的代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import numpy as np
x = np.array([[1, 2], [3, 4], [5, 6]])
display(n)
# 按列求平方和,形状为 (n,)
temp = np.sum(x ** 2, axis = 0,)
display(temp)
# 将 temp 扩展为 m × n 的矩阵
m, n = x.shape
weights = np.tile(temp, (m, 1)) # 重复 m 次,形状为 (m, n)
display(weights)
# 元素级相乘并与 x 的转置相乘
matrix = (weights * x) @ x.T # 矩阵乘法,得到 m × m 矩阵
display(matrix)
# 执行 SVD
W, s, v = np.linalg.svd(matrix)
# 输出结果
print("W (左奇异向量):", W)
print("s (奇异值):", s)
print("v (右奇异向量):", v.T) # 注意 v 是转置形式,与 MATLAB 一致
总结
无监督学习的定义
- 无监督学习是指在数据集中没有标签(或标签未知)的情况下,算法需要从数据中自动发现结构或模式。
- 与监督学习不同,监督学习中每个数据点都有已知标签,而在无监督学习中,数据没有标注或所有标签相同。
聚类算法(Clustering)
- 无监督学习中一个常见的任务是聚类,即将数据集自动分成不同的组或簇。
鸡尾酒问题是一种经典的盲信号分离(Blind Source Separation, BSS)问题。
补充:无监督学习还有一类:
密度估计 (Density Estimation) 或 维度约简 (Dimensionality Reduction)
这类问题旨在发现数据的内在结构或简化数据的复杂度。例如,主成分分析(PCA) 就是一种常见的维度约简方法,它通过线性变换将高维数据映射到低维空间,保留尽可能多的原始数据的变异性。
应用例子:
- 数据降维,简化特征的数量但保留数据的主要信息。
- 在高维数据中找到数据的潜在结构,便于可视化和分析。