algorithm - 设计相似度表

标签 algorithm data-structures machine-learning information-retrieval

我想不出更好的方法来解决以下问题...? 想象一下,我有一个大表,其中的行和列是某种 id ..让我们说书 id

book_id-->1    2     3     .....
  1       1   0.92    0.33
  2
  3

此表中的条目告诉您每本书的相似程度。 所以从上表来看...书 1 和书 2 的相似度指数为 0.92。

所以,我已经在银行端计算了这个……让我们说“n”个条目。

从 n+1 开始,数据是实时的..

所以我要做的第一步是填充这个新行。这是一个非常幼稚的方法。

 i = 0; i < total_books ; i++
    sim(book(n+1),book(i)) 

可以说计算任何书籍相似度的计算都非常快。 但是由于这必须发生“n”次,因此加起来..

如果有“m”本新书,那么它是一个 n^2 操作(我认为)。 是否有更好的算法/数据结构可以使这种计算可接受。

此外,只是为了填充一些背景。 这种相似性不过是两个向量之间的点积。 (谷歌搜索余弦相似度会给出一个想法)。但这没什么特别的……只是在两个向量之间取点积……它会返回一个介于 0 和 1 之间的值。

最佳答案

当你将 1 本书添加到 n 本书的集合中时,它会执行 n 个操作 当您将 m 本书添加到 n 本书的集合中时,它会执行 (n) + (n+1) + ... (n+m-1) 操作(待验证):n*m + (1+ 2 + ... (m-1)) 所以它应该是 O(n*m + m*m)。

如果您以一种天真的方式实现了您的解决方案,则仅当 id(book_i) < id(book_j) 时,您可以通过计算和存储 sim(book_i,book_j) 来将计算时间减半(这不会改变复杂性)。 然后,当您想要检索 sim(i,j) 时,您只需确保以正确的顺序使用参数。

关于algorithm - 设计相似度表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10159720/

相关文章:

java - 如何在我的对象层次结构中找到循环?

java - 将数据保存在内存中,设计方法

data-structures - 我可以在没有所有者移动或不安全的情况下遍历单向链表吗?

machine-learning - Keras 中的自定义损失函数用于惩罚漏报

python - 人脸识别keras维数问题

python - 如何找到用于查找数组中缺失数字的数学表达式

python - 为什么这个 `else` block 可以工作,但它与 `if` 的情况不在同一级别?

C 中带有缓冲环的 Char 链表

algorithm - 我们可以像估算 Big O 那样估算 Big Omega 吗?

machine-learning - 具有余弦距离的 K 均值