概念
KMeans 算法通过把样本分离成 n 个具有相同方差的类的方式来聚集数据,最小化称为 惯量(inertia) 或 簇内平方和(within-cluster sum-of-squares)的标准(criterion)。该算法需要指定簇的数量。它可以很好地扩展到大量样本(large number of samples),并已经被广泛应用于许多不同领域的应用领域。
基本流程
K-means 通常被称为劳埃德算法(Lloyd’s algorithm)。简而言之,该算法可分为三个步骤。第一步是选择初始质心,最基本的方法是从 X 数据集中选择 k 个样本。初始化完成后,K-means 由接下来两个步骤之间的循环组成。 第一步将每个样本分配到其最近的质心。第二步通过取分配给每个先前质心的所有样本的平均值来创建新的质心。计算旧的和新的质心之间的差异,并且算法重复这些最后的两个步骤,直到该值小于阈值。换句话说,算法重复这个步骤,直到质心不再显著移动。
缺点
1、惯性假设簇是凸(convex)的和各项同性(isotropic),这并不是总是对的,它对细长的簇或具有不规则形状的流行反应不佳。
2、惯性不是一个归一化度量(normalized metric): 我们只知道当惯量的值较低是较好的,并且零是最优的。但是在非常高维的空间中,欧氏距离往往会膨胀(这就是所谓的 “维度诅咒/维度惩罚”(curse of dimensionality))。在 k-means 聚类算法之前运行诸如 PCA 之类的降维算法可以减轻这个问题并加快计算速度。
scikit-learn中的实现
import numpy as np from sklearn.cluster import KMeans # 第一步、建模 kmeans_model = KMeans(n_clusters=3, random_state=1) # 第二步、训练模型 kmeans_model.fit(X) # 第三步、获取结果 print(kmeans_model.labels_)
KMeans()对象源码
def __init__( self, n_clusters=8, *, init="k-means++", n_init=10, max_iter=300, tol=1e-4, verbose=0, random_state=None, copy_x=True, algorithm="auto", ):
传参详解
1、n_clusters : 聚类中心数量(开始时需要产生的聚类中心数量),默认为8 2、max_iter : 算法运行的最大迭代次数,默认300 3、tol: 容忍的最小误差,当误差小于tol就会退出迭代(算法中会依赖数据本身),默认为1e-4 4、n_init : k-means算法会随机运行n_init次,最终的结果将是最好的一个聚类结果,默认10 5、init : 聚类中心的初始化方案,有三个选择{'k-means++', 'random' or an ndarray} 5.1、 'k-means++' : 默认选项,初始化过程如下 (1)、从输入的数据点集合(要求有k个聚类)中随机选择一个点作为第一个聚类中心;(2)、对于数据集中的每一个点x,计算它与最近聚类中心(指已选择的聚类中心)的距离D(x);(3)、选择一个新的数据点作为新的聚类中心,选择的原则是:D(x)较大的点,被选取作为聚类中心的概率较大;(4)、重复2和3直到k个聚类中心被选出来 5.2、'random': 随机选择k个实例作为聚类中心 5.4、ndarray:如果传入为矩阵(ndarray),则将该矩阵中的每一行作为聚类中心 6、algorithm :可选的K-means距离计算算法, 可选{"auto", "full" or "elkan",default="auto"} 6.1"full":传统的距离计算方式. 6.2"elkan":使用三角不等式,效率更高,但是目前不支持稀疏数据。1、计算任意两个聚类中心的距离;2当计算x点应该属于哪个聚类中心时,当发现2*S(x,K1)<S(x,K2)时,根据三角不等式,S(x,K2)>S(x,K1), 6.3"auto":当为稀疏矩阵时,采用full,否则elkan。 7、precompute_distances : 是否将数据全部放入内存计算,可选{'auto', True, False},开启时速度更快但是更耗内存. 7.1、'auto' : 当n_samples * n_clusters > 12million,不放入内存,否则放入内存,double精度下大概要多用100M的内存 7.2、True : 进行预计算 7.3、False : 不进行预计算 8、n_jobs : 同时进行计算的核数(并发数),n_jobs用于并行计算每个n_init,如果设置为-1,使用所有CPU,若果设置为1,不并行,如果设置小于-1,使用CPU个数+1+n_jobs个CPU 9、random_state : 用于随机产生中心的随机序列 10、verbose : 是否输出详细信息,默认为0,bush 11、copy_x : 是否直接在原矩阵上进行计算。默认为True,会copy一份进行计算。
新建对象后,常用的方法包括fit、predict、cluster_centers_和labels。fit(X)函数对数据X进行聚类,使用predict方法进行新数据类别的预测,使用cluster_centers_获取聚类中心,使用labels_获取训练数据所属的类别,inertia_获取每个点到聚类中心的距离和