第
3
章
无监督学习 
在监督学习中,我们使用带有标注的训练样本来训练模型。这些标注往往
需要人工给出。如果没有这些标注,或者没有训练样本,我们是否还能够从数
据中学习? 此外,是否能够自动生成样本的标注? 
在这些情况下,我们可以考虑使用无监督学习方法。所谓的无监督学习
(unsupervisedlearning),是一种从无标注数据中进行学习、发掘数据中隐藏结
构的学习范式。
无监督学习中的一个常见任务是聚类(clustering)。聚类是指将数据集中
相似的样本划分到同一个群组(cluster)中,如同“物以类聚,人以群分”。例如, 
在图书馆中我们将学科领域相同或相近的图书摆放在同一排书架上,这个过程
就可以看作是聚类。在这个例子中,每一本图书是一个样本,每一排书架是一
个群组。聚类就是将每一个样本都对应到一个群组中,使得同一群组中的样本
都是在某种程度上相似的样本。
那么,如何进行聚类? 一个常见的聚类方法为k 均值(k-means)。
3.1 k 均值
k 均值在名称上与k 近邻相像。二者之间的相同之处是,k 均值方法也使
用两个样本的输入特征在欧几里得空间中的距离来度量两个样本之间的相似
程度。但不同的是,k 近邻完成的是分类任务,借助于带有类别标注的训练样
本,来预测无标注样本的类别;而k 均值完成的是聚类任务,将一批无标注样本
“自动”划分成多个群组。
3.1.1 k 均值聚类
在聚类中,我们把一定数量的样本(m 个样本)划分成若干个群组,使得每
个群组中的样本都“比较相似”。那么,究竟划分为多少个群组“比较恰当”? 不
同的聚类方法给出的答案不同。在k 均值中,将样本划分成k 个群组,k 是使用
该方法之前需要给出的超参数。
当已知群组数量k 时,我们可将聚类问题描述为:输入m 个样本的输入特
征x(1),x(2),…,x(m),输出k 个样本集合G1,G2,…,Gk 。其中,x(i) =

第3章 无监督学习1 15 
(x1(i),x2(i),…,x(i) d )T,d 为输入特征的维数,x1(i) 表示第i 个样本的第1个特征,(·)T 表
示矩阵的转置,i∈{1,2,…,m },2≤k≤m -1。
接下来的问题是,如何用公式描述同一群组中的样本都“比较相似”? 其中一类办法
是,使用样本之间的欧几里得距离来度量样本之间的相似程度。
.................................................................................. 
........ 
.................................................................................. 
........ 
想一想 有哪些可用来度量同一群组中样本相似程度的基于欧几里得距离的
指标? 
我们可以认为,如果两个样本在欧几里得空间中距离比较接近,那么这两个样本“比
较相似”。如果我们希望同一群组中的样本都“比较相似”,那么这些样本之间的欧几里得
距离都应该较小。如何度量这些样本之间在欧几里得距离上的接近程度? 我们既可以用
群组中任意两个样本之间距离的最大值来度量该群组样本之间的接近程度,也可以用群
组中任意两个样本之间的平均距离来度量。样本x(i)到群组Gj中所有样本的平均距离可
表示为
1 |Gj|Σm 
l=1 ‖x(i)-x(l)‖2[x(l) ∈ Gj] 
式中,‖·‖2 表示.2 范数,‖x(i)-x(l)‖2= (x1(i)-x1(l))2+(x2(i)-x2(l))2+…+(x(i) d -x(l) d )2 ; 
|Gj|表示群组Gj中的样本数量;i∈{1,2,…,m },j∈{1,2,…,k};这里的方括号仍为艾佛
森括号,即
[x(l) ∈ Gj]= 1, 若x(l) ∈ Gj 
0 若x(l) . Gj { 
如果我们用平均距离来作为度量指标,那么很自然地我们希望所有样本到其群组中
所有样本平均距离的平均值最小,以使每个群组中的样本都尽可能“相似”,即
minimize x(i)∈Gj 
1 mΣm 
i=1 Σk 
j=1[x(i) ∈ Gj] 1 |Gj|Σm 
l=1 ‖x(i)-x(l)‖2[x(l) ∈ Gj] (3-1) 
我们希望通过调整将样本划分至不同的群组,来最小化式(3-1)中目标函数的值。
为此,首先考查
1 |Gj|Σm 
l=1 ‖x(i)-x(l)‖2[x(l) ∈ Gj]= 1 |Gj|Σm 
l=1 ‖(x(i)-x(l))[x(l) ∈ Gj]‖2 
≥ 1 |Gj|Σm 
l=1 (x(i)-x(l))[x(l) ∈ Gj]2 
= 1 |Gj||Gj|x(i)- 1 |Gj|Σm 
l=1
x(l)[x(l) ∈ Gj]2 
= x(i)- 1 |Gj|Σm 
l=1
x(l)[x(l) ∈ Gj]2 
= ‖x(i)-cj‖2 
(3-2) 
式(3-2)中,cj 为
cj = 1 |Gj|Σm 
l=1
x(l)[x(l) ∈ Gj]= 1 |Gj|Σx∈Gj
x (3-3)

1 16 机器学习原理与实践(微课版) 
即cj 为第j 个群组Gj中所有样本输入特征的算术平均值,因此cj 是群组Gj的形心
(centroid),j∈{1,2,…,k}。根据式(3-2)可将式(3-1)写为
minimize x(i)∈Gj 
1 mΣm 
i=1 Σk 
j=1[x(i) ∈ Gj] 1 |Gj|Σm 
l=1 ‖x(i)-x(l)‖2[x(l) ∈ Gj] 
=minimize x(i)∈Gj 
1 mΣm 
i=1 Σk 
j=1[x(i) ∈ Gj]‖x(i)-cj‖2 (3-4) 
式(3-4)中的目标函数1 mΣm 
i=1 Σk 
j=1[x(i)∈ Gj]‖x(i)-cj‖2 表示m 个欧几里得距离
(即.2 范数)的平均值。如果c1,c2,…,ck 保持不变,那么最小化其中的每一个距离,都有
助于最小化该目标函数。当c1,c2,…,ck 保持不变时,由式(3-4)可得
min x(i)∈Gj 
1 mΣm 
i=1 Σk 
j=1[x(i) ∈ Gj]‖x(i)-cj‖2 =1 mΣm 
i=1 min x(i)∈Gj Σk 
j=1[x(i) ∈ Gj]‖x(i)-cj‖2 
=1 mΣm 
i=1 min j∈{1,2,…,k}‖x(i)-cj‖2 (3-5) 
也就是说,此时对所有的i∈{1,2,…,m }都最小化式(3-6)中目标函数的值,就可以
使式(3-4)中目标函数的值最小。
min j∈{1,2,…,k}‖x(i)-cj‖2 (3-6) 
亦即,将每一个样本x(i)都划分至形心距其最近的群组,i=1,2,…,m ,就可以使式
(3-4)中目标函数的值最小。
j* = argmin j∈{1,2,…,k}‖x(i)-cj‖2 (3-7) 
式(3-7)中,j* 为形心距离样本x(i)最近的群组的索引。注意到如果将式(3-7)中的
.2 范数‖·‖2 替换成.2 范数的平方‖·‖22,并不会影响计算结果,而且还可以省掉根
号运算,有助于减少运算量。因此,我们用.2 范数的平方来替代.2 范数,即
j* = argmin j∈{1,2,…,k}‖x(i)-cj‖22 (3-8) 
然而,当按照式(3-8)把所有样本都重新划分至新的群组之后,这些群组的形心可能
会发生变化,因为形心是群组中所有样本输入特征的算术平均值,群组中的样本发生了变
化,形心也可能发生变化。很自然地,我们会想到重新计算各个群组的形心。那么,如果
我们用新计算出来的形心覆盖掉之前已有的形心,会起到什么作用? 
此时,我们是在保持样本与群组之间对应关系不变的情况下,来调整式(3-4)中的
c1,c2,…,ck ,以使式(3-4)中目标函数的值最小,即
minimize c1,c2,…,ck 
1 mΣm 
i=1 Σk 
j=1[x(i) ∈ Gj]‖x(i)-cj‖2 (3-9) 
在这种情况下,式(3-9)中的目标函数是凸函数。因此,由式(3-9)给出的最优化问
题在目标函数梯度为零处取得全局最优解。为了便于求解该最优化问题,人们将
式(3-9)中的.2 范数‖·‖2 同样替换成.2 范数的平方‖·‖22,尽管这样做求得的解与
式(3-9)的解很多情况下并不相同,即
minimize c1,c2,…,ck 
1 mΣm 
i=1 Σk 
j=1[x(i) ∈ Gj]‖x(i)-cj‖22 (3-10)

第3章 无监督学习1 17 
若令J(c1,c2,…,ck)=1 mΣm 
i=1 Σk 
j=1[x(i) ∈ Gj]‖x(i)-cj‖22,则有
.J(c1,c2,…,ck) 
.cj 
=2 mΣm 
i=1 (cj -x(i))[x(i) ∈ Gj]=0 (3-11) 
式(3-11)中,j=1,2,…,k。由式(3-11)可解出
cj = 1 |Gj|Σm 
i=1
x(i)[x(i) ∈ Gj] (3-12) 
式(3-12)中,j=1,2,…,k。由此可见,当c1,c2,…,ck 为各群组的形心时,式(3-10) 
中目标函数的值最小。所以,上述问题的答案是,如果我们用新计算出来的形心覆盖掉之
前已有的形心,实际上是在最小化式(3-10)中目标函数的值。因此,在某种意义上这样
做也有助于最小化式(3-4)中目标函数的值。
同样,在重新计算出各个群组的形心之后,又需要根据新的形心来将各个样本划分至
新的群组。如此循环下去,直到式(3-4)中目标函数的值不再显著减小,即收敛。
那么,为什么式(3-4)中目标函数的值会收敛? 如前所述,上述两步迭代中的每一步
都试图在现有条件下最小化式(3-4)中的目标函数。因此从直觉上看,式(3-4)中目标函
数的值大体上将会随着循环次数的增加而减小,直到不再显著减小。当样本与群组之间
的对应关系不再发生改变时,群组的形心不再发生变化,式(3-4)中目标函数的值也不再
发生变化。所以,当样本与群组之间的对应关系不再变化时,我们可认为式(3-4)中目标
函数的值收敛。
接下来的问题是,在收敛之后,我们会得到全局最优解吗(使目标函数的值全局最小
的样本与群组之间的对应关系)? 由于式(3-4)给出的最优化问题,并不是凸优化问题, 
因此不能保证收敛后得到全局最优解。所以,k 均值的聚类结果仍会受到初始值的影响。
综上所述,k 均值聚类方法如下。
【k 均值聚类方法】
输入:m 个样本的输入特征x(1),x(2),…,x(m);群组的数量k。
输出:m 个样本与k 个群组的对应关系(也可为k 个群组的形心c1,c2,…,ck)。
(1)初始化k 个群组的形心c1,c2,…,ck 。尽管我们可以用随机值来初始化,但是由
于初始值对聚类结果有影响,常见的做法是:从m 个样本中随机取k 个样本,将这k 个
样本的输入特征分别作为c1,c2,…,ck 的初始值。
(2)重复如下两步迭代,直到满足停止条件。停止条件可以是:各个样本与群组之
间的对应关系不再发生改变。
① 按照式(3-8)将m 个样本分别划分至k 个群组之一。
② 按照式(3-3)更新k 个群组的形心c1,c2,…,ck 。
当然,在上述迭代的第一步中,也可以只将一个样本划分至k 个群组之一,这样在第
二步中只需更新发生了变化的两个群组的形心。这种做法通常可以更早收敛,并且更便
于实现。
3.1.2 k 值与轮廓系数
k 均值方法最初被用于向量量化(vectorquantization)。向量量化是指用码本中的k

1 18 机器学习原理与实践(微课版) 
个既定码字(向量)之一来替换一个输入向量。码本中的k 个码字就是通过k 均值聚类得
到的k 个群组的形心。因此,向量量化就是将输入向量替换为距离其最近的形心向量的
过程。在向量量化中,k(码本中码字的数量)是训练码本时人工给出的值,通常为2的整
数次幂,例如64、256等。
但是在一些其他应用里,我们事先并不清楚聚为多少个类“比较适合”,即不知道k 
的取值。如何找到“适合”的k 值? 
由于k 是k 均值的超参数,我们可以通过多次尝试来确定一个“比较适合”的k 值。
那么,什么是“比较适合”? 如何度量? 这涉及另外一个问题:如何评价聚类的结果? 如
果聚类的结果较好,那么就可以认为当前k 的取值“比较适合”。
在无监督学习中,我们使用的数据集通常不带有标注数据,无法像在监督学习中那样
通过比较预测值与标注之间的差距来评估模型的性能。因此,很多时候我们只好从对聚
类的预期入手,通过度量聚类结果与我们预期结果之间的差距,来评估聚类结果。例如, 
我们希望聚类结果中同群组的样本之间距离较近,而不同群组的样本之间距离较远。一
个相关的度量指标是轮廓系数(silhouettecoefficient),其定义为
s(i) j = 
b(i) j -a(i) j 
max(a(i) j ,b(i) j ) (3-13) 
式(3-13)中,s(i) j 为第i 个样本(在第j 个群组中)的轮廓系数;max(a(i) j ,b(i) j )表示取
a(i) j 和b(i) j 两个数中的较大者;a(i) j 为第i 个样本到其所在群组Gj中所有其他样本的距离
的平均值,a(i) j ≥0;b(i) j 为第i 个样本到距其最近的另一个群组中所有样本的距离的平均
值,b(i) j ≥0,即
a(i) j = 1 |Gj|-1Σm 
l=1 ‖x(i)-x(l)‖2[x(l) ∈ Gj] (3-14) 
b(i) j = min h=1,2,…,k;h≠j 
1 |Gh|Σm 
l=1 ‖x(i)-x(l)‖2[x(l) ∈ Gh] .
è .
.
. ÷ 
(3-15) 
可见,轮廓系数s(i) j 的取值范围为[-1,1]。当s(i) j >0时,表明当前样本与其所在群
组中的其他样本更为“相似”,聚类方法将其划分至了“正确”的群组;当s(i) j <0时,表明当
前样本与另一个群组中的样本更为“相似”,更应该被划分至另一个群组,聚类方法将其划
分至了“错误”的群组。
为了用一个标量数值来作为聚类结果的评价指标,我们对m 个样本的轮廓系数做算
术平均,将该平均值记为s-,则有
s- =1 mΣm 
l=1 Σk 
j=1
s(i) j [x(i) ∈ Gj] (3-16) 
综上,我们可使用平均轮廓系数s- 来评价k 均值聚类结果。当k 值未知时,可以尝
试使用不同的k 值进行聚类并分别计算平均轮廓系数,然后选取最大的平均轮廓系数对
应的k 值,作为“适合”的k 值。
3.1.3 k 均值实践
在本节中,我们编程实现k 均值聚类方法,并使用第2章中多分类任务的轮椅数据集

第3章无监督学习119(不包括其中的标注)以及平均轮廓系数,来评价k均值聚类。
●●实验3-1实现k均值聚类,并观察其在轮椅数据集上的聚类结果。更改随机种子
后再次观察聚类结果。
.................................................................................. 提示:①可对输入特征做特征缩放;②由于轮椅数据集中包含4个类别的样本, 
所以k均值聚类中的k值可取4;③既可使用多重循环的方式,又可使用矩阵形式实现
k均值聚类;④在多个相邻整数中以相同的概率随机抽取一个或多个可使用rng.integers() 
方法;⑤可能会用到np.copy ()、np.expand_dims ()、np.array_equal()等函数;⑥如果对
编写实验程序没有任何思路、无从下手,可参考3.4节。
.................................................................................. 
如果对照轮椅数据集中的标注,可以看出k均值聚类为各个样本分配的群组的序
号,比较接近于样本的类别标注。如果更改随机种子的值,聚类的结果将有所不同。
●●实验3-2计算实验3-1中k均值聚类的平均轮廓系数,并画出不同k值下的平均
轮廓系数。
.................................................................................. 提示:计算向量之间的欧几里得距离(范数)可使用np.linalg.norm()函数。
.................................................................................. 
图3-1示出了当2≤k≤10、随机种子为11时的平均轮廓系数。从图3-1中可以看
出,平均轮廓系数为正数,表明大体上
k 
均值将样本划分至了“正确”的群组。更改随机
种子的值,观察平均轮廓系数的变化。可以看出,平均轮廓系数受随机种子的影响较大, 
这表明形心的初始值对聚类结果有较大影响。


图3-
1 
不同
k 
值下的平均轮廓系数

3.主成分分析
2 

除了聚类,无监督学习中的另一个常见任务是降维(dimensionalityreduction)。顾名
思义,降维是指把较高维的数据转换为较低维的数据,去除原数据中的冗余与噪声,在减


1 20 机器学习原理与实践(微课版) 
少数据量的同时尽量保留原数据的主要特性。例如,当我们用摆放在同一间教室内4个
角落上的4个温度传感器的读数来预测教室内讲台处的室温时,预测模型的输入为由同
一时刻4个温度传感器的读数组成的四维向量,显然这种情况下模型的输入数据中存在
冗余,可使用降维方法降低输入数据的维数,例如从四维降至一维。
降维方法可分为线性方法及非线性方法。一种常见的线性降维方法是主成分分析
(principalcomponentanalysis,PCA)。主成分分析是指计算数据中的“主要成分”,也是
一种特征提取(featureextraction)方法。
3.2.1 主成分分析降维
从直觉上看,如果把较高维的数据转换为较低维的数据,可能会损失数据中包含的一
部分信息。因此,我们希望在转换过程中损失的信息越少越好,以便最大程度地保留数据
中包含的信息。
我们知道,熵是用来描述随机变量取值不确定程度的度量指标。我们可以把数据集
中样本的每维输入特征都看作一个随机变量。对于一个具有m 个样本、d 维输入特征的
数据集来说,共有d 个随机变量。每个随机变量的熵越大,代表每维输入特征所包含的
信息量越大。特别地,对于零均值正态分布的连续随机变量来说,其微分熵(differential 
entropy)是其方差的单调递增函数,即方差越小,微分熵越小。如果每维输入特征都服从
均值为零的正态分布,并且各维输入特征之间都不相关,那么我们去掉方差最小的随机变
量所对应的这维输入特征,就可以使降维过程中减少的信息量最小。去掉数据集中样本
的部分输入特征的过程就是一种降维。
至此,我们已经得到了一种降维方法。但是,在上述降维过程中,我们不仅假设各维
输入特征都服从零均值正态分布,而且假设各维输入特征之间都不相关。在机器学习中, 
我们经常假设各维输入特征都服从正态分布,这是因为根据中心极限定理(centrallimit 
theorem,CLT),许多个独立同分布随机变量之和趋近于正态分布,因此,自然界中的很
多随机变量都服从正态分布,例如同质人群的身高。对于均值不为零的正态随机变量,我
们只需要减去其样本平均值即可得到均值近似为零的正态随机变量,因为样本平均值是
随机变量均值的无偏估计量。然而,在机器学习中,数据集中样本的各维输入特征之间都
不相关是一种较为理想的假设,很多时候各维输入特征之间或多或少存在相关性。例如, 
在气温数据集中,在某大都市A 点处传感器采集的气温数据,与同一时刻在该大都市B 
点处传感器采集的气温数据之间存在相关性。那么,在这种情况下该如何降维? 
如果我们能从数据集中提取出一组新的各维不相关的样本输入特征,就可以继续使
用上述降维方法来进行降维。我们知道,如果两个随机变量X1、X2 的皮尔逊相关系数
ρX1,X2 = E((X1-X - 
1)(X2-X - 
2)) 
σX1σX2 =0,即E((X1 -X - 
1 )(X2 -X - 
2 ))= E(X1X2 )- 
E(X1)E(X2)=0,那么这两个随机变量不相关,即二者之间不存在线性关系。其中
E(·)代表取期望值,X - 
1、X - 
2 分别是随机变量X1、X2 的均值,E((X1-X - 
1)(X2-X - 
2)) 
是随机变量X1、X2 的协方差(covariance)。更一般地,对于d 个随机变量X1,X2,…,Xd

第3章 无监督学习1 21 
来说,如果在其d×d 大小的协方差矩阵中,除主对角线上的元素之外,其余元素都为0, 
即式(3-17)成立,那么这d 个随机变量之间都不相关。
C= 
E((X1-X- 
1)(X1-X- 
1)) E((X1-X- 
1)(X2-X- 
2)) … E((X1-X- 
1)(Xd -Xd)) 
E((X2-X- 
2)(X1-X- 
1)) E((X2-X- 
2)(X2-X- 
2)) … E((X2-X- 
2)(Xd -Xd)) 
. . . . 
E((Xd -Xd)(
X1-X- 
1)) E((Xd -Xd)(
X2-X- 
2)) … E((Xd -Xd)(
Xd -Xd)) 
.
è
...... 
.
.
÷÷÷÷÷÷ 
= 
E((X1-X- 
1)2) 0 … 0 
0 E((X2-X- 
2)2) … 0 
. . . . 
0 0 … E((Xd -Xd)
2) 
.
è
...... 
.
.
÷÷÷÷÷÷ 
(3-17) 
式(3-17)中,X - 
1,X - 
2,…,X - 
d 分别是随机变量X1,X2,…,Xd 的均值。因此,如果我
们能从数据集中提取出一组新的输入特征,满足式(3-17),那么这些输入特征之间就都
不相关。如何提取这组新的输入特征? 
先考虑如何计算协方差矩阵。如果随机变量X1,X2,…,Xd 的均值都为0,则
式(3-17)成为
C = 
E(X1X1) E(X1X2) … E(X1Xd) 
E(X2X1) E(X2X2) … E(X2Xd) 
. . . . 
E(XdX1) E(XdX2) … E(XdXd) 
.
è
..... 
.
.
÷÷÷÷÷
= 
E(X1X1) 0 … 0 
0 E(X2X2) … 0 
. . . . 
0 0 … E(XdXd) 
.
è
..... 
.
.
÷÷÷÷÷ 
(3-18) 
若数据集中有m 个样本,样本输入特征的维数为d,且每维输入特征的均值都是0, 
那么可通过下式计算协方差矩阵: 
C = 1 m -1XXT (3-19) 
式(3-19)中,C ∈ Rd×d ;X 为数据集中的样本组成的矩阵,X ∈ Rd×m ,X 由式(2-22) 
给出。式(3-19)中的除数是m - 1 而不是m ,是因为方差的无偏估计量为
1 m -1Σm 
i=1 (x(i)-x-)2,其中,x- =1 mΣm 
i=1
x(i)。由式(3-18)可以看出C=CT,即协方差矩阵
C 是对称矩阵。对称矩阵可以被正交矩阵(orthogonalmatrix)对角化,即存在一个正交
矩阵Q,使得
Q-1CQ=Λ 
其中,Q-1为矩阵Q 的逆矩阵;Λ 为对角矩阵,即非主对角线上的元素都是0。把式
(3-19)代入上式可得
1 m -1Q-1XXTQ=Λ

1 22 机器学习原理与实践(微课版) 
又因为Q 为正交矩阵,Q-1=QT,因此有
1 m -1(QTX)(QTX)T =Λ (3-20) 
若令
X~ 
=QTX (3-21) 
式(3-21)中,X ~ 
∈Rd×m ,那么由式(3-19)和式(3-20)可得
C ~ 
= 1 m -1X ~ 
X ~
T= 1 m -1(QTX)(QTX)T=Λ 
即X ~
的协方差矩阵C ~
是对角矩阵。也就是说,X ~
中的各维输入特征之间都不相关。因
此,X ~
就是我们想要求得的具有不相关输入特征的m 个样本的输入特征矩阵。在求得X ~ 
后,就可以按照如前所述的降维方法对X ~
进行降维。这种降维方法就是主成分分析降
维。由于Q 是正交矩阵,式(3-21)可以理解为X 经过旋转(或反射、旋转反射)得到X ~ 
。
综上所述,主成分分析降维方法如下。
【主成分分析降维方法】
输入:m 个样本的d 维输入特征x(1),x(2),…,x(m)。
输出:m 个样本的d~
维新输入特征x≈(1),x≈(2),…,x≈(m),d~ 
≤d。
(1)零均值化。将输入的各个样本的输入特征x(1),x(2),…,x(m)减去其样本平均
值,即
x(i):=x(i)-1 mΣm 
j=1
x(j) (3-22) 
式(3-22)中,“:=”表示赋值;i=1,2,…,m 。
(2)按照式(3-19)计算协方差矩阵C。
(3)通过特征分解(eigendecomposition)求协方差矩阵C 的d 个特征值及对应的特
征向量,并将它们按照特征值从大到小的顺序进行排列:λ1 为最大的特征值,q1 为λ1 对
应的特征向量;λd 为最小的特征值,qd 为λd 对应的特征向量。q1,q2,…,qd 就是矩阵Q 
的d 个列向量,λ1,λ2,…,λd 就是对角矩阵Λ 主对角线上的d 个元素。
(4)取前d~
个特征值对应的特征向量q1,q2,…,qd~ 作为列向量,组成矩阵Q ~ 
,Q ~ 
∈ 
Rd×d~ 。并参照式(3-21)计算矩阵X ≈ ,X ≈ 
=Q ~
TX,X ≈ 
∈Rd~×m 。X ≈ 
=(x≈(1),x≈(2),…,x≈(m))为
待输出的m 个d~
维样本输入特征x≈(1),x≈(2),…,x≈(m)组成的矩阵。
至此,我们得到降维后的m 个样本的新输入特征x≈(1),x≈(2),…,x≈(m),从而完成降维
任务。需要说明的是,降维后的各维新输入特征的均值仍是0。
那么,如何确定d~ 的值? 至少有以下3种办法:① 人工指定d~ 
的值,选择前d~ 
个较大
的特征值,或根据系统需求确定d~ 
的值;② 选择使前d~ 
个特征值之和足够大的d~ 
值,即满
足Σd~ 
j=1
λj 
Σd 
j=1
λj 
≥α 的最小d~ 
值,α 为预设门限,0<α <1,例如取α=0.9;③ 结合后续的回归、

第3章 无监督学习1 23 
分类、聚类等模型,选择使后续模型性能较好的d~ 
值。
上述降维过程用到了协方差矩阵的特征分解。是否还有其他办法可以从数据集中提
取出新的各维不相关的输入特征,以满足式(3-18)? 
考虑到特征分解仅适用于包括实对称矩阵在内的正规方阵,而奇异值分解(singular 
valuedecomposition,SVD)可用于任何复矩阵,比特征分解更具有普遍性。因此,我们尝
试对样本的输入特征矩阵X 做奇异值分解。通过奇异值分解,X 可被分解为3个矩阵之
积,即
X=UΣVT 
其中,U、V 为正交矩阵,即UT=U-1,VT=V-1,U∈Rd×d ,V∈Rm ×m ;Σ 为(矩形)对角
矩阵,Σ∈Rd×m 。若令
X~ 
=UTX (3-23) 
可知X ~ 
∈Rd×m ,则由式(3-19)可得
C~ 
= 1 m -1X~ 
X~ 
T = 1 m -1(UTX)(UTX)T = 1 m -1UTXXTU = 1 m -1UT(UΣVT)(UΣVT)TU 
= 1 m -1UTUΣVTVΣTUTU = 1 m -1U-1UΣV-1VΣTU-1U = 1 m -1ΣΣT (3-24) 
由于Σ 为d×m 对角矩阵,式(3-24)中的ΣΣT 为d×d 对角矩阵。也就是说,X ~
的
协方差矩阵C ~
为对角矩阵,因此X ~
中的各维输入特征之间都不相关。X ~
就是我们想要求
得的具有不相关输入特征的m 个样本的输入特征矩阵。
可见,通过奇异值分解求X ~ 
,并不需要计算协方差矩阵C。此外,在降维任务中,通常
不必求得U 的所有列向量,因此可使用简化版的奇异值分解,例如紧SVD(compact 
SVD)、截尾SVD(truncatedSVD)等。所以人们常使用奇异值分解来进行主成分分析
降维。综
上所述,使用奇异值分解的主成分分析降维方法如下。
【使用奇异值分解的主成分分析降维方法】
输入:m 个样本的d 维输入特征x(1),x(2),…,x(m)。
输出:m 个样本的d~
维新输入特征x≈(1),x≈(2),…,x≈(m),d~ 
≤d。
(1)零均值化。将输入的各个样本的输入特征x(1),x(2),…,x(m)减去其样本平均值, 
见式(3-22)。
(2)使用奇异值分解求出d~
个最大的奇异值(即矩阵Σ 主对角线上的元素)σ1, 
σ2,…,σd~ 所对应的d~
个左奇异向量(即矩阵U 的列向量)u1,u2,…,ud~ ,组成矩阵U ~ 
, 
U ~ 
=(u1,u2,…,ud~ ),U ~ 
∈Rd×d~ 。
(3)参照式(3-23)计算矩阵X ≈ 
,X ≈ 
=U ~
TX,X ≈ 
∈Rd~×m 。X ≈ 
=(x≈(1),x≈(2),…,x≈(m))即为
待输出的m 个样本的d~
维输入特征x≈(1),x≈(2),…,x≈(m)组成的矩阵。

124机器学习原理与实践(微课版) 
3.2.2主成分分析实践
在本节中,我们分别使用特征分解和奇异值分解来实现主成分分析降维,并使用第2 
章中的气温数据集与线性回归模型来评价主成分分析降维。
●● 实验3-3使用特征分解实现主成分分析降维,并对第2章回归任务中的气温数据
进行降维。画出按降序排列的特征值。
.................................................................................. 提示:①对数据集中的五维气温数据进行降维;②计算对称矩阵的特征值与特
征向量,可使用np.linalg.eig() 或者np.linalg.eigh() 函数,后者返回的结果按特征值升序
排列,二者返回的特征向量略有差异。
.................................................................................. 
图3-2示出了由气温数据集中五维气温数据得到的特征值。从图中可以看出,在同
一城市的不同地点同时采集的气温数据,具有很强的相关性,数据之中存在较多的冗余, 
可以把这五维气温数据降至一维而不会减少太多的信息量。
图3-
2 
实验3-3中按降序排列的特征值

实验3-
4 
使用奇异值分解实现主成分分析降维,并对第2章回归任务中的气温数
据进行降维。画出按降序排列的奇异值。

.................................................................................. 
提示:①对数据集中的五维气温数据进行降维;②对矩阵做奇异值分解可使用

p.g.d() nlinalsv函数。

.................................................................................. 

图3-3示出了由气温数据集中五维气温数据得到的奇异值。从图中可以看出,就主
成分分析而言,奇异值之间按大小排列的顺序与特征值之间按大小排列的顺序相一致, 
们可以根据奇异值的大小排列顺序来依次选取用于降维的奇异向量。在主成分分析中,(我) 

按大小排列后的奇异值σj 
与按大小排列后的特征值λj 
之间的关系为λj 
=1 σ2 j= m-1j 
,

1,2,…,

d。


第3章无监督学习125
图3-3实验3-4中按降序排列的奇异值
●● 实验3-5使用气温数据集及线性回归评价主成分分析降维。将主成分分析降维
输出的降维后的输入特征,作为线性回归模型的输入特征,观察降维后的维数对线性回归
模型性能的影响,并与使用未降维输入特征的线性回归模型进行性能比较。
表3-1给出了线性回归模型在不同输入特征下的均方根误差(RMSE ) 。本实验中, 
我们仍将气温数据集中的前3000 个样本作为训练样本,后960 个样本作为测试样本;使
学习率为0.迭代次数为100 。从表31中可以看
用批梯度下降法训练线性回归模型,1, 
出,使用主成分分析对输入线性回归模型的气温数据进行降维,可以提高线性回归模型的
性能,即便降维后输入特征的维数为3;如果降维后输入特征的维数为2或者1,线性回归
模型性能的降幅不大,但是此时输入模型的数据量和相应的计算量都大为减小,体现出使
用主成分分析降维的优势。

表3-
1 
线性回归模型在不同输入特征下的均方根误差(RMSE) 

数据集
使用未经过降
维的输入特征
(d=4) 
使用降维后的
四维输入特征
(
d ~ 
=4) 
使用降维后的
三维输入特征
(
d ~ 
=3) 
使用降维后的
二维输入特征
(
d ~ 
=2) 
使用降维后的
一维输入特征
(
d ~ 
=1) 
训练数据集
RMSE 0.931 0.877 0.907 0.952 0.959 
测试数据集
RMSE 0.742 0.644 0.702 0.76 0.78 

3.自编码器
3 

主成分分析降维是一种线性降维方法,适用于对各维输入特征之间存在线性关系的
数据进行降维。如果使用线性降维方法得到的结果不及预期,或者知道各维输入特征之
间不存在线性关系,可以考虑使用非线性方法对数据进行降维,例如使用自编码器
(autoencoder)。


126机器学习原理与实践(微课版) 
3.3.1什么是自编码器
由于降维过程将较高维的输入特征映射为较低维的输入特征,故可以看作是一种定
长数据压缩编码过程。因此,如果我们能够自动地对输入特征进行有效的“压缩编码”,也
能实现降维。
所谓自编码器,指的是一类特殊的人工神经网络。最基本的自编码器是一种前馈神
经网络,如图3-4所示,其主要特点是输出层节点的数量等于输入层节点的数量(偏差对
应的常数1节点不计算在内), 并且最中间隐含层节点的数量通常小于输入层和输出层节
点的数量。自编码器可以有一个或多个隐含层,最中间的隐含层被称为码字层(code 
layer), 因为该层节点的输出即为自编码器输出的编码后的码字。可见,在自编码器中, 
真正的编码输出层是“码字层”,而不是“输出层”,这与前馈神经网络有所不同。自编码器
的输入层节点、隐含层节点、输出层节点与前馈神经网络相同。
图3-
4 
基本的自编码器

那么,自编码器为什么能够“自动编码”? 这不仅归因于其具有相同数量的输入层节
点和输出层节点,也归因于码字层节点的数量少于输入层和输出层节点的数量,起到了
“压缩数据”的作用,还归因于我们训练构成自编码器的神经网络学习预测样本的输入特
征。也就是说,在训练过程中,我们使用构成自编码器的包括输入层、隐含层、输出层在内
的前馈神经网络,来完成监督学习中的回归任务或(分类任务), 将待降维数据集中样本的
输入特征作为该神经网络的输入,同时也将该输入特征作为样本的标注,让神经网络学习
根据输入特征来预测输入特征。这个做法看上去莫名其妙、多此一举,既然已知输入特
征,为何还要预测它们? 这是因为自编码器真正的输出层是码字层(也是隐含层), 输出层
输出的预测值具体为多少并不重要,重要的是我们希望通过使预测值尽量接近于标注,来
迫使码字层输出的码字(即降维后的输入特征)尽量对应降维前的输入特征。由于码字层
节点的数量少于输入层和输出层节点的数量,所以根据输入特征来准确预测输入特征在
很多时候并不是一件很容易做到的事情。


第3章 无监督学习1 27 
在自编码器中,我们可以将待降维的数据集划分为训练数据集和测试数据集,用训练
数据集训练自编码器模型,然后用测试数据集来评价该自编码器模型。如果我们仅需对
给定数据集中的样本进行降维,而无须泛化,那么也可以用数据集中的全部样本来训练自
编码器模型。在训练完成后,与神经网络不同的是,我们仅使用该自编码器模型的输入层
到码字层这部分模型,来对自编码器模型的输入特征进行降维,即在输入层输入待降维的
输入特征,然后经过正向传播,在码字层得到模型输出的码字,也就是降维后的输入特征。
3.3.2 自编码器的训练与降维
既然基本的自编码器也是前馈神经网络,我们可以参照前馈神经网络的训练方法来
训练基本的自编码器。
首先写出自编码器的正向传播过程。图3-4中,输入层和输出层节点的数量都为d, 
隐含层(码字层)节点的数量为d~ 
。d~
也是降维后的维数,是一个需要设置的超参数。根
据图3-4可以写出
x≈j =g[1](z[1] j )=g[1]((w[1] j )Tx +b[1] j )=g[1] Σd 
l=1
w [1] ljxl +b[1] ( j ) (3-25) 
x^k =g[2](z[2] k )=g[2]((w[2] k )Tx≈ +b[2] k )=g[2] Σd~ 
h=1
w [2] hkx≈h +b[2] ( k ) (3-26) 
式(3-25)和式(3-26)中,x≈j 为输入特征x 经过降维后得到的第j 维特征;g[1](·)为
隐含层的激活函数;z[1] j 为隐含层第j 个节点线性回归部分的输出;w[1] j 为隐含层第j 个
节点线性回归部分的权重,w[1] j ∈Rd×1,w[1] j =(w1[j1],w2[j1],…,w [1] dj )T,w [1] dj 为隐含层第j 
个节点的第d 维输入特征的权重;x∈Rd×1,x=(x1,x2,…,xd )T;b[1] j 为隐含层第j 个节
点线性回归部分的偏差;x^k 为自编码器对输入特征x 的第k 维特征的预测值;g[2](·)为
输出层的激活函数;z[2] k 为自编码器输出层第k 个节点线性回归部分的输出;w[2] k 为输出
层第k 个节点线性回归部分的权重,w[2] k ∈Rd~×1,w[2] k =(w1[k2],w2[k2],…,w [2] 
d~k)T,w [2] 
d~k 为输
出层第k 个节点的第d~
维输入的权重;x≈∈Rd~×1,x≈=(x≈1,x≈2,…,x≈d~ )T;b[2] k 为输出层第
k 个节点线性回归部分的偏差;j=1,2,…,d~ 
,k=1,2,…,d。
进一步地,把由式(3-25)给出的d~
维降维后的输入特征,以及由式(3-26)给出的d 
维输入特征的预测值各自组成一个列向量,则有
x≈ =g[1](z[1])=g[1]((W [1])Tx +b[1]) (3-27) 
x^=g[2](z[2])=g[2]((W [2])Tx≈ +b[2]) (3-28) 
式(3-27)和式(3-28)中,z[1]∈ Rd~×1,z[1]= (z1[1],z2[1],…,z[1] 
d~ )T;x^∈ Rd×1,x^= 
(^x1,^x2,…,^xd )T;z[2] ∈ Rd×1,z[2] = (z1[2],z2[2],…,z[2] d )T;b[1] ∈ R d~×1,b[1] = 
(b1[1],b2[1],…,b[1] 
d~ )T;b[2]∈Rd×1,b[2]=(b1[2],b2[2],…,b[2] d )T;W [1]∈Rd×d~ ,由式(3-29)给
出;W [2]∈Rd~×d ,由式(3-30)给出。

1 28 机器学习原理与实践(微课版) 
W [1]= 
w1[11] w1[12] … w [1] 
1d~ 
w2[11] w2[12] … w [1] 
2d~ 
. . . 
w [1] d1 w [1] d2 … w [1] 
dd~ 
.
è
.....
. 
.
.
÷÷÷÷÷
÷ 
(3-29) 
W [2]= 
w1[21] w1[22] … w1[d2] 
w2[21] w2[22] … w2[d2] 
. . . 
w [2] 
d~1 w [2] 
d~2 … w [2] 
d~d 
.
è
..... 
.
.
÷÷÷÷÷
(3-30) 
更进一步地,我们把数据集中m 个样本的d 维输入特征x(1),x(2),…,x(m)组成矩阵
X,X 由式(2-22)给出,X ∈Rd×m ,x(i)=(x1(i),x2(i),…,x(i) d )T,i∈{1,2,…,m }。为了便
于编程实现、减少程序运行时间,我们将m 个样本在隐含层输出的降维后的输入特征,以
及在输出层输出的输入特征的预测值,分别组成一个矩阵,则有
X≈ 
=g[1](Z[1])=g[1]((W [1])TX +b[1]v) (3-31) 
X^=g[2](Z[2])=g[2]((W [2])TX≈ 
+b[2]v) (3-32) 
式(3-31)和式(3-32)中,X ≈ 
∈Rd~×m ,由式(3-33)给出;X^∈Rd×m ,由式(3-34)给出; 
Z[1]∈Rd~×m ,由式(3-35)给出;Z[2]∈Rd×m ,由式(3-36)给出;v 仍为m 维元素都为1的
行向量,v∈R1×m ,即v=(1,1,…,1)。
X≈ 
= 
x≈1(1) x≈1(2) … x≈1(m) 
x≈2(1) x≈2(2) … x≈2(m) 
. 
x≈(1) 
d~ 
. 
x≈(2) 
d~ 
. 
… x≈(m) 
d~ 
.
è
...... 
.
.
÷÷÷÷÷÷ 
(3-33) 
X^= 
^x1(1) ^x1(2) … ^x1(m) 
^x2(1) ^x2(2) … ^x2(m) 
. 
x^(1) d 
. 
x^(2) d 
. 
… x^(m) d 
.
è
...... 
.
.
÷÷÷÷÷÷
(3-34) 
Z[1]= 
z1[1](1) z1[1](2) … z1[1](m) 
z2[1](1) z2[1](2) … z2[1](m) 
. 
z[1](1) 
d~ 
. 
z[1](2) 
d~ 
. 
… z[1](m) 
d~ 
.
è
...... 
.
.
÷÷÷÷÷÷
(3-35) 
Z[2]= 
z1[2](1) z1[2](2) … z1[2](m) 
z2[2](1) z2[2](2) … z2[2](m) 
. 
z[2](1) d 
. 
z[2](2) d 
. 
… z[2](m) d 
.
è
..... 
.
.
÷÷÷÷÷
(3-36)

第3章无监督学习129
在自编码器中, 我们希望样本输入特征的预测值X^ 尽量接近于样本输入特征X。由
于输入特征的取值通常为连续值, 所以可参照线性回归中的做法, 通过最小化均方误差代
价函数的值, 来求得隐含层和输出层的各个权重与偏差, 即
W[1 ] * ,b[1 ] * ,W[2 ] * ,b[2 ] * =ar g m in W[1 ] ,b[1 ] ,W[2 ] ,b[2 ] 
J(W[1 ] ,b[1 ] ,W[2 ] ,b[2 ] ) (3-3 7 ) 
式(3-3 7 ) 中,W[1 ] * 、b[1 ] * 、W[2 ] * 、b[2 ] * 分别为W[1 ] 、b[1 ] 、W[2 ] 、b[2 ] 的最优解。参照式
(2-1 4 ) , 自编码器中的均方误差代价函数可以写为
J(W[1 ] ,b[1 ] ,W[2 ] ,b[2 ] ) 1 md(x^ (i) (i) 1 m(x^ (i) (i) ) T (x^ (i) (i) )=mdΣi=1 Σk=1 
k-xk)=-x-x2 
mdΣi=1 
=1 mdΣim=1 (x^ -x) T (x^ -x) |x=x(i) (3-3 8 ) 
进一步写出式(3-3 8 ) 的矩阵形式为
J(W[1 ] ,b[1 ] ,W[2 ] ,b[2 ] ) =1 mdtr ( (X^ -X) T (X^-X) ) (3-3 9 ) 
式(3-3 9 ) 中,tr (A) 表示方阵A的迹, 即方阵A的主对角线上的元素之和。
我们知道, 在神经网络中, 随着层数的增加, 代价函数往往不是各层权重与偏差的凸
函数。不过我们仍然可以使用梯度下降法求解由式(3-3 7 ) 给出的最优化问题, 尽管不能
保证一定能得到全局最优解。在梯度下降法中, 需要用到代价函数对权重与偏差的偏导
数。为了简化计算式,
........
练一练求由式(3-38 ) 给出的代价函数对各层参数b[2]、W[2]、b[1]、W[1] 的偏
导数。

.. .... .. 

.... ...... .... .... .... .... ...... .... .... .... ...... .... .... .... ...... .... .... .... .. 

我们写出中间变量, 使用链式法则按照从输出层到输入层的顺序, 
逐层求代价函数对各层参数的偏导数。与神经网络相同, 自编码器中各层的激活函数
g[1](·)、g[2](·) 仍可使用ReLU 、sigmoid 等函数。在以下推导中, 我们以使用ReLU 

激活函数为例, 即g[1](z)= g[2](z)= g(z)=ma x(0,z)= z[z>0 ]、d g(z)=[z>0 ], 这

dz 
里的方括号为艾佛森括号。

.................................................................................. 

[2] [1] 
~ 
先求代价函数对b[2]、w、b[1]、w的偏导数,j=1,2,…,d,k=1,2,…,d。写出式
(3-38 ) 中的损失函数为
11 
d 
2 

k 
kj j 

L= 
(x^ -x)T(x^ -x) =
d 
Σ(x^ 
k 
-xk 
)(3-40 ) 

由此, 式(3-38 ) 成为
d 
k=1 

J(W[1],b[1],W[2],b[2]) 
= 
1 
m 
L|x=x(i) (3-41 )
m 
i=1 

由式(3-40 )、式(3-26 )、式(3-25 ) 可得Σ 

[2]
. L 
. 
L 
·. x^ 
k 
·. zk 
2(x^ 
k 
-xk 
)[z[2]>0] (3-42 )
k 
. x^ 
k 
.zk 
kd

.b[2] 
= 
[2] .b[2] =
k 

[2]
. 
L 
. 
L 
. x^ 
k 
.zk 
2 
k 
-xk 
)[z[2] ≈ 

[2] 
= 
· [2]· [2] 
= 
(x^ 
k 
>0]x(3-43 )
. wk 
. x^ 
k 
.zk 
. wkd 


1 30 机器学习原理与实践(微课版) 
.L 
.b[1] j 
=Σd 
k=1 
.L 
.x^k ·.x^k 
.z[2] k ·.z[2] k 
.x≈j ·.x≈j 
.z[1] j ·.z[1] j 
.b[1] j 
=Σd 
k=1 
2d
(x^k -xk)[z[2] k >0]w [2] jk [z[1] j >0] 
=2d
[z[1] j >0]Σd 
k=1(x^k -xk)[z[2] k >0]w [2] jk (3-44) 
.L 
.w[1] j 
=Σd 
k=1 
.L 
.x^k ·.x^k 
.z[2] k ·.z[2] k 
.x≈j ·.x≈j 
.z[1] j ·.z[1] j 
.w[1] j 
=Σd 
k=1 
2d
(x^k -xk)[z[2] k >0]w [2] jk [z[1] j >0]x 
=2d
[z[1] j >0]xΣd 
k=1(x^k -xk)[z[2] k >0]w [2] jk (3-45) 
式(3-44)和式(3-45)中,加入求和公式是因为x^1,x^2,…,x^d 都是b[1] j 、w[1] j 的函数; 
这里的方括号为艾佛森括号。根据式(3-41)可得
.J(W [1],b[1],W [2],b[2]) 
.b[2] k 
=1 mΣm 
i=1 
.L 
.b[2] k x=x(i) 
=1 mΣm 
i=1 
2d
(x^k -xk)[z[2] k >0]x=x(i) 
= 2 mdΣm 
i=1 (x^(i) k -x(i) k )[z[2](i) k >0] (3-46) 
.J(W [1],b[1],W [2],b[2]) 
.w[2] k 
=1 mΣm 
i=1 
.L 
.w[2] k x=x(i) 
=1 mΣm 
i=1 
2d
(x^k -xk)[z[2] k >0]x≈ 
x=x(i) 
= 2 mdΣm 
i=1 (x^(i) k -x(i) k )[z[2](i) k >0]x≈(i) (3-47) 
.J(W [1],b[1],W [2],b[2]) 
.b[1] j 
=1 mΣm 
i=1 
.L 
.b[1] j x=x(i) 
=1 mΣm 
i=1 
2d
[z[1] j >0]Σd 
k=1(x^k -xk)[z[2] k >0]w [2] jk 
x=x(i) 
= 2 mdΣm 
i=1 [z[1](i) j >0]Σd 
k=1(x^(i) k -x(i) k )[z[2](i) k >0]w [2] jk
(3-48) 
.J(W [1],b[1],W [2],b[2]) 
.w[1] j 
=1 mΣm 
i=1 
.L 
.w[1] j x=x(i) 
=1 mΣm 
i=1 
2d
[z[1] j >0]xΣd 
k=1(x^k -xk)[z[2] k >0]w [2] jk 
x=x(i)

第3章 无监督学习1 31 
= 2 mdΣm 
i=1 [z[1](i) j >0]x(i)Σd 
k=1(x^(i) k -x(i) k )[z[2](i) k >0]w [2] jk (3-49) 
进一步地,由式(3-46)~式(3-49)写出其向量或矩阵形式分别为
.J(W[1],b[1],W[2],b[2]) 
.b[2] = 2 md((X^-X)..[Z[2] >0])vT (3-50) 
.J(W[1],b[1],W[2],b[2]) 
.W[2] = 2 mdX≈ 
((X^-X)..[Z[2] >0])T (3-51) 
.J(W[1],b[1],W[2],b[2]) 
.b[1] = 2 md((W[2]((X^-X)..[Z[2] >0]))..[Z[1] >0])vT (3-52) 
.J(W[1],b[1],W[2],b[2]) 
.W[1] = 2 mdX((W[2]((X^-X)..[Z[2] >0]))..[Z[1] >0])T (3-53) 
以上4 式中,..表示阿达马积,即矩阵中的对应元素相乘;b[1]∈ Rd~×1,b[1]= 
(b1[1],b2[1],…,b[1] 
d~ )T;b[2]∈Rd×1,b[2]=(b1[2],b2[2],…,b[2] d )T;W [1]∈Rd×d~ ,由式(3-29)给
出;W [2]∈Rd~×d ,由式(3-30)给出;X ∈Rd×m ,由式(2-22)给出;X^∈Rd×m ,由式(3-34)给
出;X ≈ 
∈Rd~×m ,由式(3-33)给出;Z[1]∈Rd~×m ,由式(3-35)给出;Z[2]∈Rd×m ,由式(3-36) 
给出;v 仍为m 维元素都为1的行向量,v∈R1×m ,即v=(1,1,…,1)。
至此,根据式(3-50)~式(3-53)以及式(2-199),我们就可以使用批梯度下降法训练
上述基本的自编码器。在训练过程中如果需要代价函数的值,可按照式(3-39)计算。
在经过训练得到W [1]和b[1]参数之后,我们就可以根据式(3-31)求出降维后的输入
特征X ≈ 
,从而完成自编码器降维任务。式(3-31)中的激活函数同样为ReLU,即g[1](z)= 
max(0,z)=z[z>0]。
3.3.3 自编码器实践
在本节中,我们动手编程实现基本的自编码器,用该自编码器对螺旋线数据集进行降
helix_dataset 
维,并用第2章中的酒驾检测数据集与逻辑回归模型来评价自编码器降维。
在螺旋线数据集中,样本输入特征的维数为3,每个样本的三维输入特
征对应于三维空间中的一个点,数据集中所有样本的输入特征构成了三维
空间中的一条螺旋线。扫描二维码3-1可下载螺旋线数据集的Jupyter 
NotebookPython代码。
●实●验3-6 实现基本的自编码器,并用该自编码器对螺旋线数据集进行降维,画出
降维后的输入特征以及输入特征的预测值。
.................................................................................. 提示:可将该数据集中的所有样本都作为训练样本。
.................................................................................. 
当数据集中输入特征的偏移为2、降维后输入特征的维数为2、随机种子为1、学习率
为0.01、迭代次数为100000时,得到如图3-5(a)所示的降维后的二维输入特征,以及如
图3-5(b)中实线所示的输入特征预测值。图3-5(b)中的虚线为螺旋线,即降维之前的输

132机器学习原理与实践(微课版) 
入特征。可见,如果各个样本的输入特征在同一仿射映射下的各维输出值都是正数,那么
上述自编码器实际上是通过该仿射映射对输入特征降维,然后将降维后的输入特征再次
通过另一个仿射映射映射到降维之前的较高维空间中,从而得到输入特征的预测值,并在
这个较高维空间中,最小化输入特征与其预测值之间的欧几里得距离的平方之和(均方误
差代价函数) 。
图3-5实验3-6中降维后的输入特征以及输入特征的预测值(二维、偏移为2) 
当数据集中输入特征的偏移为0、降维后输入特征的维数为3(即未实际降维) 、随机
种子为1、学习率为0.01 、迭代次数为100000 时,得到如图3-6(a)所示的降维后的三维输
入特征,以及如图3-6(b)中实线所示的输入特征预测值。图3-6(b)中的虚线仍为螺旋
线,即降维之前的输入特征。可见,如果只有一部分样本的输入特征在同一仿射映射下的
输出值为正数,那么上述自编码器将仅使用这部分样本降维后的输入特征,来预测这部分
样本的输入特征,并在降维之前的较高维空间中,最小化这部分样本的输入特征与其预测
值之间的欧几里得距离的平方之和。


图3-
6 
实验3-6中降维后的输入特征以及输入特征的预测值(三维、偏移为0) 

实验3-
7 
使用实验3-6中的自编码器,对酒驾检测数据集中的输入特征进行降
维,并使用降维后的训练数据集来训练逻辑回归模型,观察逻辑回归模型在降维后的测试
数据集上的性能。


第3章无监督学习133
.................................................................................. 提示:仅使用训练数据集来训练自编码器。
.................................................................................. 
表3-2给出了逻辑回归模型在不同维数输入特征下的F1 值。这里,我们随机选取
(随机种子为1)酒驾检测数据集中的250 个样本作为训练样本,余下的134 个样本作为
测试样本,并对样本的输入特征做标准化;使用批梯度下降法训练自编码器和逻辑回归模
型,学习率分别为0.01 和0.1,迭代次数都为5000 。从表3-2中可以看出,当降维后的输
入特征的维数为2~4时,使用自编码器对该数据集进行降维,可使逻辑回归模型获得与
输入未降维输入特征时相仿的性能,即我们以更少的输入数据和更少的计算量获得了相
仿的性能,体现出使用自编码器降维的一定优势。
表3-2逻辑回归模型在不同维数输入特征下的F1值
数据集
使用未经过降
维的输入特征
(d=5) 
使用降为四维
后的输入特征
(d~
=4) 
使用降为三维
后的输入特征
(d~
=3) 
使用降为二维
后的输入特征
(d~
=2) 
使用降为一维
后的输入特征
(d~
=1) 
训练数据集
F1 值0.977 0.976 0.953 0.976 0.898 
测试数据集
F1 值0.992 0.968 0.984 0.984 0.824 
3.本章实验分析
4 

如果你已经独立完成了本章前3节中的各个实验,祝贺你,可以跳过本节学习。如果
未能独立完成,也没有关系,因为在本节中,我们将对本章中出现的各个实验做进一步分
析讨论。

实验3-
1 
实现
k 
均值聚类,并观察其在轮椅数据集上的聚类结果。更改随机种子
后再次观察聚类结果。

分析:可参考实验2-19 的程序,读取轮椅数据集,并对样本的输入特征做特征缩放。
可借助rnitges() 

g.ner方法为每个群组的形心随机分配一个样本的输入特征作为其初始
值。在
k 
均值聚类中,由于我们事先不知道收敛之前需要进行多少次循环,所以主循环
可使用while循环。在循环中的第一步,我们根据样本与各个群组形心之间的距离(或距
离的平方), 将每个样本都划分至一个距其最近的群组。为此,我们用一个数组来记录各
个样本对应的群组的序号。我们既可以按照式(3-8)通过for循环直接计算出各个样本
对应的群组序号,也可以用矩阵形式计算。如果用矩阵形式计算,可先将样本输入特征矩
阵(二维数组) p.xpn_i函数扩展至三维数组, to

通过neaddms() 然后使用Pyhn的广播操
作,计算出所有样本的输入特征向量与所有形心向量之差,然后据此计算出距离的平方, 
再将与每个样本输入特征相距最近(距离的平方最小)的形心所在的群组的序号作为该样
本所在的群组的序号,并保存在序号数组之中。由于我们根据样本与群组之间的对应关