逆辞書!ポイントをとしてゼロ以外の値(つまり、特徴がtrueに対応する)に対応するキーです。要素のストレージの平均サイズはます。確かに、フィーチャを格納するための文字列と、値を保持するための浮動小数点のみが必要です。xfeat1:value1,feat101:value101KKK
各機能について、この機能を共有するインデックスを保持する辞書を作成します。うまくいけば、この数はあまり大きくなりません(すべてのインデックスで共有される機能がある場合、このアプローチは台無しになり、ここで読むのをやめることができます)。
この辞書は、次のようになります。速度を上げてスペースを節約したい場合は、1つの要素(ここでは)でのみ検出される機能を削除することもできます。これらの機能は近接ペアを生成しないためです。この辞書は操作に組み込まれています。feat1:{1,101,202},feat2:{7,202},feat3:{202}...featM:{3,45,6}feat3O(NK)
さて、あなたは要素の距離評価したいとき他の人には、(辞書)を有する少なくとも一つの特徴を共有インデックスのリストを生成。他のすべての要素はから離れていることを知っています(1つの機能さえ共有していません!)。「機能ごとの要素」の平均数が少ない場合(と呼びます)、である必要はありません。x x P O (N 2)xxxPO(N2)
演算では、およびキーを反復してまたはを評価できるためおよびも辞書として表される場合、もう1つの大きな改善があります。y d (x 、y )< x 、y > x y O (K )xyd(x,y)<x,y>xyO(K)
最終的な複雑さは、単純な初期アプローチではなく、です。O (M N 2)O(NPK)O(MN2)
この方法を適用して、大規模なテキストセット(トレーニング:20000 000行、テスト35 000行、機能数:10 000、要素あたりの平均機能数:20)にKNNを実装しました。これは約1時間で実行されました。 。