私はいくつかの研究をしました。私は、2つの座標系の非メトリック(WGS84)とメトリック(ポーランド1992)でいくつかの点を取った。
私はこのコードを使用しました:
from scipy import loadtxt
from sklearn.cluster import Birch
import matplotlib.pyplot as plt
data84 = loadtxt("/home/damian/workspace/84.csv", delimiter=",")
data90 = loadtxt("/home/damian/workspace/90.csv", delimiter=",")
brc = Birch(threshold=0.5)
次に、モデルをメトリックデータに適合させます。
brc.fit(data90)
そして、結果をプロットします。ここで、十字は私の点であり、円は私のサブクラスターでした。
c = brc.subcluster_centers_
plt.plot(data90[:,0], data90[:,1], '+')
plt.plot(c[:,0], c[:,1], 'o')
plt.show()
これは私が得たものです:
各ポイントでサブクラスターが見つかったため、しきい値が小さすぎることがわかります。
しきい値の定義:
新しいサンプルと最も近いサブクラスターをマージして得られたサブクラスターの半径は、しきい値より小さくなければなりません。それ以外の場合は、新しいサブクラスターが開始されます。
この場合、この値を増やす必要があります。
にとって:
brc = Birch(threshold=5000)
それははるかに優れていました:
そして、しきい値0.5のWGS84ポイント:
brc = Birch(threshold=0.5)
brc.fit(data84)
サブクラスターは1つだけです。ただし、この場合はしきい値を下げる必要があるため、0.05の場合:
brc = Birch(threshold=0.05)
brc.fit(data84)
良い結果が得られました。
結論:
CRSは重要です。適切なしきい値を見つける必要があります。これは、データ座標系とポイント間の距離によって異なります。非メトリックCRSがある場合、しきい値はメトリックシステムの場合よりも比較的小さくする必要があります。メートルと度の違いを知る必要があります。2点間の距離が10000mの場合、WGS84では1度未満になります。より正確な値については、Googleを確認してください。
また、n_clusters値よりも多くのポイントがあります。大丈夫です。クラスターの重心ではなく、サブクラスターがあります。何かを予測したり、ラベルを印刷したりすると、ポイントがn_clusters領域の1つに分類されます(または0、1、2、...、n_clustersラベルに分類されたポイントを印刷します)。
別のパラメータを試したくない場合は、いつでも別のアルゴリズムを使用できます。クラスタリングの非常にシンプルで一般的なアルゴリズムは、K平均アルゴリズムです。
http://scikit-learn.org/stable/modules/generated/sklearn.cluster.KMeans.html
しきい値などを気にせずに、データのn個のクラスターを見つける必要があります。