有一个产品特征矩阵。它有数千行(产品)和数百个功能。它具有显示产品是否具有此功能的二进制值。所以它可能是一个有 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-tree 索引。Oracle 位图索引可能会有所帮助,但我不能使用 Oracle。
目前,我们正在使用 MySQL 来完成这项任务,但效果并不理想。实际上,我们使用整数表示(我们对特征进行分组并将整数存储在列中,而不是布尔值)来减少列的数量。
可以将此矩阵视为稀疏二进制矩阵。而且完全存储在内存中也不是什么大问题。我想知道是否可以应用一些算法来处理稀疏矩阵、向量空间(SVD、矩阵向量乘法等)。但它可能有助于找到满足向量 Q 的产品,而不是聚合。问题更多在于聚合的时间,而不是空间。
可能,可以将矩阵存储为多链表,这将有助于查找产品并为每一列进行聚合。
最后,问题是如何处理这个任务。找到具有给定特征的产品然后计算具有附加特征的产品(按每列汇总)的最有效算法是什么。