2017-01-24 4 views
1

上のクラスタリングがデータセットのクラスタリングは、(私はScikitを学ぶ使用しています)このenter image description hereKは私がKを使用する必要が不均一なサイズのクラスター

のように見えます。しかし、私は適用されたときにKが、それは私に重心を与えるものではありません意味意味意味予想通り。間違って分類されます。 また、私がscikitで正しく分類されていないポイントを知りたければ、そのアイデアはどのようになるでしょうか。 ここにコードがあります。

km = KMeans(n_clusters=3, init='k-means++', max_iter=300, n_init=10) 
km.fit(Train_data.values) 
plt.plot(km.cluster_centers_[:,0],km.cluster_centers_[:,1],'ro') 
plt.show() 

ここでtrain_dataはパンダフレームであり、2つのフィーチャと3500サンプルを持ち、コードは以下のようになります。

enter image description here

ため、私は初期の重心の悪い選択で起こったかもしれないけど、何が解決策になるだろうか?

+0

私の結果です。 – Farseer

+0

@Farseer私はそれを追加しました。 – Hima

答えて

1

私はこれに対する解決策を得ました。 問題はスケーリングです。 あなたのコードが提供してください、私はちょうど

sklearn.preprocessing.scale 

を使用して、両方の軸をスケーリングされ、これは enter image description here

0

まず、X軸とY軸の範囲が両方の図で異なっていることに気付きましたら幸いです。だから、最初の重心(X値でソート)はそれほど悪くはありません。 2番目と3番目のものは、外れ値の数が多いために得られます。彼らはおそらく両方の右端クラスタの半分を取っているでしょう。また、k-meansの出力は重心の初期選択に依存するので、異なるランがあるかどうかを確認するか、initパラメータをrandomに設定すると結果が改善されます。効率を改善するもう1つの方法は、距離dの半径内にいくつかのn個の隣人を有するすべての点を除去することである。効率的に実装するには、おそらくkd-treeが必要です。ここでsklearnから提供されたDBSCANを使って、それがうまくいくかどうかを確認してください。

また、hereのように、K-Means ++が最初のクラスタとしてアウトライアを選択する可能性があります。したがって、KMeansのinitパラメータを「ランダム」に変更し、複数の実行を実行して最高の重心を取ることができます。

データが2次元なので、ポイントが正しく分類されているかどうかを簡単に知ることができます。マウスを使用して近似セントロイドの座標を選択し(here参照)、選択した座標から得られたクラスターとk-meansから得られたクラスターを比較してください。

+0

すべてを試しました。最初の重心を明示的に設定しようとしましたが、同じ結果が得られました。 – Hima

+0

初期クラスタを明示的に設定しても同じ回答が得られれば、それは外れ値によるもので、k-meansは外れ値に敏感なので何もできません。 DBSCAN、SLINK(Heirarchical)などの他のクラスタリングアルゴリズムを使用するか、k-meansを使用する必要がある場合は、回答で提案した方法を使用して異常値を削除してデータを変更する必要があります – rajat

関連する問題