聚类算法中的K均值聚类算法(K-Means clustering)

版权声明:本文为博主原创文章,未经博主允许禁止转载! https://blog.csdn.net/az9996/article/details/88370761

=======================================================================
              Machine Learning notebook
Python机器学习基础教程(introduction to Machine Learning with Python)
https://scikit-learn.org/stable/modules/generated/sklearn.cluster.KMeans.html#sklearn.cluster.KMeans

=======================================================================

K均值聚类是最简单也是最常用的聚类算法之一。它试图找到代表数据特定区域的簇中心(cluster center)。算法交替执行以下两个步骤:将每个数据点分配给最近的簇中心,然后将每个簇中心设置为所分配的所有数据点的平均值,如果簇的分配不再发生变化那么算法结束。

class sklearn.cluster.KMeans(n_clusters=8,   #簇中心的个数,默认为8,可指定。
							 init=’k-means++,
							 n_init=10,
							 max_iter=300, 
							 tol=0.0001, 
							 precompute_distances=’auto’, 
							 verbose=0, 
							 random_state=None, 
							 copy_x=True, 
							 n_jobs=None, 
							 algorithm=’auto’)

聚类算法与分类算法有些相似,每个元素都有一个标签,但并不存在真实的标签,因此标签本身并没有先验意义,再次运行算法可能会得到不同的标签,原因在于初始化的随机性质。

1.K均值的失败案例
即使你知道给定数据集中簇的正确个数,k均值可能也不是总能找到它们。每个簇仅尤其中心定义,这意味着每个簇都是凸形(convex)。因此,K均值只能找到相对简单的形状。K均值还假设所有簇在某种程度上具有相同的直径,它总是将簇之间的边界刚好画在簇中心的中间位置。
K甚至还假设所有方向对每个簇都同等重要。

K均值无法识别非球形簇。
K均值无法识别具有复杂形状的簇

2.矢量量化,或者将K均值看做分解
PCA试图找到数据中方差最大的方向,而NMF试图找到累加的分量,这通常对应与数据的“极值”或“部分”。两种方法都试图将数据点表示为一些分量之和。与之相反,K均值则尝试利用簇中心来表示每个数据点。你可以将其看作仅用一个分量来表示每个数据点,该分量有簇中心给出。这种观点将K均值看作是一种分解方法,其中每个点用单一分量表示,这种观点被称为矢量化(vector quantization)

利用K均值做矢量量化的一个有趣之处在于,可以用比输入维度更多的簇来对数据进行编码。

K均值是非常流行的聚类算法,因为它不仅相对容易理解和实现,而且运行速度也相对较快。K均值可以轻松扩展到大型数据集,scikit-learn甚至在MinBatchKMeans类中包含了一种更具扩展性的变体,可以处理非常大的数据集。

K均值的缺点之一在于,它依赖于随机初始化,也就是说,算法的输出依赖于随机种子。默认情况下,scikit-learn用10中不同的随机初始化将算法运行10次,并返回最佳(簇的方差之和最小)结果。
K均值还有一个缺点,就是对簇形状的假设的约束性较强,而且还要求指定所要寻找的簇的个数。

猜你喜欢

转载自blog.csdn.net/az9996/article/details/88370761