西部世界 第二季 刚好放到第七集,课程总结也刚好是第七次。我们关于 监督学习 的课程已经告一段落,这次 Ng 将给我们介绍两个很常用的 无监督学习 算法。一个是用来将数据划分到不同类别的 k-means 算法,一个是用来提取重要特征并给特征降维的 PCA 算法。
点击 课程视频 你就能不间断地学习 Ng 的课程,关于课程作业的 Python 代码已经放到了 Github 上,点击 课程代码 就能去 Github 查看,代码中的错误和改进欢迎大家指出。
以下是 Ng 机器学习课程第七周的笔记。
聚类
我们经常会给事物做分类,把特征相近的东西归为一类。而 无监督学习 中的聚类正是想让计算机来完成这个工作。用数学语言表达就是要把每个特征数据
x
(
i
)
x^{(i)}
x(i) 分配到 簇
c
(
i
)
c^{(i)}
c(i) 中。让我们看下课程作业中的聚类任务来有个直观的感受。( 下图是将数据分为三个簇 )
代价函数
假设要将数据分到
k
k
k 个 簇,选取的中心分别为
μ
1
,
μ
2
,
.
.
.
,
μ
k
\mu_1,\mu_2,...,\mu_k
μ1,μ2,...,μk。我们的代价函数就是要将每个特征与被分配到的簇的中心之间的距离和最小化( 直观来说就是凑得近的分一起 )。
J
(
c
(
1
)
,
c
(
2
)
,
.
.
.
,
c
(
m
)
;
μ
1
,
μ
2
,
.
.
.
,
μ
k
)
=
1
m
∑
i
=
1
m
∣
∣
x
(
i
)
−
μ
c
(
i
)
∣
∣
2
J(c^{(1)},c^{(2)},...,c^{(m)};\mu_1,\mu_2,...,\mu_k)=\frac{1}{m}\sum_{i=1}^m||x^{(i)}-\mu_{c^{(i)}}||^2
J(c(1),c(2),...,c(m);μ1,μ2,...,μk)=m1i=1∑m∣∣x(i)−μc(i)∣∣2
可以看出 代价函数 一方面取决于
x
(
i
)
x^{(i)}
x(i) 的分配,一方面取决于 簇 中心的位置。
k-means
下面我们先来看下 k-means 的算法,然后来解释它是如何优化 代价函数 的。
随机选择 k k k 个 簇 的中心 μ 1 , μ 2 , . . . , μ k \mu_1,\mu_2,...,\mu_k μ1,μ2,...,μk
重复下面步骤直到收敛:
- 对于每个 x ( i ) x^{(i)} x(i),计算 c ( i ) c^{(i)} c(i) ( x ( i ) x^{(i)} x(i) 距离第 j j j 个簇的中心最近,则 c ( i ) = j c^{(i)}=j c(i)=j )
- 更新 μ k \mu_k μk ( 新 μ k \mu_k μk 为所有满足 c ( i ) = k c^{(i)}=k c(i)=k 的 x ( i ) x^{(i)} x(i) 的中心 )
对于步骤 1 1 1 来说,我们固定了 μ 1 , μ 2 , . . . , μ k \mu_1,\mu_2,...,\mu_k μ1,μ2,...,μk,并为每个 x ( i ) x^{(i)} x(i) 选取了距离最近的 簇,这使得 代价函数 减小。对于步骤 2 2 2,我们固定了 c ( 1 ) , c ( 2 ) , . . . , c ( m ) c^{(1)},c^{(2)},...,c^{(m)} c(1),c(2),...,c(m),并将 μ k \mu_k μk 移动到了各个分类的中心,这也使得 代价函数 减小。因此随着不断循环这个过程,我们将得到一个最优解( 也可能是局部最优 )。
相关问题
k-means 算法挺好理解的,最后我们来说说簇中心的初始化与
k
k
k 的选择问题。对于簇中心的初始化,一般直接随机选
k
k
k 个数据为中心,选比如说 100 次并计算 代价函数 的值,选择其中最小的那一次的结果。
对于
k
k
k 的选择,一方面可以运用 肘部法则,原理是 代价函数 一开始会随着
k
k
k 的增大下降的很快,但过了某个值之后下降变缓,我们选择这个点的
k
k
k 值。另一方面我们可以根据自己的业务需求来选择
k
k
k( 业务就是需要分为
k
k
k 个类的情况 )。
降维
在机器学习中,降低特征的维度能够给我们带来很多好处。首先降低特征的维度可以提升学习的效率。其次降维可以让我们的注意力集中在重要的特征上。再有降维也可以作为一种数据压缩的方法。这里将要学习的降维算法被称作 主成分分析( PCA )。
协方差
在统计学中,协方差 表现了两组数据之间的关联性( 当数据为同一个是就是 方差 )。为了了解 协方差 与降维算法的关系,我们先来看简单的二维情况。假设我们的数据有两个特征( 如图 ),并且已经做过 标准化。红色的数据点在这个坐标系下呈现出明显的先关性( 协方差 大 )。
由 线性代数 的知识可以知道,我们可以使用不同的 基 ( 特征 )来表示这些数据,如图中的绿色坐标和蓝色坐标。通过直觉可以发现如果将数据投影到较长的蓝色坐标上来降维是更为合适的选择。事实上这也是使得 协方差 最小的选择,协方差 的最小化让每个特征和其它特征的关系性降到最低,使得每个特征被独立地表达,而降维就是从中选出贡献( 方差 )比较大的特征。对于数据
X
X
X( 这里的
X
X
X 和课程作业中的不同,每列表示一个数据 ),特征间的 协方差 可以表示为 协方差矩阵。
C
=
1
m
X
X
T
=
1
m
[
∑
i
=
1
m
(
x
1
(
i
)
)
2
∑
i
=
1
m
(
x
1
(
i
)
x
2
(
i
)
)
∑
i
=
1
m
(
x
2
(
i
)
x
1
(
i
)
)
∑
i
=
1
m
(
x
2
(
i
)
)
2
]
C = \frac{1}{m} XX^{T} = \frac{1}{m} \begin{bmatrix} \sum\limits_{i=1}^{m}(x_1^{(i)})^2 & \sum\limits_{i=1}^{m}(x_1^{(i)}x_2^{(i)}) \\ \sum\limits_{i=1}^{m}(x_2^{(i)}x_1^{(i)}) & \sum\limits_{i=1}^{m}(x_2^{(i)})^2 \\ \end{bmatrix}
C=m1XXT=m1⎣⎢⎡i=1∑m(x1(i))2i=1∑m(x2(i)x1(i))i=1∑m(x1(i)x2(i))i=1∑m(x2(i))2⎦⎥⎤
协方差矩阵 对角线上的元素是数据在各个特征上的 方差,其余是特征之间的 协方差。于是降维的目标就成了找到一个基变换让 协方差矩阵 里除了对角线上的值,其余的都尽可能小。不过在下面的讨论中,我们会知道可以找到一组 基 使得变换后的 协方差 除了对角线上的值,其余都为 0。
SVD
假设我们的数据
X
X
X 通过基变换映射到了
Y
Y
Y,
Y
=
P
X
Y=PX
Y=PX,
Y
Y
Y 的 协方差
D
D
D 为:
D
=
1
m
Y
Y
T
=
1
m
(
P
X
)
(
P
X
)
T
=
1
m
P
X
X
T
P
T
=
P
(
1
m
X
X
T
)
P
T
=
P
C
P
T
\begin{array}{l l l} D & = & \frac{1}{m}YY^{T} \\ & = & \frac{1}{m}(PX)(PX)^{T} \\ & = & \frac{1}{m}PXX^{T}P^{T} \\ & = & P(\frac{1}{m}XX^{T})P^{T} \\ & = & PCP^{T} \end{array}
D=====m1YYTm1(PX)(PX)Tm1PXXTPTP(m1XXT)PTPCPT
到这里就可以看出我们能够利用 矩阵对角化 的方法来得到
D
D
D,就是存在单位正交特征向量
E
E
E,使得
E
T
C
E
=
Λ
E^{T}CE=\Lambda
ETCE=Λ,其中
Λ
\Lambda
Λ 为 对角矩阵。通过这种方法可以得到基
P
=
E
T
P=E^{T}
P=ET,而
Λ
\Lambda
Λ 对角上的元素表示各个特征的贡献大小。不过我们还可以通过 矩阵分解 的技巧来解决这个问题,使用 SVD 来分解矩阵的话有
X
=
U
Σ
V
T
X=U \Sigma V^T
X=UΣVT,经过推导可以得到:
X
X
T
=
(
U
Σ
V
T
)
(
U
Σ
V
T
)
T
=
(
U
Σ
V
T
)
(
V
Σ
U
T
)
=
U
Σ
2
U
T
\begin{array}{l l l} XX^{T} & = & (U \Sigma V^T)(U \Sigma V^T)^T \\ & = & (U \Sigma V^T)(V \Sigma U^T) \\ & = & U \Sigma^2 U^T \end{array}
XXT===(UΣVT)(UΣVT)T(UΣVT)(VΣUT)UΣ2UT
所以可以取
P
=
U
T
P=U^{T}
P=UT,而
D
=
1
m
Σ
2
D=\frac{1}{m} \Sigma^2
D=m1Σ2。对于降维,只要取
D
D
D 中占比比较高的特征对应的 基,也就是
P
P
P 的一部分
P
′
P'
P′,对应的数据也变为了
Y
′
Y'
Y′。对于数据恢复,可以通过简单的推导得到
X
恢
复
=
P
′
T
Y
′
X_{恢复}=P'^TY'
X恢复=P′TY′。
课外阅读
关于 PCA 的内容,我觉得有两篇文章对我很有帮助,在这里分享给大家:PCA的数学原理、谈谈矩阵的 SVD 分解。
So~,第七周的内容就是这些了,谢谢大家耐心阅读。