【问题标题】:SKLearn KMeans Convergence WarningSKLearn KMeans 收敛警告
【发布时间】:2019-03-14 15:01:18
【问题描述】:

我在 1D 数据集上使用 SKLearn 的 KMeans 聚类。我得到的错误是,当我运行代码时,我得到一个ConvergenceWarning

ConvergenceWarning: Number of distinct clusters (<some integer n>) found smaller than n_clusters (<some integer bigger than n>). Possibly due to duplicate points in X.
  return_n_iter=True)

除了源代码之外,我找不到任何关于此的内容,这并不能说明究竟出了什么问题。我相信我的错误要么是因为我有一个一维数据结构,要么是因为我在使用 SKLearn 的一维数组时出现了问题。这是有问题的代码:

def cluster_data(data_arr):
    """clusters the uas for a specific site"""
    d = 1.0
    k = 1
    inertia_prev = 1.0
    while k <= MAX and d > DELTA: 
        #max is the size of the input array, delta is .05
        kmean = KMeans(n_clusters=k)
        prediction = kmean.fit_predict(data_arr.reshape(-1, 1))
        #bug could be in the reshape!
        inertia_curr = kmean.inertia_
        d = abs(1 - (inertia_curr / inertia_prev))
        inertia_prev = inertia_curr
        k += 1

一些演示 IO: 示例输入:

[(11.,) ( 0.,) ( 0.,) ( 0.,) ( 0.,) ( 0.,) ( 7.,) ( 0.,) ( 4.,) ( 7.,)
( 7.,) (13.,) ( 2.,) ( 0.,) ( 0.,) ( 0.,) ( 0.,) ( 0.,) ( 0.,) ( 0.,)
 ( 7.,) ( 2.,) ( 0.,) ( 0.,) (11.,) ( 7.,) ( 7.,) ( 0.,) ( 2.,) ( 1.,)
 ( 0.,) ( 0.,) ( 0.,) ( 7.,) ( 5.,) ( 0.,) ( 0.,) ( 4.,) ( 0.,) ( 0.,)
 ( 0.,) ( 0.,) ( 8.,) ( 0.,) ( 4.,) (10.,) ( 0.,) (11.,) (13.,) (11.,)
 (11.,) ( 0.,) ( 0.,) ( 0.,) ( 0.,) ( 0.,) ( 0.,) ( 0.,) ( 7.,) ( 7.,)
 ( 5.,) ( 5.,) ( 5.,) ( 5.,) ( 5.,) (10.,) (16.,) (15.,) (13.,) ( 2.,)
 ( 5.,) ( 5.,) ( 5.,) ( 5.,) ( 5.,) ( 5.,) ( 5.,) ( 5.,) ( 5.,) ( 5.,)
 ( 5.,) (15.,) (14.,) (14.,) (15.,) (14.,) (15.,) (15.,) ( 5.,) (14.,)
 (15.,) (15.,) (15.,) ( 5.,) (15.,) ( 7.,) ( 5.,) ( 5.,) ( 5.,) (11.,)
 ( 5.,) ( 5.,) ( 5.,) ( 2.,) ( 0.,) ( 0.,) ( 0.,) ( 0.,) ( 0.,) ( 0.,)
 ( 5.,) ( 5.,) ( 5.,) ( 5.,) ( 5.,) ( 5.,) ( 0.,) ( 0.,) ( 5.,) ( 0.,)
 ( 0.,) ( 0.,) ( 0.,) ( 0.,) ( 0.,) ( 0.,) ( 0.,) ( 0.,) ( 0.,) ( 0.,)
 ( 0.,) ( 0.,) ( 2.,) ( 0.,) ( 0.,) ( 0.,) ( 0.,) ( 1.,) ( 0.,) ( 7.,)
 ( 0.,) (11.,) ( 0.,) ( 0.,) (11.,) ( 5.,) ( 0.,) (15.,) ( 2.,) ( 2.,)
 ( 5.,) ( 5.,) (11.,) ( 0.,) ( 0.,) ( 0.,) (13.,) ( 2.,) ( 5.,) (13.,)
 ( 0.,) ( 8.,) ( 8.,) ( 2.,) ( 2.,) ( 0.,) ( 5.,) ( 5.,) ( 0.,) ( 0.,)
 ( 0.,) (11.,) ( 5.,) ( 5.,) ( 5.,) ( 0.,) ( 0.,) (11.,) ( 8.,) ( 5.,)
 ( 0.,) ( 7.,) ( 5.,) ( 0.,) (11.,) ( 0.,) ( 0.,) ( 2.,) ( 0.,) (11.,)
 (11.,) ( 7.,) ( 0.,) (13.,) (15.,) ( 0.,) ( 5.,) ( 7.,) ( 0.,) ( 5.,)
 ( 5.,) ( 2.,) ( 5.,) ( 0.,) ( 0.,) ( 5.,) ( 0.,) ( 0.,) ( 0.,) ( 7.,)
 ( 0.,) ( 0.,) (11.,) ( 0.,) ( 5.,) ( 5.,) ( 0.,) ( 5.,) (11.,) ( 5.,)
 ( 5.,) ( 5.,) ( 5.,) ( 5.,) ( 5.,) ( 5.,) ( 0.,) ( 5.,) ( 5.,) ( 0.,)
 ( 7.,) ( 0.,) ( 0.,) ( 0.,) ( 0.,) ( 0.,) ( 0.,) ( 0.,) ( 0.,) ( 0.,)
 (11.,) ( 0.,) ( 0.,) (11.,) (11.,) (11.,) ( 1.,) ( 1.,) ( 5.,) ( 5.,)
 ( 5.,) ( 0.,) ( 0.,) ( 0.,) ( 2.,) ( 0.,) ( 2.,) ( 0.,) ( 0.,) ( 0.,)
 ( 0.,) ( 0.,) ( 0.,) ( 0.,) ( 0.,) ( 0.,) ( 0.,) ( 0.,) ( 0.,) ( 0.,)
 ( 0.,) ( 5.,) ( 0.,) ( 0.,) ( 0.,) ( 5.,) ( 0.,) ( 0.,) ( 5.,) ( 0.,)
 ( 0.,) ( 0.,) ( 0.,) ( 0.,) ( 0.,) ( 1.,) ( 1.,) ( 0.,) ( 0.,) ( 0.,)
 ( 0.,) ( 5.,) ( 0.,) ( 2.,) ( 0.,) ( 0.,) ( 0.,) ( 0.,) ( 0.,) ( 0.,)
 ( 0.,) ( 0.,) ( 5.,) ( 0.,) (11.,) (11.,) ( 7.,) (11.,) (11.,) ( 2.,)
 ( 0.,) ( 2.,) ( 1.,) ( 0.,) ( 0.,) (11.,) ( 0.,) (11.,) ( 0.,) ( 7.,)
 ( 0.,) ( 0.,) (11.,) ( 5.,) ( 0.,) ( 0.,) ( 0.,) ( 0.,) ( 0.,) ( 5.,)
 ( 0.,) ( 4.,) ( 5.,) ( 5.,) ( 0.,) ( 0.,) ( 8.,) ( 7.,) ( 0.,) ( 0.,)
 ( 0.,) ( 0.,) ( 8.,) ( 0.,) ( 4.,) ( 0.,) ( 8.,) ( 8.,) ( 2.,) (10.,)
 ( 0.,) ( 0.,) ( 0.,) ( 0.,) ( 0.,) ( 8.,) ( 0.,) ( 0.,) ( 5.,) (15.,)
 (15.,) ( 0.,) ( 5.,) (15.,) (15.,) ( 2.,) (15.,) ( 5.,) ( 2.,) ( 2.,)
 ( 2.,) (15.,) (13.,) ( 0.,) ( 2.,) ( 0.,) ( 2.,) ( 2.,) ( 2.,) ( 2.,)
 ( 2.,) ( 0.,) (13.,) ( 5.,) ( 0.,) ( 0.,) ( 0.,) ( 0.,) ( 0.,) ( 2.,)
 ( 0.,) ( 0.,) ( 0.,) (13.,) ( 0.,) ( 5.,) ( 5.,) ( 5.,) ( 5.,) ( 5.,)
 ( 7.,) ( 5.,) ( 5.,) ( 0.,) ( 0.,) ( 0.,) ( 0.,) ( 0.,) ( 0.,) ( 8.,)
 ( 0.,) ( 0.,) ( 0.,) ( 0.,) ( 0.,) ( 0.,) ( 0.,) ( 2.,) (11.,) (10.,)
 ( 2.,) ( 7.,) ( 0.,) ( 2.,) ( 0.,) ( 0.,) ( 5.,) ( 2.,) ( 5.,) ( 2.,)
 ( 5.,) ( 0.,) ( 0.,) ( 2.,) ( 2.,) ( 0.,) ( 0.,) ( 0.,) ( 0.,) ( 2.,)
 ( 0.,) ( 2.,) ( 0.,) ( 2.,) ( 5.,) ( 5.,) ( 1.,) ( 0.,) ( 0.,) ( 0.,)
 ( 0.,) (11.,) ( 5.,) ( 2.,) ( 0.,) ( 0.,) (13.,) ( 0.,) ( 5.,) (15.,)
 ( 7.,) ( 5.,) (11.,) (11.,) (16.,) (15.,) ( 7.,) (16.,) (11.,) (15.,)
 (16.,) (11.,) (17.,) (15.,) (17.,) (15.,) (11.,) ( 7.,) (11.,) ( 7.,)
 ( 7.,) (15.,) (15.,) (15.,) (16.,) (16.,) (16.,) (16.,) (16.,) (16.,)
 (17.,) (16.,) (15.,) (13.,) (14.,) (15.,) (15.,) ( 7.,) (16.,) (15.,)
 (11.,) (15.,) (17.,) (11.,) (11.,) ( 7.,) (15.,) (15.,) (11.,) (11.,)
 (15.,) (15.,) (15.,) (16.,) (11.,) ( 7.,) (16.,) (11.,) (11.,) (15.,)
 (11.,) (15.,) ( 5.,) (16.,) (11.,) (11.,) ( 7.,) (15.,) (15.,) (15.,)]

示例输出:

ConvergenceWarning: Number of distinct clusters (14) found smaller than n_clusters (15). Possibly due to duplicate points in X. return_n_iter=True)

预期输出:

no warning

您可能会注意到输入有很多重复值。这是意料之中的,我想知道如何更好地对这些数据进行聚类,这样我就不会得到具有重复质心的重复聚类。

【问题讨论】:

    标签: python scikit-learn k-means


    【解决方案1】:

    理想情况下,指定的集群数量不应超过唯一数据点的数量。如果您可以相应地调整质心计数,则不会引发警告。

    Sklearn 使用warning 模块发出警告。我们可以抑制警告,如下所示。

    with warnings.catch_warnings():
        warnings.simplefilter("ignore")
        cluster_data(data_arr)
    

    with 块内的所有警告都被禁止显示,因此应谨慎使用此功能。

    【讨论】:

    • “超过唯一数据点的数量” 是一个不清楚的说法。你指的是变量还是值。此外,对于这个引用的短语,您是在建议降维还是特征选择?再次,焦点缺失。尝试进一步改进此答案。
    • MWE 的数据是一维的。降维和特征选择都不适用。同样,由于我和 OP 都没有提到这些想法,因此在回应中穿插鞋很可能会使读者感到困惑。这里的“唯一数据点”是唯一示例的数量(即,删除了任何重复的示例/点)。正如 OP 提到的并且从 MWE 中可以明显看出,他有很多重复的点。 OP 的原始数据集被构造为一个多集,但与集群的数量(即n_clusters)相比,sklearn 将该多集转换为一个集。
    猜你喜欢
    • 2021-04-15
    • 2014-09-08
    • 2014-01-08
    • 2017-07-28
    • 2021-12-07
    • 2013-10-22
    • 1970-01-01
    • 2016-03-30
    • 1970-01-01
    相关资源
    最近更新 更多