【问题标题】:designing a similarity table设计相似度表
【发布时间】:2012-04-26 22:23:00
【问题描述】:

我想不出更好的方法来解决以下问题...? 想象一下,我有一张大桌子,其中的行和列是某种 ids.. 假设是 book 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 之间的值。

【问题讨论】:

  • 如果您想要相似度度量的笛卡尔平方,那么我看不出如何将其减少到 O(n^2) 之外。但是,如果您有其他目标,例如识别新文档的​​相似性 > X,那么文献中已经开始出现一些有趣的方法。你想做什么?

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


【解决方案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)

【讨论】:

  • 嗯..你能详细说明一下吗。为什么我要在 book_i id
  • 假设 sim() 是对称的,即 sim(a,b)==sim(b,a)。所以你只需要在 a
猜你喜欢
  • 1970-01-01
  • 2011-10-06
  • 1970-01-01
  • 2015-05-24
  • 1970-01-01
  • 2015-05-28
  • 2012-03-11
  • 2019-08-05
相关资源
最近更新 更多