2017-08-20 24 views
3

我对sklearn(和python一般)非常陌生,但需要在涉及的某个项目上工作,其中包含超过10k个样本。对于k = 4的少于100个样本的测试数据集,使用以下代码,聚类按预期进行。然而,当我开始使用多于100个样品,则6/8质心似乎在原点(0,0)即它未能产生群集重复。任何可能出错的建议?当超过100个样本时,Python K-means不适合数据

截图: 86 Samples150 samples

代码:

data = pd.read_csv('parsed.txt', sep="\t", header=None) 
    data.columns = ["x", "y"] 

    kmeans = KMeans(algorithm='auto', copy_x=True, init='k-means++', max_iter=1000, 
     n_clusters=k, n_init=10, n_jobs=1, precompute_distances='auto', 
     random_state=None, tol=0.0001, verbose=0) 
    kmeans.fit(data) 

    labels = kmeans.predict(data) 
    centroids = kmeans.cluster_centers_ 

    fig = plot.figure(figsize=(5, 5)) 
    colmap = {(x+1): [(np.sin(0.3*x + 0)*127+128)/255,(np.sin(0.3*x + 2)*127+128)/255,(np.sin(0.3*x + 4)*127+128)/255] for x in range(k)} # making rainbow colormap 
    colors = map(lambda x: colmap[x+1], labels) #color for each label 

    plot.scatter(data['x'], data['y'], color=colors, alpha=0.5, edgecolor='k') 
    for idx, centroid in enumerate(centroids): 
     plot.scatter(*centroid, color=colmap[idx+1]) 
    plot.xlim(0, 4000) 
    plot.ylim(0, 10000) 
    plot.show() 

@ 150个样品,我打印的标签(几乎所有2S)和质心坐标(最在起点)如下所示:

[2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 
1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 
2] 
[[ 7.51619277e+09 7.51619277e+09] 
[ 1.00000000e+27 1.00000000e+27] 
[ 0.00000000e+00 0.00000000e+00] 
[ 0.00000000e+00 0.00000000e+00] 
[ 0.00000000e+00 0.00000000e+00] 
[ 0.00000000e+00 0.00000000e+00] 
[ 0.00000000e+00 0.00000000e+00] 
[ 0.00000000e+00 0.00000000e+00] 
[ 0.00000000e+00 0.00000000e+00] 
[ 0.00000000e+00 0.00000000e+00]] 

更多细节(17年8月20日)

以下是示出集群从k中的GIF = 1至10分别86和150个样本。从这里可以看出,86集合运行良好,但并不适用于仅在原点出现的150集合。请注意,在k = 4帧处设置的颜色变化是由我定义颜色映射的方式引起的,因此不是问题的一部分。

86 Samples150 Samples

回答

5

你尝试先检查是否有实际上是在你的数据这么多集群为你试图找到?简单地增加样本数量并不一定意味着群集数量也会增加。如果不。您输入给算法的簇的数量大于实际的数量。数据集中的聚类,则有可能该算法不能正确收敛,或者这些聚类可能简单地相互重叠(完全)。

要找到最佳的没有。我们使用称为弯头方法的技术。该方法有不同的变化,但主要的想法是,K(编号群)的不同值找到成本函数是最适合你的应用程序中所有点的距离平方的(如SUM群集到它的质心的K值是表示1到8,或者任何其它的错误/成本/方差函数。根据您所选择的功能,你会看到一定的阶段后,在价值观的差异可以忽略不计。这个想法是,我们选择了“K”在该所选择的成本函数的值急剧变化的该值。

Elbow method

对于值K = 4的方差被突然改变,因此K = 4是所选择的是合适的值。

图片来源:Wikipedia

上有群集验证几种其它方法为好。 R中有几个包专门用于此目的。

要了解更多从下面的链接:

+0

谢谢,穆罕默德。我从来没有使用肘法,所以我会了解这一点。但是对于我的问题,我确保始终使用相同数量的集群k = 4。包含更多样本时使用的数据集与以前具有非常相似的特征。我也试过k = 3然后是2,但同样的情况仍然发生。这就是我困惑的原因。 –

+0

如果您添加的样本具有与之前相同的特征,那么它们更可能被添加到使用较小编号获得的相同群集中。的样本。即不会形成新的群集。你可以在150和86个样本中发布k = 2和k = 3的结果吗? –

+0

我只是用.gif更新了这个帖子,对于86和150组,k = 1-> 10。是的,我预计在这两种情况下大约有4-5个非常重要的集群。 –