web-dev-qa-db-ja.com

1D数値配列クラスタリング

可能性のある複製:
1次元データを最適にクラスター化しますか?

だから私はこのような配列を持っているとしましょう:

[1,1,2,3,10,11,13,67,71]

配列をこのようなものに分割する便利な方法はありますか?

[[1,1,2,3],[10,11,13],[67,71]]

私は同様の質問に目を通しましたが、ほとんどの人は scipy のようにk-meansを使用してポイントをクラスター化することを提案しました。また、k-meansは2次元以上のクラスタリングに適していると思いますか? N個の数字の配列を、数字に応じて多くのパーティション/クラスタリングに分割する方法はありますか?

厳密な範囲分割を提案する人もいますが、必ずしも期待どおりに結果をレンダリングするとは限りません

59
E.H.

1次元の問題に多次元クラスタリングアルゴリズムを使用しないでください。単一のディメンションはmuchよりも特別なものです。実際にsortできるので、物事がずっと簡単になります。

実際、通常はクラスタリングとも呼ばれませんが、たとえばセグメンテーションまたは自然中断の最適化。

Jenks Natural Breaks Optimization および同様の統計的手法をご覧ください。 カーネル密度推定も、統計的な背景が強いため、調べるのに適した方法です。密度の局所的最小値は、データをクラスターに分割するのに適した場所であり、統計的な理由があります。 KDEは、おそらく1次元データをクラスタリングするための最も適切な方法です。

KDEを使用すると、1次元データがより適切に動作することが再び明らかになります。 1Dでは、極小値があります。しかし、2Dでは、サドルポイントとそのような「多分」の分割ポイントがある場合があります。これを参照してください Wiki点のウィキペディアの図 、そのような点がクラスターを分割するのに適切である場合とそうでない場合があるので。

94
Anony-Mousse

離散化アルゴリズムを探すことができます。 1D離散化の問題は、あなたが求めているものとよく似ています。頻度、ビニング戦略などに従って、カットオフポイントを決定します。

weka は、離散化プロセスで次のアルゴリズムを使用します。

weka.filters.supervised.attribute.Discretize

fayyad&IraniのMDLメソッドまたはKononekoのMDL基準のいずれかを使用します

weka.filters.unsupervised.attribute.Discretize

シンプルなビニングを使用

4
Atilla Ozgur