非常にスパースなデータに対して、K最近傍アルゴリズムを実装しています。テストインスタンスとトレーニングセット内の各サンプルの間の距離を計算したいのですが、混乱しています。
トレーニングサンプルのほとんどの機能がテストインスタンスに存在しないか、その逆であるためです(機能がありません)。
この状況で距離を計算するにはどうすればよいですか?
非常にスパースなデータに対して、K最近傍アルゴリズムを実装しています。テストインスタンスとトレーニングセット内の各サンプルの間の距離を計算したいのですが、混乱しています。
トレーニングサンプルのほとんどの機能がテストインスタンスに存在しないか、その逆であるためです(機能がありません)。
この状況で距離を計算するにはどうすればよいですか?
問題を正しく理解していることを確認するために、各サンプルは非常にまばらに満たされたベクトルを形成します。欠損データはサンプル間で異なるため、ユークリッドまたはその他の距離メトリックを使用してサンプルの類似性を測定することは困難です。
それがシナリオである場合、私はこの問題が以前に機械学習 (Netflix の賞品コンテスト) で発生したのを見たことがありますが、特に KNN には適用されませんでした。シナリオは非常によく似ていました。各ユーザー プロファイルにはいくつかの映画の評価がありましたが、17,000 本の映画すべてを見たユーザーはほとんどいませんでした。平均的なユーザー プロファイルは非常にまばらでした。
問題を解決する方法は人によって異なりますが、私が覚えている方法は、欠損値にダミー値を差し込んだことです。通常は、データを含むすべてのサンプルの特定の値の平均です。次に、通常どおりユークリッド距離などを使用しました。そのフォーラムでは、この欠損値の問題に関する議論を今でも見つけることができます。これは、特異値分解を実装しようとする人にとって特に一般的な問題であり、非常に人気があり、私の記憶が正しければかなり議論されました。
ここから始めることをお勧めします: http://www.netflixprize.com//community/viewtopic.php?id=1283
少し掘り下げる必要があります。Simon Funk はこれに対して少し異なるアプローチをとっていましたが、それは SVD に特化したものでした。ここで見つけることができます: http://www.netflixprize.com//community/viewtopic.php?id=1283 関連するセクションにスキップしたい場合、彼はそれらを空白と呼びます。
幸運を!
非常に高次元の空間で作業する場合。利用可能なすべてのデータに対してSVD、LDA、pLSVなどを使用してスペース削減を行い、そのように変換されたトレーニング済みデータに対してアルゴリズムをトレーニングすることをお勧めします。これらのアルゴリズムのいくつかはスケーラブルであるため、Mahoutプロジェクトで実装を見つけることができます。特に、デバッグと特徴選択が簡単なため、このような変換よりも一般的な特徴を使用することを好みます。そのような目的のために、いくつかの機能を組み合わせ、ステマーを使用し、より一般的に考えてください。