4

各列の合計が 1 になるように、約 200 個の 99x20 配列の周波数で構成されるデータ セットがあります。のようなヒートマップを使用してこれらをプロットしましこれた。各配列は非常にまばらで、99 の位置あたり約 1-7/20 の値のみが非ゼロです。

ただし、これらのサンプルを周波数プロファイルがどの程度似ているか (最小ユークリッド距離など) でクラスター化したいと思います。各 99x20 配列を 1980x1 配列に配置し、それらを 200x1980 観測配列に集約しました。

クラスターを見つける前に、を使用してデータを白くしようとしscipy.cluster.vq.whitenました。whiten各列をその分散で正規化しますが、データ配列を平坦化した方法により、すべての頻度がゼロの (8) 列がいくつかあるため、分散はゼロです。したがって、白色化された配列には無限の値があり、重心の検索は失敗します (または重心が 200 個までになります)。

私の質問は、これを解決するにはどうすればよいですか? これまでのところ、私は試しました

  • データを白くしないでください。iterこれにより、k-means は、キーワードを大幅に増やしているにもかかわらず、実行されるたびに異なる重心を与えます (ある程度予想されます) 。
  • フラット化する前に配列を転置します。ゼロ分散列はシフトするだけです。

これらのゼロ分散列の一部を削除しても問題ありませんか? これは何らかの方法でクラスタリングにバイアスをかけますか?

編集:私はまた、自分のホワイトニング機能を使ってみました。

for i in range(arr.shape[1]):
    if np.abs(arr[:,i].std()) < 1e-8: continue
    arr[:,i] /= arr[:,i].std()

これは機能しているように見えますが、これが何らかの方法でクラスタリングにバイアスをかけているかどうかはわかりません.

ありがとう

4

2 に答える 2

3

まず第一に、定数列を削除することは完全に問題ありません。明らかに、それらは情報を提供しないので、それらを保持する理由はありません。

ただし、K-meansは、スパースベクトルには特に適していません。問題は、結果として得られる「重心」がクラスターメンバーよりも互いに類似している可能性が高いことです。スパースデータでは、すべてのオブジェクトが外れ値をある程度拡張していることを確認してください。また、K-meansは、二乗の合計を最小化しようとするため、外れ値に非常に敏感です。

次のことを行うことをお勧めします。

  1. ドメインで機能する類似度を見つけます。特定のユースケースの類似性をキャプチャする方法について、これにかなりの時間を費やしてください。

  2. その類似性が得られたら、200x200の類似性行列を計算します。データセットは非常に小さいため、階層的クラスタリングなど、数千のオブジェクトに拡張できない高価なクラスタリング手法を実際に実行できます。必要に応じて、OPTICSクラスタリングまたはDBSCANを試すこともできます。ただし、特に、データセットがはるかに大きい場合、DBSCANの方が実際には興味深いものになります。小さなデータセットの場合、階層的クラスタリングは問題ありません。

于 2013-03-22T08:12:06.447 に答える
3

すべて0の列を削除しても、データにバイアスがかかることはありません。N次元のデータがあるが、1つの次元がすべて同じ数である場合、N-1次元のデータがある場合とまったく同じです。この有効次元の特性はランクと呼ばれます。

3Dデータを検討しますが、すべてのデータポイントはx=0平面上にあります。これが2Dデータとまったく同じであることがわかりますか?

于 2013-03-21T16:47:46.637 に答える