Python 使用KMeans按空间划分划分训练/验证集:确保训练/验证的每个子集都包含所有标签

Python 使用KMeans按空间划分划分训练/验证集:确保训练/验证的每个子集都包含所有标签,python,scikit-learn,cluster-analysis,k-means,image-segmentation,Python,Scikit Learn,Cluster Analysis,K Means,Image Segmentation,我希望在这里能得到一些帮助。我想使用Kmeans聚类来划分下一阶段监督学习的训练集,这在文献中称为空间分割 我已经从三维图像数据(在一个扩展的遮罩内)中提取了特征(X_序列),其中包括X、y和z(体素的位置),遮罩包括两个标签(y_序列={0:background,1:obj1})。这意味着每个体素可以是背景或带有遮罩的对象 我在scikit learn中使用了Kmeans聚类,并将训练数据集的体素位置([x,y,z])聚类为80个不同的聚类 问题问题是,一旦我根据80个集群划分了训练集 fr

我希望在这里能得到一些帮助。我想使用Kmeans聚类来划分下一阶段监督学习的训练集,这在文献中称为
空间分割

我已经从三维图像数据(在一个扩展的遮罩内)中提取了特征(
X_序列
),其中包括X、y和z(体素的位置),遮罩包括两个标签(
y_序列={0:background,1:obj1}
)。这意味着每个体素可以是背景或带有遮罩的对象

我在scikit learn中使用了Kmeans聚类,并将训练数据集的体素位置(
[x,y,z]
)聚类为80个不同的聚类

问题问题是,一旦我根据80个集群划分了训练集

from sklearn.cluster import KMeans
pos_ind=[0,1,2]
kmeans_model= KMeans(n_clusters=80, random_state=rng).fit(X_TRAIN[:,pos_ind]) 
稍后,我加载
kmeans\u模型
,并将验证集分配给集群:

Dval_clusters = kmeans_model.predict(X_DVAL[:, pos_ind])
然后我找到了验证集的行索引,它属于
cidx
th类

cluster_idx = np.unique(kmeans_model.labels_) 
Dval_rows = np.where(Dval_clusters==cluster_idx[cidx])[0]  # find the rows of X_dval that belongs to cidx th cluster
X_dval = X_Dval[Dval_rows]
y_dval = y_Dval[Dval_rows]
一旦我在训练模型上拟合验证集,训练模型可能有两个标签
0
1
,但是,在拟合
验证
集的过程中显示错误,这意味着在将验证样本分配给簇的过程中,它只拾取具有
背景
obj
体素的体素(即,一个簇的一个验证集中的所有样本只有一个类别标签)

问题我知道聚类不使用标签,但在聚类过程中,是否可以对两个标签进行采样,从而强制执行聚类?还是有什么诀窍?因为背景只是一个类标签,我们需要将对象类(类:1)与背景(类:0)分开

如果你把你的专家意见留在这里,我将不胜感激

ValueError: could not broadcast input array from shape (30527,1) into shape (30527,2)