官网参见https://docs.opencv.org/3.4.1/de/d4d/tutorial_py_kmeans_understanding.html
自学参见https://zhuanlan.zhihu.com/p/32830192
T恤尺寸问题
想象有一家公司要上市一款新T恤。显然需要生成不同尺寸的T恤以满足不同用户的需求。所以这家公司需要收集很多人身高和体重信息,并把它们绘制成下图。
公司不可能生成所有尺寸的T恤。他们会把尺寸分为小、中、大3类以适用所有人。此时就可以使用k均值聚类算法来得到最佳分类的3个组,满足所有人的需求。如果做不到,那就需要分更加多的组,比如5组,或者更多。
k均值聚类如何工作
该算法是一个迭代的过程。我们用一些图片一步一步解释。
观察下图(你就把它想象成T恤问题),我们需要把数据归入2组。
step1.算法随机选择2个质心C1和C2。(有时候可以选择数据中的任意2个作为质心)
step2.计算测试数据每个点到2个质心的距离。如果距离C1近,那么就标记为’0’;如果距离C2近,那么就标记为’1’。(如果质心更多,那么可以依次标记’2’,'3’等)
本例中,我们标记‘0’用红色表示,标记‘1’用蓝色表示。
step3.分别计算所有蓝色点和所有红色点到各自质心的平均距离,并以此产生2个新的质心。(上面图片只是为了演示说明而已,并不代表实际数据)
然后重复第二步,依据新质心重新标记所有测试数据的分类,结果如下
重复迭代第二步和第三步,直至2个质心收敛稳定下来(也可以通过设置迭代次数,或者达到一定精确度来停止迭代)。现在测试数据到质心的距离之和达到最小。或者简单说,C1到所有红色点的距离之和最小,C2到所有蓝色点的距离之和最小。
m
i
n
i
m
i
z
e
[
J
=
∑
A
l
l
R
e
d
P
o
i
n
t
s
d
i
s
t
a
n
c
e
(
C
1
,
R
e
d
P
o
i
n
t
)
+
∑
A
l
l
B
l
u
e
P
o
i
n
t
s
d
i
s
t
a
n
c
e
(
C
2
,
B
l
u
e
P
o
i
n
t
)
]
minimize[J=\displaystyle\sum_{AllRed_Points}distance(C1,Red_Point)+\displaystyle\sum_{AllBlue_Points}distance(C2,Blue_Point)]
minimize[J=AllRedPoints∑distance(C1,RedPoint)+AllBluePoints∑distance(C2,BluePoint)]
最后结果如下(分类和质心)
这个过程就是k均值聚类直观的理解。更多细节和算法解释,可以参考任何一个介绍机器学习的文档。
这里说的是k均值聚类的基础。还有很多算法变化,如何选取好的初始质心,怎样加速迭代过程等。