2017-05-20 7 views
-3

私はk-meansメソッドを実装するためにsklearnを使いました。 k-meansクラスには、 "predict"というメソッドがあります。訓練されたサンプルに基づいて新しいサンプルを予測する。sklearn kmeans.predictメソッドdosnt work correct

from sklearn.datasets import make_blobs 
from matplotlib import pyplot as plt 
from sklearn.cluster import KMeans 
from sklearn.metrics import adjusted_rand_score 
''' 
make sample 
''' 
X, y=make_blobs(n_samples=100, n_features=2, centers=3) 

''' 
kmeans 
''' 
kmeans_obj=KMeans(n_clusters=3) 

#train 
kmeans_obj.fit(X) 

#labels: 
labels=kmeans_obj.predict(X) 


''' 
output 
''' 
plt.scatter(X[:,0], X[:,1], c=labels) 
plt.show() 

''' 
generate new samples and predict them 
''' 
while True: 
    ''' 
    perdict kmeans?!?!?!? 
    ''' 
    new_X, new_y=make_blobs(n_samples=50, n_features=2, centers=4) 

    perdict_new_sample_lables=kmeans_obj.predict(new_X) 

    plt.scatter(X[:,0], X[:,1], c=labels) 
    plt.scatter(new_X[:,0], new_X[:,1], c=perdict_new_sample_lables, marker="x") 
    plt.show() 

時にはそれがOKに動作します:enter image description here

時にはそれがない:絵でenter image description here

円形状はデータセットを訓練されています。絵の十字形は予測した新しい要素です。

ここでの問題は、決定的で非決定的な結果ではありません。すべての実行で非決定論的なアルゴリズムの出力変化で。ここの結果は完全に間違っています!! in picture 2紫色の十字は緑色でなければならない

+0

問題はであるあなたの 'true'をwhileループ。その中で 'make_blobs()'を使ってテストデータを生成しています。このテストデータはトレーニングデータと一致しないため、一致しません。最初にすべてのデータを生成し、列車とテストに分割する必要があります。 'make_blobs'メソッドを使うたびに、新しいデータが古いデータと一致しないことがあります。これがあなたにとって意味をなさないことを願っています。また、クラスタリングの基本をブラッシュアップする必要もあります。 –

答えて

1

K平均は決定論的なアルゴリズムではなく、クラスタの割り当てはデータの分布とアルゴリズムのランダム性によって異なります。 k-meansのrandom_stateパラメータを使用するrandom.seed()関数を使用してシードを設定することで、この問題に対処することができます。このの詳細については以下のページを参照してください:

+0

ここでの問題は、結果の決定論的、非決定的ではありません。すべての実行で非決定論的なアルゴリズムの出力変化で。ここの結果は完全に間違っています!! pic2の紫色の十字は緑色でなければなりません。 –

+0

申し訳ありませんが、私は前に質問の最後にあなたのメモを気付かなかった。しかし、密接な検査の後、私はそれが予測との間違いではないと思う、それはラベル付けの問題である。ラベルはトレーニングセットとテストセットの間で一貫していません。 Matlabのk-meansの実装では非常に一般的です。私は前にシキットでそれを遭遇したことはありません。しかし、scikitのLabelEncoder(http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.LabelEncoder.html)を見てください。 – manojps