Python sklearn GMM分类预测(部件分配)订单

Python sklearn GMM分类预测(部件分配)订单,python,scikit-learn,Python,Scikit Learn,我试图把细胞分成不同的群体。当我使用: gmix=mixed.GMM(n_分量=3,协方差类型=full') gmix.fit(样本) 除非我设置了以下内容,否则以下代码的平均输出将按顺序更改: np.radom.seed(0) 打印(“gmix.means\n”,gmix.means) gmix中i的颜色=['r'如果i==0 else('g'如果i==1 else('b'如果i==2 else'm'))。预测(样本)] 我希望按照X轴平均值(每个类的第一项)对类进行排序,即: 所以在上面的

我试图把细胞分成不同的群体。当我使用:

gmix=mixed.GMM(n_分量=3,协方差类型=full')
gmix.fit(样本)

除非我设置了以下内容,否则以下代码的平均输出将按顺序更改:
np.radom.seed(0)

打印(“gmix.means\n”,gmix.means)
gmix中i的颜色=['r'如果i==0 else('g'如果i==1 else('b'如果i==2 else'm'))。预测(样本)]

我希望按照X轴平均值(每个类的第一项)对类进行排序,即:

所以在上面的代码中,红色总是325,绿色372和蓝色592。目前,我不认为有任何排序的输出

我试过:

gmix.means_ = np.sort(gmix.means_, axis = 0)
但是gmix.covars和gmix.weights也需要进行相应的排序,这就是我被卡住的地方

非常感谢

2016年4月5日编辑:


谢谢你的帮助,让我朝着正确的方向前进。这是我写得很差但很有效的版本:

    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坐标对簇进行排序,您可能需要自己进行排序。这包括两个步骤,就像你在问题中提到的:

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]])
如果您看到,行和列将根据我们的新顺序重新排列

这就是你的平均值和协方差排序


您可能还需要重新标记原始标签,您可以在此处使用答案:

我正在寻找相同的功能。以下是我基于@ed3203代码的解决方案:

def fit_predict_by(clf, X, order_function):
    """
    Sort `clf.fit_predict` by given attribute.

    It ensure that all calls to fit predict will return an array
    sorted by the given attribute. In addition, the `clf` attributes
    `means_`, `covars_`, and `weights_` are also sorted similarly.

    ## Usage

        # Sort by cluster weights
        y = fit_predict_by(clf, X, lambda clf: clf.weights_.argsort())
        # or sort by the `x` value of the mean
        y = fit_predict_by(clf, X, lambda clf: clf.means_.argsort()[:, 0])
    """
    y = clf.fit_predict(X)
    order = order_function(clf)

    for attr in ('means_', 'covars_', 'weights_'):
        sorted_attr = getattr(clf, attr)[order]
        setattr(clf, attr, sorted_attr)

    ensure_no_overlap = len(order)
    for new_val, old_val in enumerate(order):
        y[y == old_val] = new_val + ensure_no_overlap
    return y - ensure_no_overlap

由于scikit学习版为0.23.1,正确的方法是对精度和精度进行重新排序。另外,covars现在是协方差。 因此,对于1D版本,您应该这样做:

order = best_gmm.means_.argsort(axis=0)[:, 0]
best_gmm.means_ = best_gmm.means_[order]
best_gmm.covariances_ = best_gmm.covariances_[order]
best_gmm.weights_ = best_gmm.weights_[order]
best_gmm.precisions_ = best_gmm.precisions_[order]
best_gmm.precisions_cholesky_ = best_gmm.precisions_cholesky_[order]

谢谢你的帮助,让我朝着正确的方向前进。这是我写得很差但很实用的版本:`sort\u index=gmix.means.argsort(axis=0)order=sort\u index[:,0]print('\norder:',order)gmix.means=gmix.covars.means[order,:]gmix.covars[order,:]print(“\n sorted gmix.covars\n”,gmix.covars)print(“\n\nori gmix.weights\n”,gmix.weights_u2;w=np.split(gmix.weights_2;,3)w=np.asarray(w)w=np.ravel(w[order,:])gmix.weights_2;w=
order = best_gmm.means_.argsort(axis=0)[:, 0]
best_gmm.means_ = best_gmm.means_[order]
best_gmm.covariances_ = best_gmm.covariances_[order]
best_gmm.weights_ = best_gmm.weights_[order]
best_gmm.precisions_ = best_gmm.precisions_[order]
best_gmm.precisions_cholesky_ = best_gmm.precisions_cholesky_[order]