java - Mahout 如何存储用户首选项以实现快速相似性计算?它是如何工作的?

标签 java data-structures machine-learning mahout recommendation-engine

我正在为一个学校项目编写一个小型推荐系统,我应该在其中根据用户行为寻找项目之间的相似性。我已经尝试过 Mahout,真正令人印象深刻的是即使在非常大的数据集上,它也能够极快地计算两个用户或项目之间的相似性。我搜索了 Mahout in Action 一书,但没有找到确切的答案。作者展示了所用类的名称,而不是机制。因此,我尝试遵循相同的数据表示,但是在计算两个项目之间的相似度时,它非常耗时。我有两个 int 每个用户的首选项数组,还有另外两个得分数组。

我使用散列来确定 userPreference 数组之间的交集并快速计算欧几里德相似度,如下面的代码所示,但没有任何成功。我需要帮助:(

Item item1 = (dataModel).getItem(item1_ID);
Item item2 = (dataModel).getItem(item2_ID);
int[] i1_users = item1.getUsersId();
int[] i2_users = item2.getUsersId();
float[] i1_scores = item1.getScore();
float[] i2_scores = item2.getScore();
IntFloatOpenHashMap tempHash = new IntFloatOpenHashMap();
for (int i= 0; i < i1_u.length; ++i)
  tempHash.put(i1_users[i], i1_scores[i]);

  for (int i = 0; i < i2_users.length; i++)
  {
    if (tempHash.containsKey(i2_users[i])) {
      diff = tempHash.get(i2_users[i]) - i2_scores[i];
      dist += diff * diff;
    }
  }
 // return Math.sqrt(dist);

最佳答案

无论您尝试根据偏好值计算什么(项目相似度或用户相似度),您都可以提高代码速度。您的代码的时间复杂度为 O(N^2),但 Mahout 的时间复杂度为 O(N)。

你可以检查实现:

基本上您可以并行迭代两个用户 ID 数组,并且您还可以避免创建 tempHash。您在空间和时间方面都获得了 yield 。希望对您有所帮助。

关于java - Mahout 如何存储用户首选项以实现快速相似性计算?它是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24677251/

相关文章:

java - 在 BlackBerry 上播放声音的问题

java - JdbcTemplate 嵌套查询的问题

database-design - 如何在磁盘或数据库上存储稀疏可查询矩阵?

machine-learning - 训练过程中出现Nans的常见原因

opencv - 如何减小 opencv 中学习模型的大小(对于 CvBoost)?

python - 在 Python 中处理/显示极大的值

java - 每次添加新轨道时递增计数器,并始终选择尚未分配的最小值 (>=1)

java - 扩展 ByteArrayOutputStream 时 eclipse 中的资源泄漏警告

java - 封装如何在链表中工作

Java PriorityQueue 和 Comparable 接口(interface)