2016-05-03 20 views
1

私は集団に細胞を分類しようとしています。私が使用する場合:sklearn GMM分類予測(コンポーネント割り当て)

gmix = mixture.GMM(n_components=3, covariance_type='full') gmix.fit(samples)

を以下のコードから手段の出力は、順序の変更、Iは設定しない限り: np.radom.seed(0)を。

Iは、X軸、すなわち(各クラスの最初の項目)を意味によってソートクラスたい

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)]

[[ 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:

助けてくれてありがとう、右方向に私を操縦します。

答えて

0

これは基本的に行列/ベクトルインデックスの問題です。私はおそらくあまりにも冗長すぎるかもしれませんが、あなたの行列をソートするのはちょうど2行でなければなりません。

一般的なクラスタリングアルゴリズム(あなたの場合はGMM)は、毎回同じ順序でクラスタにラベルを付けることは保証されません。また、初期条件を修正しない限り、毎回同じクラスターを与えることも保証されません。

クラスタを平均のX座標でソートする場合は、おそらく自分で行う必要があります。これは、あなたの質問に言及しただけのような2つのステップが含まれます。

a)の手段をソートし、インデックスを取得 b)は、次のようにこれは単純に行うことができます

からあなたの手段を抽出するためにインデックスを使用します。

:ご注文はargsorted配列の最初の列になり、あなたの手段

>>> means = np.array(np.mat('1, 2; 4, 3; 2, 6')) 
>>> sort_indices = means.argsort(axis=0) 
array([[0, 0], 
     [2, 1], 
     [1, 2]]) 

A)でください

>>> order = sort_indices[:,0] 
>>> order 
array([0, 2, 1]) 

(b)ここでは、この「注文」を使用して手段の順序を変更します。

>>> sorted_m = means[order,:] 
>>> sorted_m 

array([[1, 2], 
     [2, 6], 
     [4, 3]]) 

とあなたの共分散、私たちはダミーの共分散行列作成してみましょう:あなたのCのインデックスを再作成、今

>>> 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]]) 

を、そして簡単な方法は、単にインデックスを再作成することです:

>>> 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

+0

私は正しい方向に助けてくれてありがとう。 ' sort_indices = gmix.means_.argsort(軸= 0) 順= sort_indices [:, 0] 印刷( '\のNORDER::'、順序)ここに私の下手に書かれたが、作業バージョンです gmix.means_ = gmix .means_ [順序,:] gmix.covars_ = gmix.covars_ [順序:] プリント( "\ nはソートgmix.covarsがn \"、gmix.covars_) プリント( "の\ n \海苔gmix。 w = np.plvel(gmix.weights_、3) w = np.asarray(w) w = np.ravel(w [order ,:]) gmix.weights_ = w –

1

を。 @ 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 
関連する問題