日常生活中人们常常会说:物以类聚,人以群分。物以类聚的算法,你(真)们(是)(头)听(大)过吗?

通过某些群体的固有特征来对某些人或者事物进行分类。比如穿着校服背着书包的,我们会认为是学生;穿着格子衬衫拿着电脑的是程序员(并不……);穿着西装拿公文包的是保险从业员。
如果把这些不同职业的人按性别来分,又可以分成两类。我们发现对于同一个群体,根据职业和根据性别来划分,得到不同的结果。

如果我们用算法把不同的东西聚到一起要怎么做呢?
这一类任务的实现过程我们称为聚类,clustering。聚类就是把多个对象分成不同的组别,相似的对象分到一组。每一组称为cluster,中文译为“簇”,比如分成k组,那就是有k个簇。
比如对于同一个数据集,我们可以分成两簇,可以分成三簇,也可以分成四簇。解决聚类问题的最简单最常见的算法,就是K-means算法。

James MacQueen 1967年在他的论文《关于多变量分类的一些方法》中首次使用了“k-means”这个术语。K-means算法最初由贝尔实验室的Stuart Lloyd于1957年提出,应用于脉冲编码调制技术,就是信号处理里可以区分不同的信号。
1966年,Edward Forgy发表了基本相同的方法,所以K-means算法也被称为Lloyd-Forgy方法。

K-means是源于信号处理中的一种向量量化方法,现在更多地作为一种聚类分析方法流行于数据挖掘领域。K-means的目的是:把n个样本划分到k个簇中,使得每个样本都属于离它最近的均值对应的簇,以之作为聚类的标准。
我们先介绍一个基本概念——质心。K-means的mean是均值的意思,比如2和8的均值,是位于2, 8中心的5。
质心,是质量中心的简称。

而求质心其实就是求所有样本在每个维度的均值。

比如(1,1) (2,5)这两个点,分别求2个维度的均值,

得到的(3/2,3)这个点就是两个点的质心。

再比如我们有3个点,同样是求2个维度的均值,

得到的(8/3,3)这个点就是三个点的质心。


k是由我们来决定的,k值的选取很重要,也是一个很复杂的问题。在具体的应用时具体考虑。当初始质心选取不同时,算法的步数也会不同,所以关于质心的选取也是一个不能忽视的点。

我们可以对一张图片的像素点进行聚类。k取2时(图2),图片只区分成两种颜色;k取3(图3),显示出3种颜色;k取4(图4),显示4种颜色;……
当我们取10的时候(图5),能获取到大部分有用的信息来识别图片上的元素。我们再扩大k的取值,取到20(图6),却发现反而丢失了一些细节。从图中某些局部可以看出,并不是k越大,细节就越显著(比如后两幅图中向日葵的眼睛),k取20的时候反而丢失了这个细节。
这是因为k-means的初始位置是随机的,所以对于相同的样本每次聚类可能会有不同的结果。
K-means有一定的局限性:第一,K-means算法的k是事先给定的,这个k值的选定非常难以估计的。很多时候,事先并不知道给定的数据集应该分成多少个类别才最合适。
第二,初始点的选择是随机的,而初始点选择的不同,有可能导致完全不同的结果,这也会带来很大的问题。
关于算法的学习,今天就先和大家分享到这里啦,学习过程中如有不懂的,欢迎留言探讨哈~

如果你想学习更多的算法知识,微信搜索“恒企行家网校”公众号+关注,咱一起学习吧~
网友评论