首页 > 解决方案 > 无法按集群对数据点进行分组

问题描述

我有一个数据列表,其中每个数据点都有 5 个特征和分配给每个点的集群。你可以在这里看到它的开头,最后一列是簇号:

[[4.01682810e-01 2.14628527e-02 2.99529665e-02 2.79935965e-01 9.21441137e-01 9.00000000e+00]
[9.32087200e-03 3.38196129e-01 8.49571569e-01 3.69402590e-01 1.92096835e-01 1.20000000e+01]
[7.51465196e-01 4.45955645e-01 3.37174838e-01 3.65047097e-01 5.81725084e-01 1.00000000e+00]

我想创建同一个集群的数据点列表列表,所以我编写了以下函数并尝试执行它:

def returnArrayOfClusters(data, clusterNumbers):
    # create an empty column
    column = []
    # create an empty list we want to output
    listOfClusters = []
    # fill it with a column for each cluster
    for i in clusterNumbers:
        listOfClusters.append(column)
    print(listOfClusters)
    ## fill the columns with points according to their cluster
    for datapoint in data:
        print(datapoint)
        cluster = int(datapoint[5])
        listOfClusters[cluster].append(datapoint)
    return listOfClusters

listOfClusters = returnArrayOfClusters(data_labeled_unfinished, range(0,14))

我得到的是这种格式的数据点的无序列表(列表的末尾),并且您可以看到列中的所有点都属于不同的集群(它们具有不同的最后一个值):

array([ 0.81802695,  0.45533606,  0.33799001,  0.26154893,  0.64155249,
13.        ]), array([0.12995366, 0.45586338, 0.85833814, 0.32153188, 0.28736836,
1.        ]), array([0.06230581, 0.47400143, 0.78671841, 0.3162376 , 0.04819034,
9.        ]), array([0.15291747, 0.54247295, 0.54407916, 0.87888682, 0.46639597,
8.        ]), array([ 0.21578994,  0.178303  ,  0.80642112,  0.39853499,  0.27832876,
10.        ]), array([0.27426491, 0.32986967, 0.49411613, 0.50818875, 0.2336591 ,
5.        ])]

也许这是一个非常愚蠢的错误,但我就是无法发现错误。然而,我希望看到的是列表中的所有点都属于同一个簇(即输出中的第 6 项具有相同的值)

标签: pythonlistcluster-analysis

解决方案


希望我让您正确,您可以使用列表理解来拆分数据,例如:

from sklearn.cluster import KMeans
import numpy as np
X = np.random.normal(0,1,(100,5))
kmeans = KMeans(n_clusters=8, random_state=0).fit(X)
data = np.concatenate((X,kmeans.labels_.reshape(-1,1)),axis=1)

[data[data[:,5]==i,] for i in np.unique(data[:,5])]

在你的情况下:

[data_labeled_unfinished[data_labeled_unfinished[:,5]==i,] for i in np.unique(data_labeled_unfinished[:,5])]

推荐阅读