3

私はOpenCVのPythonインターフェースを使用して、多次元データ(通常は7次元)のK-Meansクラスタリングを実行しています。クラスターに対して奇妙な結果が得られています。n個のクラスター(インデックス0からn)を要求する場合、一部のクラスターにはポイントが割り当てられていません。その結果、クラスターが予想よりも少なくなります。誰かがOpenCVのpythonK-Means実装をうまく使用しましたか?いくつかのユーザーエクスペリエンスまたはアドバイスが最も役立ちます。

これが私のPython実装のコードスニペットです:

points = cv.CreateMat(dim1, dim2, cv.CV_32FC2)
clusters = cv.CreateMat(dim1, 1, cv.CV_32SC1)
for a in range(0,dim0):
   for b in range(0,dim1):
       for c in range(0,dim2):
           #print float(list[a*dim1*dim2 + b*dim2 + c])
           cv.Set2D( points, b, c, float(list[a*dim1*dim2 + b*dim2 + c]) )
cv.KMeans2(points, numClusters, clusters, (cv.CV_TERMCRIT_EPS + cv.CV_TERMCRIT_ITER, 100000, 0.00000001), 50)

for d in range(0,dim1):
    f.write(str(int(clusters[d,0])))
    f.write(' ')
    f.write('\n')

よろしく、

ステファン

4

1 に答える 1

0

これは望ましいプロパティである可能性があり、実装ごとに異なります。

これがどのように起こるか: ランダムに初期化された場合、またはロイド反復を使用している場合、クラスターがすべてのオブジェクトを失う可能性があります。MacQueen k-means では、常に少なくとも 1 つのオブジェクトを保持する必要があります。1d では、クラスター c1 に割り当てられた (とりわけ) 1 と 2 のオブジェクトがあるとします。クラスタ c1 の平均は 1.5 です。ここで、平均値が 0.6 と 2.4 に移動する他の 2 つのクラスターがある場合、これら 2 つのオブジェクトは再割り当てされ、クラスター c1 は突然空になります。

これが望ましい理由: の最適な値が事前にわかっていないと仮定するkと、大きすぎる k を選択して、一部のクラスターが縮退するかどうかを確認することができます。

ただし、ほとんどの場合、これはデータセットが k-means で機能しないことを示しています。K-means は実際にはかなりうるさいですが、それでも十分に機能することが多いのは驚くべきことです。一般に、k-means は、サイズが異なるが互いに近いクラスターを好みません。k-means は常に途中で分割されるためです。さらに、あなたの特定のケースでkは、おそらく高すぎます

これは、k-means が好まない状況を 1 次元で示したものです: (A と B はそれらのクラスターのオブジェクトです。2 行目は真の平均と 2 つの平均の中間の分割を示します。k-means はその後、再割り当てと分割を行います。さらに左へ。

AAAAAAAAAAAAA BBBBB
      A    |    B
于 2012-06-14T16:12:39.533 に答える