各列の合計が 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()
これは機能しているように見えますが、これが何らかの方法でクラスタリングにバイアスをかけているかどうかはわかりません.
ありがとう