K均值#

class sklearn.cluster.KMeans(n_clusters=8, *, init='k-means++', n_init='auto', max_iter=300, tol=0.0001, verbose=0, random_state=None, copy_x=True, algorithm='lloyd')[source]#

K均值聚类。

更多信息请参考 用户指南

参数:
n_clustersint, default=8

要形成的簇数以及要生成的质心数。

关于如何选择n_clusters 的最佳值,请参考使用轮廓分析选择KMeans聚类中的簇数

init{‘k-means++’, ‘random’}, 可调用对象或形状为 (n_clusters, n_features) 的数组,默认为’k-means++’

初始化方法

  • ‘k-means++’ : 使用基于点对整体惯性贡献的经验概率分布的采样选择初始聚类中心。此技术可加快收敛速度。实现的算法是“贪婪k-means++”。它与普通的k-means++的不同之处在于,它在每个采样步骤中进行多次尝试,并在其中选择最佳质心。

  • ‘random’: 从数据中随机选择n_clusters个观测值(行)作为初始质心。

  • 如果传递的是数组,则其形状应为 (n_clusters, n_features),并给出初始中心。

  • 如果传递的是可调用对象,则它应该接受参数 X、n_clusters 和随机状态,并返回一个初始化。

关于如何使用不同的init策略的示例,请参见标题为手写数字数据上的K-Means聚类演示的示例。

n_init‘auto’ 或 int,默认为’auto’

使用不同的质心种子运行k-means算法的次数。最终结果是n_init次连续运行中就惯性而言的最佳输出。对于稀疏高维问题,建议进行多次运行(参见使用k-means聚类稀疏数据)。

n_init='auto'时,运行次数取决于init的值:如果使用init='random'init是可调用对象,则为10;如果使用init='k-means++'init是类数组对象,则为1。

1.2版本新增: n_init添加了“auto”选项。

1.4版本变更: n_init的默认值更改为'auto'

max_iterint,默认为300

单次运行k-means算法的最大迭代次数。

tolfloat,默认为1e-4

关于两次连续迭代的聚类中心差异的Frobenius范数的相对容差,用于声明收敛。

verboseint,默认为0

详细程度模式。

random_stateint,RandomState 实例或 None,默认为 None

确定质心初始化的随机数生成。使用 int 使随机性确定性。参见词汇表

copy_xbool,默认为True

预先计算距离时,首先对数据进行中心化在数值上更准确。如果copy_x为True(默认值),则原始数据不会被修改。如果为False,则会修改原始数据,并在函数返回之前放回,但可能会因减去和添加数据均值而引入小的数值差异。请注意,如果原始数据不是C连续的,即使copy_x为False,也会创建一个副本。如果原始数据是稀疏的,但不是CSR格式,即使copy_x为False,也会创建一个副本。

algorithm{“lloyd”, “elkan”}, 默认为”lloyd”

要使用的K-means算法。经典的EM风格算法是"lloyd""elkan"变体可以通过使用三角不等式在某些具有明确定义的聚类的dataset上更有效。但是,由于分配了一个形状为(n_samples, n_clusters)的额外数组,因此它更占用内存。

0.18版本变更: 添加了Elkan算法

1.1版本变更: 将“full”重命名为“lloyd”,并弃用“auto”和“full”。将“auto”更改为使用“lloyd”而不是“elkan”。

属性:
cluster_centers_形状为 (n_clusters, n_features) 的ndarray

聚类中心的坐标。如果算法在完全收敛之前停止(参见tolmax_iter),则这些与labels_不一致。

labels_形状为 (n_samples,) 的ndarray

每个点的标签

inertia_float

样本到其最近聚类中心的平方距离之和,如果提供样本权重,则按样本权重加权。

n_iter_int

运行的迭代次数。

n_features_in_int

拟合期间看到的特征数量。

0.24版本新增。

feature_names_in_形状为 (n_features_in_,) 的ndarray

拟合期间看到的特征名称。仅当X具有全部为字符串的特征名称时才定义。

1.0版本新增。

另见

MiniBatchKMeans

使用小批量对中心位置进行增量更新的替代在线实现。对于大规模学习(例如 n_samples > 10k),MiniBatchKMeans 可能比默认的批量实现快得多。

备注

k-means问题使用Lloyd算法或Elkan算法求解。

平均复杂度由O(k n T)给出,其中n是样本数,T是迭代次数。

最坏情况下的复杂度由O(n^(k+2/p))给出,其中n = n_samples,p = n_features。有关更多详细信息,请参考“k-means方法有多慢?”D. Arthur 和 S. Vassilvitskii - SoCG2006。

实际上,k-means算法非常快(可用的最快聚类算法之一),但它会陷入局部最小值。这就是为什么多次重新启动它可能很有用的原因。

如果算法在完全收敛之前停止(由于tolmax_iter),labels_cluster_centers_将不一致,即cluster_centers_不会是每个簇中点的均值。此外,估计器将在最后一次迭代后重新分配labels_,以使labels_与训练集上的predict一致。

示例

>>> 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, n_init="auto").fit(X)
>>> kmeans.labels_
array([1, 1, 1, 0, 0, 0], dtype=int32)
>>> kmeans.predict([[0, 0], [12, 3]])
array([1, 0], dtype=int32)
>>> kmeans.cluster_centers_
array([[10.,  2.],
       [ 1.,  2.]])

有关K均值常见问题及其解决方法的示例,请参见K均值假设演示

有关如何使用K均值对文本文档进行聚类的演示,请参见使用K均值聚类文本文档

有关K均值和MiniBatchKMeans的比较,请参考示例K均值和MiniBatchKMeans聚类算法的比较

有关K均值和BisectingKMeans的比较,请参考示例二分K均值和常规K均值性能比较

fit(X, y=None, sample_weight=None)[source]#

计算K均值聚类。

参数:
X形状为 (n_samples, n_features) 的 {array-like, sparse matrix}

要聚类的训练实例。需要注意的是,数据将被转换为C顺序,如果给定的数据不是C连续的,这将导致内存复制。如果传递稀疏矩阵,则如果不是CSR格式,则会进行复制。

y忽略

未使用,出于约定俗成的API一致性而保留在此处。

sample_weight形状为 (n_samples,) 的 array-like,默认值为 None

X 中每个观测值的权重。如果为 None,则所有观测值都被赋予相同的权重。sample_weight如果init是可调用对象或用户提供的数组,则在初始化期间不会使用。

版本 0.20 中添加。

返回:
self对象

拟合的估计器。

fit_predict(X, y=None, sample_weight=None)[source]#

计算聚类中心并预测每个样本的聚类索引。

便捷方法;等效于调用 fit(X) 后跟 predict(X)。

参数:
X形状为 (n_samples, n_features) 的 {array-like, sparse matrix}

要转换的新数据。

y忽略

未使用,出于约定俗成的API一致性而保留在此处。

sample_weight形状为 (n_samples,) 的 array-like,默认值为 None

X 中每个观测值的权重。如果为 None,则所有观测值都被赋予相同的权重。

返回:
labels形状为 (n_samples,) 的 ndarray

每个样本所属的聚类索引。

fit_transform(X, y=None, sample_weight=None)[source]#

计算聚类并将 X 转换为聚类距离空间。

等效于 fit(X).transform(X),但实现效率更高。

参数:
X形状为 (n_samples, n_features) 的 {array-like, sparse matrix}

要转换的新数据。

y忽略

未使用,出于约定俗成的API一致性而保留在此处。

sample_weight形状为 (n_samples,) 的 array-like,默认值为 None

X 中每个观测值的权重。如果为 None,则所有观测值都被赋予相同的权重。

返回:
X_new形状为 (n_samples, n_clusters) 的 ndarray

在新空间中转换的 X。

get_feature_names_out(input_features=None)[source]#

获取转换的输出特征名称。

输出的特征名称将以小写的类名作为前缀。例如,如果转换器输出 3 个特征,则输出的特征名称为:["class_name0", "class_name1", "class_name2"]

参数:
input_featuresstr 的 array-like 或 None,默认值为 None

仅用于使用在fit中看到的名称验证特征名称。

返回:
feature_names_outstr 对象的 ndarray

转换后的特征名称。

get_metadata_routing()[source]#

获取此对象的元数据路由。

请查看用户指南,了解路由机制的工作原理。

返回:
routingMetadataRequest

一个MetadataRequest 封装了路由信息。

get_params(deep=True)[source]#

获取此估计器的参数。

参数:
deepbool,默认为True

如果为 True,则将返回此估计器及其包含的子对象(也是估计器)的参数。

返回:
paramsdict

参数名称与其值的映射。

predict(X)[source]#

预测 X 中每个样本所属的最近的聚类。

在矢量量化文献中,cluster_centers_ 称为码本,predict 返回的每个值都是码本中最近代码的索引。

参数:
X形状为 (n_samples, n_features) 的 {array-like, sparse matrix}

要预测的新数据。

返回:
labels形状为 (n_samples,) 的 ndarray

每个样本所属的聚类索引。

score(X, y=None, sample_weight=None)[source]#

K 均值目标函数中 X 值的反值。

参数:
X形状为 (n_samples, n_features) 的 {array-like, sparse matrix}

新数据。

y忽略

未使用,出于约定俗成的API一致性而保留在此处。

sample_weight形状为 (n_samples,) 的 array-like,默认值为 None

X 中每个观测值的权重。如果为 None,则所有观测值都被赋予相同的权重。

返回:
scorefloat

K 均值目标函数中 X 值的反值。

set_fit_request(*, sample_weight: bool | None | str = '$UNCHANGED$') KMeans[source]#

传递给fit 方法的请求元数据。

请注意,只有在 enable_metadata_routing=True 时(参见 sklearn.set_config)此方法才相关。请参阅 用户指南,了解路由机制的工作原理。

每个参数的选项为:

  • True:请求元数据,如果提供则传递给 fit。如果没有提供元数据,则忽略请求。

  • False:不请求元数据,元估计器不会将其传递给 fit

  • None:不请求元数据,如果用户提供元数据,则元估计器将引发错误。

  • str:元数据应使用此给定的别名而不是原始名称传递给元估计器。

默认值(sklearn.utils.metadata_routing.UNCHANGED)保留现有的请求。这允许您更改某些参数的请求,而其他参数不变。

版本 1.3 中新增。

注意

仅当将此估计器用作元估计器的子估计器时(例如,在 Pipeline 中使用)此方法才相关。否则,它无效。

参数:
sample_weightstr、True、False 或 None,默认为 sklearn.utils.metadata_routing.UNCHANGED

fitsample_weight 参数的元数据路由。

返回:
self对象

更新后的对象。

set_output(*, transform=None)[source]#

设置输出容器。

参见 Introducing the set_output API,了解如何使用该 API 的示例。

参数:
transform{"default","pandas","polars"},默认为 None

配置 transformfit_transform 的输出。

  • "default":转换器的默认输出格式

  • "pandas":DataFrame 输出

  • "polars":Polars 输出

  • None:转换配置保持不变

版本 1.4 中新增:"polars" 选项已添加。

返回:
self估计器实例

估计器实例。

set_params(**params)[source]#

设置此估计器的参数。

此方法适用于简单的估计器以及嵌套对象(例如 Pipeline)。后者具有 <component>__<parameter> 形式的参数,因此可以更新嵌套对象的每个组件。

参数:
**paramsdict

估计器参数。

返回:
self估计器实例

估计器实例。

set_score_request(*, sample_weight: bool | None | str = '$UNCHANGED$') KMeans[source]#

请求传递给score方法的元数据。

请注意,只有在 enable_metadata_routing=True 时(参见 sklearn.set_config)此方法才相关。请参阅 用户指南,了解路由机制的工作原理。

每个参数的选项为:

  • True:请求元数据,如果提供则传递给score。如果未提供元数据,则忽略请求。

  • False:不请求元数据,元估计器不会将其传递给score

  • None:不请求元数据,如果用户提供元数据,则元估计器将引发错误。

  • str:元数据应使用此给定的别名而不是原始名称传递给元估计器。

默认值(sklearn.utils.metadata_routing.UNCHANGED)保留现有的请求。这允许您更改某些参数的请求,而其他参数不变。

版本 1.3 中新增。

注意

仅当将此估计器用作元估计器的子估计器时(例如,在 Pipeline 中使用)此方法才相关。否则,它无效。

参数:
sample_weightstr、True、False 或 None,默认为 sklearn.utils.metadata_routing.UNCHANGED

score方法中sample_weight参数的元数据路由。

返回:
self对象

更新后的对象。

transform(X)[source]#

将X转换为聚类距离空间。

在新空间中,每个维度都是到聚类中心的距离。请注意,即使X是稀疏的,transform返回的数组通常也是密集的。

参数:
X形状为 (n_samples, n_features) 的 {array-like, sparse matrix}

要转换的新数据。

返回:
X_new形状为 (n_samples, n_clusters) 的 ndarray

在新空间中转换的 X。