我在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
您可能会注意到输入有很多重复的值。这是预料之中的,我想知道如何更好地对这些数据进行聚类,因此不会出现重复质心重复的聚类!
非常感谢您!
答案 0 :(得分:2)
理想情况下,指定的群集数量不应超过唯一数据点的数量。如果您可以相应地调整质心计数,则将不会发出警告。
Sklearn使用warning
模块发出警告。我们可以禁止显示警告,如下所示。
with warnings.catch_warnings():
warnings.simplefilter("ignore")
cluster_data(data_arr)
在with
块中禁止显示所有警告,因此应谨慎使用此功能。