深入研究 Spark 的 ALS 推荐算法

Hu 等人提出的 ALS 算法是推荐系统问题中非常流行的技术,尤其是当我们有隐式数据集(例如点击、喜欢等)时。它可以相当好地处理大量数据,我们可以在各种机器学习框架中找到许多很好的实现。Spark 将该算法包含在 […]

来源:DatumBox - 机器学习、统计和软件开发博客

Hu 等人提出的 ALS 算法是推荐系统问题中非常流行的技术,尤其是当我们有隐式数据集(例如点击、喜欢等)时。它可以相当好地处理大量数据,我们可以在各种机器学习框架中找到许多很好的实现。Spark 将该算法包含在 MLlib 组件中,该组件最近进行了重构,以提高代码的可读性和架构。

Hu 等人

Spark 的实现要求 Item 和 User id 是整数范围内的数字(整数类型或整数范围内的 Long),这是合理的,因为这可以帮助加快操作速度并减少内存消耗。不过,我在阅读代码时注意到的一件事是,在 fit/predict 方法的开头,这些 id 列被转换为 Double,然后转换为 Integer。这似乎有点不合时宜,我发现它给垃圾收集器带来了不必要的压力。以下是将 ID 转换为双精度值的 ALS 代码行:

ALS 代码

要了解为什么这样做,需要阅读 checkedCast():

此 UDF 接收 Double 并检查其范围,然后将其转换为整数。此 UDF 用于 Schema 验证。问题是我们是否可以在不使用丑陋的双精度转换的情况下实现这一点?我相信可以:

我相信可以

上面的代码显示了修改后的 checkedCast(),它接收输入,检查断言该值是否为数字,否则引发异常。由于输入是 Any,我们可以安全地从其余代码中删除所有转换为 Double 的语句。此外,由于 ALS 要求 id 在整数范围内,因此大多数人实际上使用整数类型,这是合理的。因此,在第 3 行,此方法明确处理整数以避免进行任何转换。对于所有其他数值,它会检查输入是否在整数范围内。此检查发生在第 7 行。

  • 值为字节或短整型。
  • 值为长整型但在整数范围内。
  • 代码