文章目录
未标记的数据的 聚类(Clustering) 可以使用模块 sklearn.cluster 来实现。
每个聚类算法(clustering algorithm)都有两个变体: 一个是 类(class), 它实现了 fit 方法来学习训练数据的簇(cluster),还有一个 函数(function),当给定训练数据,返回与不同簇对应的整数标签数组(array)。对于类来说,训练数据上的标签可以在 labels_ 属性中找到。
需要注意的一点是,该模块中实现的算法可以采用不同种类的矩阵作为输入。所有算法的调用接口都接受 shape [n_samples, n_features] 的标准数据矩阵。 这些矩阵可以通过使用 sklearn.feature_extraction 模块中的类获得。对于 AffinityPropagation, SpectralClustering 和 DBSCAN 也可以输入 shape [n_samples, n_samples] 的相似矩阵。这些可以通过 sklearn.metrics.pairwise 模块中的函数获得。
1. 聚类方法概述
2. K-means
KMeans 算法通过把样本分离成 n 个具有相同方差的类的方式来聚集数据,最小化称为 惯量(inertia) 或 簇内平方和(within-cluster sum-of-squares)的标准(criterion)。该算法需要指定簇的数量。它可以很好地扩展到大量样本(large number of samples),并已经被广泛应用于许多不同领域的应用领域。
k-means 算法将一组 N 样本 X 划分成 K 不相交的簇 C, 每个都用该簇中的样本的均值μj 描述。 这个均值(means)通常被称为簇的 “质心(centroids)”; 注意,它们一般不是从 X 中挑选出的点,虽然它们是处在同一个空间。
K-means(K-均值)算法旨在选择一个质心, 能够最小化惯性或簇内平方和的标准:
惯性被认为是测量簇内聚程度的度量(measure)。 它有各种缺点:
- 惯性假设簇是凸(convex)的和各项同性(isotropic),这并不是总是对的。它对 细长的簇或具有不规则形状的流行反应不佳。
- 惯性不是一个归一化度量(normalized metric): 我们只知道当惯量的值较低是较好的,并且零是最优的。但是在非常高维的空间中,欧氏距离往往会膨胀(这就是所谓的 “维度诅咒/维度惩罚”(curse of dimensionality))。在 k-means 聚类算法之前运行诸如 PCA 之类的降维算法可以减轻这个问题并加快计算速度。
K-means 通常被称为劳埃德算法(Lloyd’s algorithm)。简而言之,该算法可分为三个步骤。第一步是选择初始质心,最基本的方法是从 X 数据集中选择 k 个样本。初始化完成后,K-means 由接下来两个步骤之间的循环组成。 第一步将每个样本分配到其最近的质心。第二步通过取分配给每个先前质心的所有样本的平均值来创建新的质心。计算旧的和新的质心之间的差异,并且算法重复这些最后的两个步骤,直到该值小于阈值。换句话说,算法重复这个步骤,直到质心不再显著移动。
那么如何使用K-means方法呢
class sklearn.cluster.KMeans(n_clusters=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')
K-均值聚类。
参数说明:
n_clusters:int,默认= 8
形成的簇数以及生成的质心数。
init:{
‘k-means++’, ‘random’} or ndarray of shape (n_clusters, n_features), 默认=’k-means++’
'k-means ++':以一种聪明的方式为k-mean聚类选择初始聚类中
心,以加快收敛速度。有关更多详细信息,请参见
k_init中的注释部分。
'random':从初始质心的数据中随机选择k个观测值(行)。
如果传递ndarray,则其形状应为(n_clusters,n_features),
并给出初始中心。
n_init:int,默认值为10
k均值算法将在不同质心种子下运行的次数。就惯性而言,最终
结果将是n_init个连续运行的最佳输出。
max_iter:int,默认为300
单次运行的k均值算法的最大迭代次数。
tol:float,默认= 1e-4
关于惯性的相对公差以声明收敛。
precompute_distances:'auto '或bool,默认='auto'
预计算距离(更快,但占用更多内存)。
'auto':如果n_samples * n_clusters> 1200万,则不预先计算
距离。使用双精度,这相当于每个作业大约100MB的开销。
True:始终预先计算距离。
False:永远不要预先计算距离。
verbose:int,默认值= 0
详细模式。
random_state:int, RandomState instance,默认=None
确定质心初始化的随机数生成。使用整数使随机性具有
确定性。请参阅词汇表。
copy_x:bool,默认为True
当预先计算距离时,从数值上更精确地确定数据的中心。
True(默认值):则不修改原始数据,确保X为C连续的。
False:则会修改原始数据,并在函数返回之前放回原
始数据,但是可能会通过减去然后加上数据均值而引入小的数
值差异,在这种情况下,也不会确保数据是C连续的,这可能会
导致大幅放缓。
n_jobs:int,默认=None
用于计算的作业数。
通过计算每个并行运行的n_init来工作。
None除非joblib.parallel_backend上下文中,否则表示1 。 -1表示使用所有处理器。有关 更多详细信息,请参见词汇表。
algorithm:{
'auto', 'full', 'elkan'}, 默认='auto'
使用K均值算法。
'full'使用经典的EM风格算法。
'elkan'通过使用三角形不等式,更为有效,但目前不支持稀疏数据。
选择'auto'时,
为密集数据选择'elkan',
为稀疏数据选择'full'。
属性说明:
cluster_centers_:ndarray of shape (n_clusters, n_features)
集群中心的坐标。
如果算法在完全收敛之前停止(请参阅tol和max_iter),
则这些将与不一致labels_。
labels_:ndarray of shape (n_samples,)
每个点的标签
inertia_:float
样本到其最近的聚类中心的平方距离的总和。
n_iter_:int
运行的迭代次数。
也可以看看(该方法下边会讲到)
MiniBatchKMeans替代性在线实施,使用迷你批次对中心位置进行增量更新。对于大规模学习(例如n_samples> 10k),MiniBatchKMeans可能比默认的批处理实现要快得多。
示例说明:
>>> from sklearn.cluster import KMeans
>>> import numpy as np
>>> X = np.array([[1, 2], [1, 4], [1, 0],
... [10, 2], [10, 4], [10, 0]])
>>> kmeans = KMeans(n_clusters=2, random_state=0).fit(X)
>>> kmeans.labels_
array([1, 1, 1, 0, 0, 0], dtype=int32)
>>> kmeans.predict([[0, 0],