2016-04-01 22 views
1

私は(n_sample x 2)の配列を持ち、sklearn.neighbors.KDTreeのKDTreeを使ってクラスタリングしたいと思います。Clusterint 2Dポイントはsklearn KDTreeを使用しています

私はこのコードのサンプル片を持っている:

from sklearn.neighbors import KDTree 
import numpy as np 
np.random.seed(0) 
X = np.random.random((10, 2)) 
tree = KDTree(X, leaf_size=2) 

は今、私は、各リーフは、クラスタになるように、ツリーの葉でポイントを抽出したいです。同じリーフにあるポイントは、同じクラスタに属します。

上記の例では、最大のleaf_sizeが2であるため、約10/2 = 5のクラスタを使用します。

私が望むのは、Xのポイント(X [0]など)が与えられれば、そのポイントが属するツリーのリーフのインデックスをツリーに与えることができるということです。

+1

kdツリーはクラスタリングにはあまり適していません。 –

+0

私の場合ではありませんが、KDツリーは、必要なクラスタリングのタイプに適しています。このペーパーhttp://aclweb.org/anthology/P15-2104に記載されています。 – Ash

+1

私はそれに "クラスタリング"という用語を使用しません。これは適応グリッドです。リーフ以外のユーザーが何をしているかは言及していません。メジアン分割だけでkdツリーなしでこれを表現し実装するのは簡単です。 –

答えて

1

リーフの最大サイズ2は、リーフあたりn人からn/2人までの任意の場所に配置できることを意味します。しかし、あなたは非リーフノードを忘れてしまった。

kd-treeは、ルートに1つの要素、2番目の層に2つの要素(ではなく、)を持ち、残りの7つのオブジェクトで4つのリーフノードを持ちます。だから、葉だけを見ると、3つのオブジェクトが失われました。

kd-treeはポイントをクラスタ化しようとしません。 kd-treeが2つのノードで全く同じ座標を持つことは完全に正しいです!あなたが与えたリファレンスは、適応グリッドを得るためだけにkdツリーを使いました。私はそれが非常に良いアプローチだとは思わないが、それは非常にです。完全にツリーを構築するのではなく、オブジェクトを非リーフノードに配置しないように、自分で実装するだけです。

0

でインストールすることができ、このパッケージkdtree in Pythonあり:

pip install --user kdtree 

および2D点をクラスタリングするために使用することができます。

関連する問題