文章目录
1.聚类(Clustering)
1.1 非监督学习简介
对于非监督学习(Unsupervised Learning),是使用未标记的数据,通过算法找寻数据的结构。
常见的算法是聚类(Clustering),还有很多其他算法,课上暂时只讨论聚类算法。
下面介绍一个常用的聚类算法——K均值算法(K Means)。
1.2 K均值算法
用图形来说明K均值算法的过程
假如下图是我们的数据点,没有标记。目标是将其分为两簇。
下面我们执行K均值算法。第一步我们随机选择两个点(如下图红色和蓝色的叉点),这两个点称为聚类中心(Clustering Centroid)。
K均值算法是一个迭代算法,它需要做两件事,一个是簇分配(Cluster Assignment),一个是聚类中心移动(Move Centroid)。下面我们来解释一下这两步的具体任务。在K均值算法的每一次循环中,第一步要进行簇分配,就是遍历所有的样本(绿色的点),然后看每一个点与两个聚类中心距离的哪个更近,就将其分配给对应的聚类中心。分配后如下图所示:
下一步就是要移动聚类中心,也就是将红色的叉点和蓝色的叉点移动到与它们颜色一样的点的均值处(找到所有红色的点,计算它们平均下来的位置,蓝色点也一样)。如下图:
然后我们重新遍历所有的样本点,计算它们到两个聚类中心的距离,并把它们分配给两个聚类中心(染成不同的颜色)。我们可以看到有一些点的颜色变了
然后计算蓝色和红色点的均值,并移动聚类中心。
继续循环上述步骤,簇分配:
移动聚类中心:
从这一步开始一直迭代下去,点的颜色不再改变,聚类中心也不再移动,我们可以说算法已经收敛了。最终我们将数据分为两簇(Clustering):
K均值算法的过程:
K-Means Algorithm
- input:
K(number of clusters)
Training set{ x ( 1 ) , x ( 2 ) , ⋯ , x ( m ) x^{(1)},x^{(2)},⋯,x^{(m)} x(1),x(2),⋯,x(m)}
x ( i ) ∈ R n x^{(i)}\in R^{n} x(i)∈Rn(drop x 0 = 1 x^0=1 x0=1 convention)
- Randomly initialize K cluster centroids μ 1 , μ 2 , ⋯ , μ K ∈ R n μ_1,μ_2,⋯,μ_K\in R^n μ1,μ2,⋯,μK∈Rn
Repeat {
for i=1 to m
c ( i ) c^{(i)} c(i):=index(from 1 to K)of cluster centroid closest to x ( i ) x^{(i)} x(i) ( m i n k ∥ x ( i ) − u k ∥ 2 ) (min_k∥x(i)−uk∥^2) (mink∥x(i)−uk∥2)
for k=1 to K
μ k μ_k μk:=average(mean)of points assigned to cluster k k k
}
Repeat 循环中的第一个 for 循环其实就是簇分配,第二个 for 循环就是聚类中心移动。
如果一个聚类中心最终没有分配到点,一般情况下我们会移除这个点。或者重新初始化起始点,重新聚类。
到目前为止,我们的K均值算法都是基于如下图左侧所示的数据,它们都有很好地隔离开来,但是事实上K均值算法经常会用于处理一些没有分割开的数据,如下图右侧所示。这是一个实际例子,我们想要设计S、M、L三个大小的衣服,搜集了一些人的身高体重的信息,利用K均值算法将数据分为三类,分别作为这三个大小衣服设计的参考。
1.3 K均值算法的优化目标
先总结一下几个符号:
c
(
i
)
→
c^{(i)}→
c(i)→ 样本
x
(
i
)
x^{(i)}
x(i) 当前被分配给的簇的索引号
μ
k
→
μ_k→
μk→聚类中心 k (
μ
k
∈
R
n
μ_k∈R^n
μk∈Rn)
μ
c
(
i
)
→
μ_{c^{(i)}}→
μc(i)→样本
x
(
i
)
x(i)
x(i) 当前被分配给的簇的聚类中心
K均值算法的优化目标
K均值算法的代价函数为:
J
(
c
(
1
)
,
.
.
.
,
c
(
m
)
,
μ
1
,
.
.
.
,
μ
k
)
=
1
m
∑
i
=
1
m
∣
∣
x
(
i
)
−
μ
c
(
i
)
∣
∣
2
J(c^{(1)},...,c^{(m)},\mu_1,...,\mu_k)=\frac{1}{m}\sum_{i=1}^m||x^{(i)}-μ_{c^{(i)}}||^2
J(c(1),...,c(m),μ1,...,μk)=m1∑i=1m∣∣x(i)−μc(i)∣∣2
K均值算法的优化目标是:给每个样本找到最优的簇序号索引以及簇的中心点,最小化
J
J
J函数。
- Randomly initialize K cluster centroids μ 1 , μ 2 , ⋯ , μ K ∈ R n μ_1,μ_2,⋯,μ_K\in R^n μ1,μ2,⋯,μK∈Rn
- Repeat {
for i=1 to m
c ( i ) c^{(i)} c(i):=index(from 1 to K)of cluster centroid closest to x ( i ) x^{(i)} x(i) ( m i n k ∥ x ( i ) − u k ∥ 2 ) (min_k∥x(i)−uk∥^2) (mink∥x(i)−uk∥2)
for k=1 to K
μ k μ_k μk:=average(mean)of points assigned to cluster k k k
}
簇分配就是调整参数
c
(
1
)
,
.
.
.
,
c
(
m
)
c^{(1)},...,c^{(m)}
c(1),...,c(m)实现代价函数
J
J
J的最小化,
μ
1
,
.
.
.
,
μ
K
\mu_1,...,\mu_K
μ1,...,μK保持不变;
移动聚类中心就是调整参数
μ
1
,
.
.
.
,
μ
K
\mu_1,...,\mu_K
μ1,...,μK实现代价函数
J
J
J的最小化,
c
(
1
)
,
.
.
.
,
c
(
m
)
c^{(1)},...,c^{(m)}
c(1),...,c(m)不变。
1.4 随机初始化
来看K均值算法,如何初始化聚类中心。
介绍一种随机初始化的方法,它的效果要好于其他的方法。
数据集如下图:
首先,
K
K
K 应该小于数据集的大小
m
m
m,例如
K
=
2
K=2
K=2。接下来我们随机选取
K
K
K 个训练样本,如下图,然后定义
K
K
K 个点作为聚类中心。
刚刚我们选取的聚类中心看起来很好,但有时我们并不会那么幸运,例如下面这个例子:
根据初始化的聚类中心不同,我们最终会得到不同的结果。例如下图:
上图中下面两种情况得到只是目标函数的局部最优解。为了解决这个问题,我们一般会尝试多次随机初始化,并运行多次K均值算法来保证我们得到一个足够好的结果。我们可以尝试 50∼1000 次。假如我们选择 100 次,如下图:
当你的 K 值很小,例如 2∼10,多次随机化能够保证你找到一个更好聚类,但是如果 K 值远远大于 10,多次随机化就不太可能有太大的影响,可能第一次的随机化就能给你带来相当好的结果。
1.5 选择聚类数
无监督式学习中数据没有标记,所以也就没有一个明确的答案。一个数据集分成几类比较合适是比较模糊的,目前比较常见的方法就是看可视化的图或聚类算法的输出结果。下图中的数据集可以分成2、3或者4类都是可以的。
当讨论选择聚类数目的方法时,有一个叫肘部法则(Elbow Method)的方法,我们画出代价函数关于聚类数目 K 的图像:
如左图,我们能看到图像在 K=3 处有一个明显的拐点,类似于“肘部”,我们可以选择聚类数目为 3。如果你得到一个这样的图,那么你可以明显选出合适的聚类数目。但是通常得到的图像可能如右图所示,肘部并不是那么清晰,看起来选择 3,4,5都是可行的。这给我们的选择带来了一定的困难。
于肘部法则,它是一个值得尝试的方法,但我们并不期待它在任何问题上都能有很好的表现。
如果聚类算法有后续目的,我们可以通过实际问题来选择聚类数目。
2.降维(Dimensionality Reduction)
2.1 数据压缩
数据压缩(Data Compression)不仅能减少数据的存储量,节省了内存和磁盘,还会大大加快学习算法的运行速度。
我们首先来介绍降维(Dimensionality Reduction)。假设我们已经收集了大量数据,其中含有特别多的特征,这里我们只选择其中的两个特征
x
1
x_1
x1 和
x
2
x_2
x2,二者都用来表示某一事物的长度,
x
1
x_1
x1 的单位是厘米,
x
2
x_2
x2的单位是英寸,如下图所示。很明显数据存在冗余,我们可以使用一个特征来表示事物的长度,数据从二维降到一维。当然,实际生产中我们可能不会出现这么低级的问题,这里仅以此来做说明。
再给出一个三维降到二维的例子。如下图所示,我们可以将三维坐标系中的数据点投影到一个二维平面上,实现三维到二维的降维。
2.2 数据可视化
下面介绍一种数据降维的应用——可视化数据。
在很多学习算法的应用中,对数据的理解可以帮助我们更好的改善模型,而降维恰好可以帮助我们实现数据的可视化,增进对数据的理解。
下面是大量的有关世界不同国家的统计数据集。数据中有很多特征,这对观察这些数据造成了很大的困难。怎样才能更好地理解这些数据?
如果我们将下面表格中的多个特征降维到2个特征(如下图所示),然后在直角坐标系中画出它们。
上图中坐标系的横轴可以表示一个国家的经济总量,纵轴代表人均经济量,图中的每一个点代表一个国家。
一般我们可视化会将数据降到二维或三维,因为更高维度的图像画起来会比较困难。
2.3 主成因分析原理(PCA)
在降维问题中最常见的一种算法是主成分分析(Principal Component Analysis,PCA)。
如下图所示一个数据集:
我们希望把数据从二维降到一维,也就是找到一条直线,把这些点投影到直线上去,那么怎么找到一条好的直线来投影?下图的红色直线也许是一个不错的选择,因为发现这些点到他们对应的投影点之间的距离非常小(即蓝色线段)。
上面的蓝色线段称为“投影误差”。PCA所做的事情就是找到一个低维的面,将数据投影到上面,并使得投影误差最小。在进行PCA之前,我们会先进行均值归一化和特征缩放使得特征
x
1
x_1
x1 和
x
2
x_2
x2 均值为 0。
对比红线,我们再来看看另一条直线,如下图粉色直线所示。如果将数据点投影在这条直线上,投影误差会很大,因此,PCA算法会选择红色的直线而不会选择粉色这条。
- 对于二维降到一维,PCA的目标是找到一个二维向量( u ( 1 ) ∈ R n , u ( 1 ) u^{(1)}∈R^n,u^{(1)} u(1)∈Rn,u(1) 的方向是正是负并没有关系),并且最小化投影误差。
对于从
n
n
n 维降到
k
k
k 维,我们则需要找到
k
k
k 个
n
n
n 维向量来实现。
如下图所示,左图为二维降到一维,右图为三维降到二维:
2.4 主成因分析算法
1 数据预处理
拿到数据以后,一般先进行均值归一化和特征缩放.
① 算出每个特征的均值
μ
μ
μ:
μ
j
=
1
m
∑
i
=
1
m
x
j
(
i
)
\mu_j=\frac{1}{m}\sum_{i=1}^mx_j^{(i)}
μj=m1∑i=1mxj(i)
② 将每一个数据
x
j
(
i
)
x^{(i)}_j
xj(i) 都替换成:
x
j
(
i
)
−
μ
j
x^{(i)}_j-\mu_j
xj(i)−μj
如果每个特征的取值范围不同,我们还要进行特征缩放:
x j ( i ) − μ j s j → x j ( i ) \frac{x_j^{(i)}-\mu_j}{s_j}\to x_j^{(i)} sjxj(i)−μj→xj(i)
μ j μ_j μj 是训练数据集中 x j x_j xj的平均值, s j s_j sj是 x j x_j xj的取值范围 m a x ( x j − m i n ( x j ) max(x_j−min(x_j) max(xj−min(xj)或者 s j s_j sj取 x j x_j xj的标准差。( x 0 x_0 x0不进行上述操作)。
2 PCA算法
PCA所需要求的两个部分分别是投影向量和样本投影后的点,下面我们只介绍求取的过程不展开讲述原理与证明。
③ 求解特征的协方差矩阵(Covariance Matrix):
∑
=
1
m
∑
i
=
1
n
(
x
(
i
)
)
(
x
(
i
)
)
T
\begin{aligned} \sum=\frac{1}{m}\sum_{i=1}^n(x^{(i)})(x^{(i)})^T \end {aligned}
∑=m1i=1∑n(x(i))(x(i))T
④ 求解特征值和特征向量:
#Octave
[U S V]=svd(Sigma)
%svd 表示奇异值分解,Sigma就是第③步求到的协方差矩阵(Σ),是一个 n×n 的矩阵。求得的矩阵U也是一个 n×n 的矩阵。
⑤ 求
U
∈
R
n
×
n
U∈R^{n×n}
U∈Rn×n矩阵的前 k 列,组成
U
R
e
d
u
c
e
∈
R
n
×
k
U_{Reduce}∈\Bbb R^{n×k}
UReduce∈Rn×k,用来投影数据。
⑥ 求取降维后的数据
z
(
i
)
z^{(i)}
z(i):
z
(
i
)
=
U
R
e
d
u
c
e
T
x
(
i
)
z^{(i)}=U_{Reduce}Tx^{(i)}
z(i)=UReduceTx(i)
2.5 主成因分析的应用
2.5.1 选择主成分数量
在PCA算法中,我们把
n
n
n维特征变量降维到
k
k
k 维特征变量,这个数字
k
k
k 是PCA算法的一个参数,这个数字
k
k
k 也被称作主成分的数量,或者说是我们保留的主成分的数量。下面我们就来讲述如何选择这个参数
k
k
k。
我们先来看几个有用的概念。
平均平方映射误差 (Average Squared Projection Error):
1
m
∑
i
=
1
m
∣
∣
x
(
i
)
−
x
a
p
p
r
o
x
(
i
)
∣
∣
2
\begin{aligned} \frac{1}{m}\sum_{i=1}^m||x^{(i)}-x_approx^{(i)}||^2 \end{aligned}
m1i=1∑m∣∣x(i)−xapprox(i)∣∣2
数据总变差(Total Variance in the data):
1
m
∑
i
=
1
m
∣
∣
x
(
i
)
∣
∣
2
\begin{aligned} \frac{1}{m}\sum_{i=1}^m||x^{(i)}||^2 \end{aligned}
m1i=1∑m∣∣x(i)∣∣2
接下来,我们给出一个计算公式 err:
1
m
∑
i
=
1
m
∣
∣
x
(
i
)
−
x
a
p
p
r
o
x
(
i
)
∣
∣
2
1
m
∑
i
=
1
m
∣
∣
x
(
i
)
∣
∣
2
\begin{aligned} \frac{\frac{1}{m}\sum_{i=1}^m||x^{(i)}-x_approx^{(i)}||^2}{\frac{1}{m}\sum_{i=1}^m||x^{(i)}||^2} \end{aligned}
m1∑i=1m∣∣x(i)∣∣2m1∑i=1m∣∣x(i)−xapprox(i)∣∣2
我们用这个公式来量化原始数据与降维后数据的差距。若该值不超过0.01(1%),我们就可以说“99% of variance is retained”。(除了 0.01,我们还可以选择 0.05,0.10)我们可以把 e r r err err作为选择 k 值得指标:取 k=1,完成一系列降维计算,判断 e r r err err是否大于等于0.01,若满足则确定该 k 值为最终的 k;若不满足,则 k 加 1,继续前面的计算直至满足要求。
显然上面的过程效率非常的低。这里给出了计算err的一种简便方法。PCV求解过程中有这样一个公式
[U,S,V]=svd(sigma)
其中的 S 是一个
n
×
n
n×n
n×n 的对角矩阵,对角线上是求得的特征值,从上到下依次递减。
e
r
r
err
err可由下面的公式求得:
1
−
∑
i
=
1
k
s
i
i
∑
i
=
1
n
s
i
i
\begin{aligned} 1- \frac{\sum_{i=1}^ks_{ii}}{\sum_{i=1}^ns{ii}} \end{aligned}
1−∑i=1nsii∑i=1ksii
这样我们就可以只进行一次svd运算,然后依次增加 k,找出满足
e
r
r
≤
0.01
err≤0.01
err≤0.01 的最小 k 值。
2.5.2 重建的压缩表示
前面介绍了使用PCA对数据进行降维,已达到压缩数据提高计算速率的目标,现在我们尝试着从压缩后的数据出发还原数据,注意这里得到的数据是原始数据的近似。我们沿用前面二维降到一维的例子,现在我们尝试着从一维升维到二维。具体的公式是:
x
a
p
p
r
o
x
=
U
R
e
d
u
c
e
⋅
z
\begin{aligned} x_{approx}=U_{Reduce}⋅z \end{aligned}
xapprox=UReduce⋅z
如果投影误差能够取到很小很小的值,则会有:
x
≈
x
a
p
p
r
o
x
\begin{aligned} x≈x_{approx} \end{aligned}
x≈xapprox
2.5.3 主成因分析法的应用建议
假设一条数据中包含 10000 个特征,通过PCA降低到 1000 个特征,无论是在有监督式学习还是在无监督式学习中,这种降维对学习速度的提升是显著的。需要注意的一点是PCA只能在训练集上进行,得到的 U r e d u c e U_{reduce} Ureduce 同样能应用在交叉验证集和测试集上。
在前面的学习中,我们知道过多的特征提取会导致过拟合,此时采取的措施是适当的去掉一些特征。而现在的降维恰好减小了特征的数量,那么我们是否可以通过降维来改善过拟合呢?答案是否定的。PCA不能用于解决过拟合问题。
需要注意的一点是,在进行机器学习时,我们首先使用的是原始数据。只有当算法的速度过慢、内存或磁盘不够,或者你有足够的把握确定问题出在原始数据上(此处的问题当然不是指数据的真假问题),这时你才可以考虑降维。