仅提取属于特定 kmeans 标签的样本
Extract only samples which belong to certain kmeans label
我目前正在为我使用的一个小型数据集执行 K 均值聚类。
我的数据集包含两个集群(集群 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)
X
是一个 numpy.ndarray
,其中包含具有不同特征的所有样本。
labels
属于 kmeans.labels_
类型,它也是 numpy.ndarray
并且表示每个样本所属的聚类(0
或 1
)。 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]
这将 return 一个布尔数组,其中 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]]
我目前正在为我使用的一个小型数据集执行 K 均值聚类。
我的数据集包含两个集群(集群 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)
X
是一个 numpy.ndarray
,其中包含具有不同特征的所有样本。
labels
属于 kmeans.labels_
类型,它也是 numpy.ndarray
并且表示每个样本所属的聚类(0
或 1
)。 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]
这将 return 一个布尔数组,其中 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]]