k-meansの実装をどのようにテストしますか?


11

免責事項:この質問をStackoverflowに投稿しましたが、このプラットフォームにはこれがより適していると思いました。

多次元データセットの独自のk-means実装をどのようにテストしますか?

データに対して既存の実装(つまり、Matlab)を実行し、結果を私のアルゴリズムと比較することを考えていました。しかし、これには両方のアルゴリズムがほぼ同じように機能する必要があり、2つの結果の間のマッピングはおそらく簡単ではありません。

もっと良いアイデアはありますか?

回答:


10

k-meansには確率論的コンポーネントが含まれているため、まったく同じ実装で同じ開始構成を使用しない限り、同じ結果が得られる可能性はほとんどありません。ただし、結果がよく知られている実装と一致しているかどうかを確認できます(Matlabについては不明ですが、Rでのk平均アルゴリズムの実装は十分に説明されています。Hartigan&Wong、1979を参照してください)。

2つのシリーズの結果を比較する場合、複数回実行するとラベルスイッチングに問題が残ります。繰り返しになりますが、e1071 Rパッケージには、matchClasses()双方向分類表の2つのカテゴリ間の「最適な」マッピングを見つけるために使用できる非常に便利な関数(; )があります。基本的には、列との一致を最大化するように行を再配置するか、貪欲なアプローチを使用して、対角線上の合計(生の一致)が最大になるまで行と列を並べ替えます。カッパ統計のような一致係数も提供されます。

最後に、実装のベンチマーク方法については、自由に利用できるデータがたくさんあります。または、専用のデータセットをシミュレーションできます(たとえば、有限混合モデルを通じて、MixSimパッケージを参照してください)。


こんにちは、回答ありがとうございます。必要な場合は、SOでも同じ質問に答えることができ、そこでも受け入れます。=> stackoverflow.com/questions/4280371/...
Framester

(+1)最初の段落はすぐに問題の核心になります。
whuber

6

テストで取得する情報は3つのタプルのセットとして表すことができるため、2つの結果セット間のマッピングは簡単に計算できます。最初のコンポーネントは(多次元)ポイント、2番目は(任意の)クラスターラベルです。アルゴリズムによって提供され、3番目は、参照アルゴリズムによって提供される(任意の)クラスターラベルです。を構築kkラベルペアの分類表:結果が一致する場合、置換行列の倍数になります。つまり、各行と各列にはゼロ以外のセルが1つだけ必要です。それはプログラムするための簡単なチェックです。また、この理想から個々のデータポイントまでさかのぼって小さな偏差を追跡することも簡単です。これにより、2つの答えがまったく異なる場合に、それらがどのように異なるかを正確に確認できます。合意の統計的測度を計算するのは面倒です。完全な合意がある(順列まで)かそうでないか、そして後者の場合、それらが発生する方法を理解するためにすべての不一致のポイントを追跡する必要があります。結果は一致するか、一致しません。意見の相違があっても、1点だけでもチェックする必要があります。

テストにはいくつかの種類のデータセットを使用できます。(1)公開されたk-means結果を含む公開されたデータセット。(2)明らかに強いクラスターを持つ合成データセット。(3)明白なクラスタリングのない合成データセット。(1)あなたが書いたときに使用するのは良い規律ある任意の数学や統計プログラムを。(2)は、クラスターの中心として機能するいくつかのランダムな点を生成し、クラスターの中心を比較的少量ランダムに変位させることによって点群を生成するなど、さまざまな方法で簡単に実行できます。(3)予期しない動作を明らかにする可能性のあるランダムチェックを提供します。繰り返しますが、これは一般的なテストのよい規律です。

さらに、極端なソリューション間の境界に位置するだけでアルゴリズムにストレスをかけるデータセットの作成を検討してください。これには、創造性とアルゴリズム(おそらくあなたが持っていると思います!)の深い理解が必要です。あらゆるイベントで確認したい例の1つは、形式がのベクトルのセットですここで、はゼロ成分のないベクトルで、は連続する整数値とります。また、正多角形を形成するベクトルのセットのアルゴリズムを確認したいと思います。いずれの状況においても、ケースでない複数の場合を含む、特に興味深いivvi0,1,2,,n1nkn未満です。これらの状況に共通するのは、(a)問題のすべての次元を使用するが、(b)正しい解決策は幾何学的に明白であり、(c)複数の正しい解決策があることです。k

(ランダムに選択された2つの非ゼロベクトルとから開始して、ランダムな正多角形を次元で形成します(コンポーネントを独立した標準正規変量にすることをお勧めします)。それらをユニット長にするために、これらのおよび呼び出しましょう。式を使用して、からコンポーネントを削除しますd2uv2dxzxz

w=z(zx)x.

を再スケーリングして単位長になるようにして取得します。必要に応じて、と両方をランダムに均一に再スケーリングします。ベクトルおよびは、次元のランダムな2D部分空間の直交基底を形成します。個の頂点の正多角形は、のセットとして取得され、整数範囲はから。)ywxyxydncos(2πk/n)x+sin(2πk/n)yk0n1


(+1)関連する合成データを生成するための可能な方法についてのあなたのコメントは大歓迎です。
2010年

2

非常に単純な「素朴な」アプローチの1つは、単純な合成データを使用することです。これは、すべての実装で同じクラスターが生成されるためです。

Pythonでの例import numpy as np

test_data = np.zeros((40000, 4))
test_data[0:10000, :] = 30.0
test_data[10000:20000, :] = 60.0
test_data[20000:30000, :] = 90.0
test_data[30000:, :] = 120.0

以下のためにn_clusters = 4それはあなたの順列を与える必要があります[30, 60, 90, 120]


0

k-meansにはランダムに選択された決定(初期化部分のみ)が含まれているため、アルゴリズムを試す最善の方法は、初期点を選択し、それらを最初にアルゴリズムに固定してから、アルゴリズムの別のソースコードを選択することです。同じ方法でポイントを修正します。次に、実際の結果を比較できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.