我正在尝试将细胞分类为群体。当我使用时:

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/

10-11 06:22