版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/shinian1987/article/details/80554028
今天介绍机器学习里常见的一种无监督聚类算法,K-means。我们先来考虑在一个高维空间的一组数据集,
S = { x 1 , x 2 , . . . , x N }
S
=
{
x
1
,
x
2
,
.
.
.
,
x
N
}
,
x ∈ R D
x
∈
R
D
,假设我们需要把这组数据聚集长
K
K
类,不失一般性,我们可以假设每个聚好的类都有一个中心
μ k
μ
k
,如果聚类完成的话,那么数据集中的每一个点
x
x
会有一个中心
μ k
μ
k
离这个点的距离最近。可以构造一个变量
r n k = { 0 , 1 }
r
n
k
=
{
0
,
1
}
表示变量
x
x
离第
k
k
类最近
r n k = 1
r
n
k
=
1
,离其他的类更远
r n j = 0 , j ≠ k
r
n
j
=
0
,
j
≠
k
,那么我们可以定义如下的目标函数:
J = ∑ n = 1 N ∑ k = 1 K r n k | | x n − μ k | | 2
J
=
∑
n
=
1
N
∑
k
=
1
K
r
n
k
|
|
x
n
−
μ
k
|
|
2
这个目标函数就是要求
r n k , μ k
r
n
k
,
μ
k
,使得目标函数
J
J
的值最小。
为了解决上面这个问题,因为要同时求
r n k , μ k
r
n
k
,
μ
k
两个变量,所以我们会采取分步迭代的方法,当我们求
r n k
r
n
k
可以让
μ k
μ
k
固定不动,当我们求
μ k
μ
k
的时候,可以让
r n k
r
n
k
固定不动。
很显然,当我们求
r n k
r
n
k
,只有比较每一个
x n
x
n
与
μ k
μ
k
的距离,选择距离最近的一个类即可:
r n k = 1 if = arg m i n j | | x n − μ j | | 2
r
n
k
=
1
if
=
arg
m
i
n
j
|
|
x
n
−
μ
j
|
|
2
而求
μ k
μ
k
的时候,我们可以 让
r n k
r
n
k
固定不动, 对目标函数
J
J
求导,
2 ∑ n = 1 N r n k ( x n − μ k ) = 0
2
∑
n
=
1
N
r
n
k
(
x
n
−
μ
k
)
=
0
从而我们可以求得
μ k
μ
k
:
μ k = ∑ n r n k x n ∑ n r n k
μ
k
=
∑
n
r
n
k
x
n
∑
n
r
n
k
通过这样的反复迭代,直到所有的
r n k , μ k
r
n
k
,
μ
k
都不再变化。