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

我目前正在对一个小数据集进行K-means聚类分析。我的数据集包含两个聚类(聚类0和聚类1)。我试图区分不同的聚类,以便计算每个聚类中每个特征的均方误差。例如,我的数据库包含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)

X是一个numpy.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)

回答:

所以你的代码问题出在外层循环上——你遍历了你的样本,然后忽略了样本并遍历了所有标签。对于每个样本,你都会重新找到所有0标签,并将样本添加相应次数。这就是为什么你需要检查样本是否已经存在——否则你会得到每个样本3次(每次对应标签中的0)。

你可以直接去掉外层循环——它对你没有任何帮助——这样你就能得到你想要的结果

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

但有一个更好的方法——去掉所有循环,直接使用numpy进行查找。

X[labels == 0]

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

[[  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]]

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注