我有一个用例,我需要计算很多集合之间的相似性以创建一个简单的推荐引擎。我正在查看 Jaccard 系数和其他相似系数公式,但它们之间有一个共同点:集合内的项目不能重复(如果我在这里错了,请纠正我)。
我在 PHP 中编写了自己的函数来执行自定义哈希交集,其逻辑是:
arr1
:一个数组,其键是项目的 id,值是它们对应的数量。这代表用户的愿望清单。arr2
: 相同,arr1
但它代表另一个用户的库存。- 对于这个自定义交集,我需要的逻辑是愿望清单的所有者不关心卖家是否有 100 个 item1。如果他只想要 4 个,则只计算 4 个。
我需要一种非常快速的方法来使集合相交,但是通常的相似系数公式涉及集合的相交和并集,当将一个集合与 200k 其他集合进行比较时,这可能不像我想要的那么快。这是我目前所处的位置:
function my_similarity_coefficient ($arr1, $arr2) {
$matches = 0;
$total = 0;
if (count($arr2) == 0)
return 0;
foreach ($arr1 as $id => $qty) {
$total += $qty;
if (!array_key_exists($id, $arr2))
continue;
$matches += min($qty, $arr2[$id]); // do not match more than what user wants
}
return $matches / $total;
}
我尝试在 PHP 中交叉两个带红色的散列。尺寸分别是arr1[67]
和arr2[231]
。该系数是在出色的 61.98 微秒(最坏情况下高达 266.075 微秒)下计算得出的。如果我尝试将数据从 Redis 获取到 PHP,这个数字会膨胀到 905.037µsec-3337.86µsec。
我想让瓶颈远离将数据从 redis 传输到 PHP,所以我想知道是否可以在 lua(甚至可能是 c++)中对这个自定义交集进行编程,如果可能的话,它不会受到同样的影响瓶颈,因为它也从pointA到pointB获取它,或者它不会因为数据已经是本地的而遭受获取瓶颈?
我对 lua 不熟悉,但我不希望被准确的代码提供。由于互联网上关于我真正想要实现的目标的 lua 资源很少,所以我想在搜索时先在这里挑选一些大脑。