【问题标题】:How to store sets, to find similar patterns fast?如何存储套装,快速找到相似的图案?
【发布时间】:2010-10-02 12:44:39
【问题描述】:

(这不是作业,也不是工作问题。这只是我个人的兴趣/职业,完全是虚构的。但我对好的算法或数据结构感兴趣。)

假设我会经营一个约会网站。而我的特色将是单曲与电影品味相匹配。 (为什么不呢?)

在这种情况下,我需要一种方法来存储每个用户的电影评分。 (到目前为止没问题。)而且我需要一个数据结构来找到最合适的用户。两种口味模式之间的距离将是两个用户做出的所有评分之间的平均距离。

示例

movies   A B C D E F G H I J K L M ...
user Xm  9 5   1   1   5
user Ym      4 6 1         8
user Zf  9   6 4           7

距离(X,Z) = avg( abs(9-9) + abs(1-4) ) = 1.5

距离(Y,Z) = avg( abs(4-6) + abs(6-4) + abs(8-7) ) = 1.666

因此,X 先生比 Y 先生更适合 Z 女士。

我喜欢...

  • ...不需要对数据库进行太多操作
  • ...不需要处理大量数据
  • ...跑得快
  • ...提供最佳匹配
  • 好的,也许我也会考虑好的近似值。

请记住,这也适用于数千个可能的电影、仅对大约 20-50 部电影评分的用户以及数千个用户。

(因为这是一个心理难题,而不是真正的问题,所以工作安排并没有真正的帮助。)

您的搜索算法或数据结构是什么?

【问题讨论】:

  • 如果我可以问……为什么是 L1?这听起来不太合适。

标签: algorithm data-structures pattern-matching puzzle


【解决方案1】:

听起来很像Netflix Prize 挑战,更具体地说是最流行方法的前半部分。您尝试做的事情的可能实现是多种多样的。它们都不是特别有效,L1 度量对于可靠的相关性来说并不是一个特别好的选择。

【讨论】:

    【解决方案2】:

    看起来您正在电影空间中寻找nearest neighbor。你的距离函数是L1 metric。您可能可以使用某种spatial index。也许你可以使用collaborative filtering 的技术。

    【讨论】:

    • 你是对的。这是一种具有一些 L1 距离函数的最近邻。而且我已经考虑过像 z-order 或 oct-tree 这样的空间索引。但这意味着一张大桌子(思想)几乎是空的。任何空间索引在这样的空表上都会表现不佳。
    【解决方案3】:
    CREATE TABLE data (user INTEGER, movie INTEGER, rate INTEGER);
    
    SELECT  other.user, AVG(ABS(d1.rate - d2.rate)) AS distance
    FROM    data me, data other
    WHERE   me.user = :user
        AND other.user <> me.user
        AND other.movie = me.movie
    GROUP BY
        other.user
    ORDER BY
        distance
    

    复杂度将为 O(n1.5)) 而不是 O(n2),因为将有 nsqrt(n) 电影的比较(平均电影由每对填充在一起)。

    【讨论】:

    • 这看起来有点太简单了。我认为这个查询的复杂性大约是 O(n²)。除了数据库有一些魔力,我要求 - 就在这里。 :) 谢谢你的建议。 (小修复:“AND other.user me.user”)
    • 共有三个参数,人数(比如 n)、电影数量(比如 m)和一个人填写特定电影的概率(比如 p)。这个算法是 O(n * m * p^2) 的预期时间,假设电影是独立填写的(如果某些电影更受欢迎,则更高)。
    猜你喜欢
    • 2020-08-14
    • 1970-01-01
    • 2019-10-22
    • 2012-06-30
    • 2015-07-27
    • 1970-01-01
    • 2023-03-12
    • 2015-09-11
    相关资源
    最近更新 更多