仅提取属于特定kmeans标签的样本

时间:2017-09-20 07:42:57

标签: python numpy machine-learning k-means

我目前正在为我使用的小型数据集执行K-means聚类。 我的数据集包含两个集群(集群0和集群1)。 我尝试区分不同的群集,以便计算每个群集中每个要素的Mean squared error。 例如,我的数据集包含20个样本,其中10个样本聚集在质心0周围,我想提取簇0中的所有样本,并对该样本子集上的每个特征执行MSE。

这是以下代码的片段:

xX = []

for sample in X:
    sample = list(sample)
    for index in range (len(X)):
        if labels[index] == 0:
            if sample not in xX:
                xX.append(sample)

Xnumpy.ndarray,其中包含具有不同功能的所有示例。 labels类型为kmeans.labels_,也是numpy.ndarray,代表每个样本所属的群集(01)。 xX只是一个list,我想将样本分别保存在每个群集中。

我当前的代码无法提取属于质心0的样本,而是忽略了我的if语句(if labels[index] == 0),只是将整个数据集添加到我的新列表xX中。

如果有人可以帮助我理解我做错了什么,那将非常感激。

编辑:这是我的X数据的样子:

array([[5923210.22, 14.25, 1668.52, 1495373778450.11],
       [1109272.57, 7.47, 49.75, 1495411802900.06],
       [178397.30, 11.67, 245.61, 1495318964821.19],
       [1871514.94, 24.97, 678.05, 1495377767231.84],
       [4501604.93, 42.10, 1252.70, 1495420897842.18]])

这就是我的标签的样子:

array([0, 0, 1, 1, 0], dtype=int32)

1 个答案:

答案 0 :(得分:1)

因此,代码的问题是外部循环 - 您循环遍历样本,然后忽略样本并循环遍历所有标签。对于每个样品,您将重新找到所有0个标签并添加样品次数。这就是为什么你需要检查样品是否已经存在的原因 - 否则你会得到每个样品3次(标签中每个样品一次)。

你可以抓住外圈 - 它根本不会帮助你 - 你会得到你的东西

xX = []

for index in range (len(X)):
    if labels[index] == 0:
        xX.append(X[index])

但是有一个更好的方法 - 将所有循环包装起来并使用numpy进行直接查找。

X[labels == 0]

这将返回一个布尔数组,其中true的位置是0标签。然后它将在X中查找在相同位置具有真值的行。这更快更清洁。两种方法都得到相同的结果

[[  5.92321022e+06   1.42500000e+01   1.66852000e+03   1.49537378e+12]
 [  1.10927257e+06   7.47000000e+00   4.97500000e+01   1.49541180e+12]
 [  4.50160493e+06   4.21000000e+01   1.25270000e+03   1.49542090e+12]]