KMeans#
- 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-Means 聚类。
在用户指南中了解更多。
- 参数:
- n_clustersint, 默认为 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 聚类演示。有关初始化影响的评估,请参阅示例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-contiguous 格式,即使 copy_x 为 False 也会创建副本。如果原始数据是稀疏的但不是 CSR 格式,即使 copy_x 为 False 也会创建副本。
- algorithm{“lloyd”, “elkan”}, 默认为 “lloyd”
要使用的 K-means 算法。经典的 EM 风格算法是
"lloyd"
。"elkan"
变体可以通过使用三角不等式,在某些具有明确定义簇的数据集上更高效。但由于需要额外分配一个形状为(n_samples, n_clusters)
的数组,它会消耗更多内存。版本 0.18 中更改: 新增 Elkan 算法
版本 1.1 中更改: 将 “full” 重命名为 “lloyd”,并弃用 “auto” 和 “full”。将 “auto” 更改为使用 “lloyd” 而非 “elkan”。
- 属性:
- cluster_centers_形状为 (n_clusters, n_features) 的 ndarray
簇中心的坐标。如果算法在完全收敛之前停止(请参阅
tol
和max_iter
),这些坐标将与labels_
不一致。- labels_形状为 (n_samples,) 的 ndarray
每个点的标签
- inertia_float
样本到其最近簇中心的平方距离之和,如果提供了样本权重,则按样本权重加权。
- n_iter_int
运行的迭代次数。
- n_features_in_int
在拟合(fit)期间看到的特征数量。
版本 0.24 新增。
- feature_names_in_形状为 (
n_features_in_
,) 的 ndarray 在拟合(fit)期间看到的特征名称。仅当
X
的所有特征名称均为字符串时定义。版本 1.0 新增。
另请参阅
MiniBatchKMeans
另一种在线实现,它使用 mini-batch 对中心位置进行增量更新。对于大规模学习(例如 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。更多详情请参阅“How slow is the k-means method?” D. Arthur and S. Vassilvitskii - SoCG2006.。
实际上,k-means 算法非常快(是可用的最快聚类算法之一),但它会陷入局部最小值。这就是为什么多次重新启动它可能会很有用。
如果算法在完全收敛之前停止(由于
tol
或max_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-Means 常见问题及其解决方法,请参阅k-means 假设的演示。
有关如何使用 K-Means 聚类文本文档的演示,请参阅使用 k-means 聚类文本文档。
有关 K-Means 和 MiniBatchKMeans 之间比较的示例,请参阅K-Means 和 MiniBatchKMeans 聚类算法的比较。
有关 K-Means 和 BisectingKMeans 之间比较的示例,请参阅二分 K-Means 和常规 K-Means 性能比较。
- fit(X, y=None, sample_weight=None)[source]#
计算 k-means 聚类。
- 参数:
- X形状为 (n_samples, n_features) 的 {类数组对象, 稀疏矩阵}
要聚类的训练实例。需要注意的是,数据将被转换为 C 顺序,如果给定数据不是 C 连续的,这将导致内存复制。如果传入稀疏矩阵,如果它不是 CSR 格式,则会进行复制。
- y忽略
未使用,此处存在是为了符合 API 惯例。
- sample_weight形状为 (n_samples,) 的类数组对象, 默认为 None
X 中每个观测值的权重。如果为 None,则所有观测值都分配相同的权重。如果
init
是可调用对象或用户提供的数组,则在初始化期间不使用sample_weight
。版本 0.20 新增。
- 返回:
- self对象
已拟合的估计器。
- fit_predict(X, y=None, sample_weight=None)[source]#
计算簇中心并预测每个样本的簇索引。
方便方法;相当于先调用 fit(X) 再调用 predict(X)。
- 参数:
- X形状为 (n_samples, n_features) 的 {类数组对象, 稀疏矩阵}
要转换的新数据。
- y忽略
未使用,此处存在是为了符合 API 惯例。
- sample_weight形状为 (n_samples,) 的类数组对象, 默认为 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) 的 {类数组对象, 稀疏矩阵}
要转换的新数据。
- y忽略
未使用,此处存在是为了符合 API 惯例。
- sample_weight形状为 (n_samples,) 的类数组对象, 默认为 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 类型或 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) 的 {类数组对象, 稀疏矩阵}
要预测的新数据。
- 返回:
- labels形状为 (n_samples,) 的 ndarray
每个样本所属簇的索引。
- score(X, y=None, sample_weight=None)[source]#
X 在 K-means 目标上的值的相反数。
- 参数:
- X形状为 (n_samples, n_features) 的 {类数组对象, 稀疏矩阵}
新数据。
- y忽略
未使用,此处存在是为了符合 API 惯例。
- sample_weight形状为 (n_samples,) 的类数组对象, 默认为 None
X 中每个观测值的权重。如果为 None,则所有观测值都分配相同的权重。
- 返回:
- score浮点数
X 在 K-means 目标上的值的相反数。
- 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
fit
方法中sample_weight
参数的元数据路由。
- 返回:
- self对象
更新后的对象。
- set_output(*, transform=None)[source]#
设置输出容器。
有关如何使用此 API 的示例,请参阅set_output API 简介。
- 参数:
- transform{“default”, “pandas”, “polars”}, 默认为 None
配置
transform
和fit_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对象
更新后的对象。