我正在尝试将细胞分类为群体。当我使用时:gmix = mixture.GMM(n_components=3, covariance_type='full')gmix.fit(samples)
除非我进行以下设置,否则以下代码中的均值输出将顺序更改:
np.radom.seed(0)
。print ("gmix.means \n", gmix.means_)colors = ['r' if i==0 else ('g' if i==1 else ('b' if i ==2 else 'm'))for i in gmix.predict(samples)]
我想要按X轴均值排序的类(每个类的第一项),即:
[[ 3.25492404e+02 2.88403293e-02]
[ 3.73942908e+02 3.25283512e-02]
[ 5.92577646e+02 4.40595768e-02]]
因此,在上面的代码中,红色始终是325,绿色372和蓝色592。此刻,我不认为对输出进行排序。
我试过了:
gmix.means_ = np.sort(gmix.means_, axis = 0)
但是,然后还需要对gmix.covars_和gmix.weights_进行相应的排序,这就是我遇到的问题!
非常感谢!
编辑4/5/16:
感谢您的帮助,并指导我朝正确的方向发展。这是我写得不好但有效的版本:
sort_indices = gmix.means_.argsort(axis = 0)
order = sort_indices[:, 0]
print('\norder:', order)
gmix.means_ = gmix.means_[order,:]
gmix.covars_ = gmix.covars_[order, :]
print ("\n sorted gmix.covars \n", gmix.covars_)
print ("\n\nori gmix.weights \n", gmix.weights_)
w = np.split(gmix.weights_,3)
w = np.asarray(w)
w = np.ravel(w[order,:])
gmix.weights_ = w
最佳答案
这基本上是一个矩阵/向量索引问题。我在这里可能太冗长了,但是对矩阵进行排序应该只有两行。
通常,不能保证群集算法(在您的情况下为GMM)每次都以相同的顺序标记群集,也不能保证每次都为您提供相同的群集,除非您修复了初始条件。
如果您希望集群按其均值的X坐标排序,则可能需要自己执行此操作。就像您在问题中提到的那样,这涉及2个步骤:
a)对均值进行排序并获取索引
b)使用索引来提取您的均值
可以简单地完成以下操作:
a)尽力执行argsort
>>> means = np.array(np.mat('1, 2; 4, 3; 2, 6'))
>>> sort_indices = means.argsort(axis=0)
array([[0, 0],
[2, 1],
[1, 2]])
您的订单将成为argsorted数组的第一列:
>>> order = sort_indices[:,0]
>>> order
array([0, 2, 1])
(b)现在,我们将使用此“订单”对您的收入重新排序。
>>> sorted_m = means[order,:]
>>> sorted_m
array([[1, 2],
[2, 6],
[4, 3]])
和您的协方差,让我们创建一个虚拟协方差矩阵:
>>> c = np.array(np.mat('9, 8, 7; 6, 5, 4; 3, 2, 1'))
>>> c
array([[9, 8, 7],
[6, 5, 4],
[3, 2, 1]])
现在,重新索引c,一个简单的方法就是重新索引:
>>> sorted_c = c[order,:][:, order]
>>> sorted_c
array([[9, 7, 8],
[3, 1, 2],
[6, 4, 5]])
如果您看到了,则根据我们的新顺序重新排列行和列。
在那里,您的收入和协方差已分类。
您可能还需要重新标记原始标签,您可以在此处使用答案:Fast replacement of values in a numpy array
关于python - sklearn GMM分类预测(组件分配)顺序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37008588/