製品機能マトリックスがあります。数千の行 (製品) と数百の機能があります。製品にこの機能があるかどうかを示すバイナリ値があります。したがって、40,000 行と 900 列のテーブルになる可能性があります。
Product-feature matrix
pr f1 f2 f3 fn ...
01 0 1 1 1
02 0 0 0 0
03 1 0 1 0
04 1 0 1 0
.....
まず、特定の機能セット QEg Q=(f1=1, f5=1, f27=1) を持つ製品を見つけなければなりません。簡単に言えば、青い車、ハッチバック、3ドアを見つけてください。
Result 1
Given Q=(f1=1, f5=1, f27=1)
Relevant products: 03, 04, 08...
次に、最も重要なことですが、一連の機能 Q を持ち、機能 f_i (ここで i - 1..n) も持つ製品がいくつあるかを見つけなければなりません。つまり、Qを満たす行を選択し、各列に1がいくつあるかを数えます(SUM集計を行います)。たとえば、青い車、ハッチバック、3 ドアには、ディーゼル エンジン、ガソリン エンジン、キセノン ライトも何台ありますか。
Result 2
Given Q=(f1=1, f5=1, f27=1)
sum f2 = 943
sum f3 = 543
sum f4 = 7
sum f6 = 432
....
もちろん、RDBMS を使用してこのタスクを解決することは可能ですが、それほど効果的ではありません。一般に、各列の製品と集計の両方を検索するためにフルスキャンが必要になります。少なくとも、このタスクに効果的な B ツリー インデックスを作成する方法がわかりません。Oracle ビットマップ インデックスは役に立ちますが、Oracle を使用できません。
現在、このタスクには MySQL を使用していますが、良い結果が得られていません。実際には、列の量を減らすために整数表現を使用しています (機能をグループ化し、bool 値ではなく整数を列に格納します)。
このマトリックスをスパース バイナリ マトリックスとして扱うことができます。そして、それを完全にメモリに保存することは大きな問題ではありません。また、いくつかのアルゴリズムを適用して、疎行列、ベクトル空間 (SVD、行列とベクトルの乗算など) を処理できるかどうか疑問に思っています。ただし、集計ではなく、ベクトル Q を満たす製品を見つけるのに役立つ可能性があります。問題は、スペースではなく、集約の時間にあります。
おそらく、製品を見つけて各列の集計を行うのに役立つマルチリンクリストとしてマトリックスを保存することは可能です。
最後に、問題はこのタスクをどのように処理するかです。特定の機能を備えた製品を見つけて、追加機能を備えた製品を数えるための最も効果的なアルゴリズムは何ですか (列ごとに集計)。