【问题标题】:Build an undirected weighted graph by matching N vertices通过匹配 N 个顶点构建无向加权图
【发布时间】:2012-12-22 12:44:53
【问题描述】:

问题:
我想通过将他/她的“兴趣”与所有其他人的兴趣进行比较,为特定用户推荐前 10 个最兼容的匹配项。我正在用户之间构建一个无向加权图,其中权重 = 两个用户之间的匹配分数。

我已经有一组 N 个用户:S。对于 S 中的任何用户 U,我都有一组兴趣 I。经过很长一段时间(一周?),我创建了一个具有一组兴趣的新用户 U,并且将其添加到 S。为了为这个新用户生成一个图表,我将新用户的兴趣集 I 与 S 中所有用户的兴趣集进行迭代比较。问题在于这个“所有用户”部分。

让我们来谈谈比较兴趣的功能。对一组兴趣 I 的兴趣是一个字符串。我正在使用 WikipediaMiner 比较两个字符串/兴趣(它使用 Wikipedia 链接来推断两个字符串的相关程度。例如,Billy Jean & Thriller ==> 高匹配,Brad Pitt & Jamaica ==> 低匹配等等)。我也问过question about this(看看是否有比我目前使用的更好的解决方案。

因此,上述功能所花费的时间不可忽略,总的来说,当我们比较数千(可能是数百万?)用户及其数百个兴趣时,将花费大量时间。对于 100,000 个用户,我无法以这种方式在短时间内(

问题:
请提出一种算法、方法或工具,我可以使用它来改善我的情况或解决我的问题。

【问题讨论】:

    标签: graph matching graph-algorithm bigdata


    【解决方案1】:

    一个缺陷是您将算法复杂性建立在错误的基础上。真正的问题是,您必须将每个独特兴趣与其他所有独特兴趣(以及该兴趣与自身)进行比较。

    如果所有的兴趣都是独一无二的,那么你可能无能为力。但是,如果您有很多重复的兴趣,您也许可以通过以下方式加速算法。

    1. 创建一个图表,将每个兴趣与具有该兴趣的用户相关联。以允许快速查找的方式。

    2. 创建一个图表,显示每个兴趣与其他兴趣之间的关系,同时以允许快速查找的方式。

    因此,当添加新用户时,会将他们的兴趣与所有其他兴趣进行比较并存储在图表中。然后,您可以使用该信息来构建具有相似兴趣的用户列表。然后需要以某种方式过滤该用户列表以将其降到前 10 名。

    最后,将该用户及其兴趣添加到用户和兴趣图表中。这是最后完成的,因此具有最密切匹配兴趣的用户不是用户自己。

    注意: 可能有一些统计捷径,您可以这样做:A 与 B 相关,B 与 C 相关,C 与 D 相关,因此 A 与 B、C 和 D 相关。但是,要使用这些各种捷径可能需要更好地了解您的比较功能的工作原理,这超出了我的专业知识。

    近似解:

    我之前忘了提,但是您在比较用户或兴趣时看到的是更高维度的“最近邻搜索”。这意味着,对于精确的解决方案,线性搜索通常比数据结构更有效。因此,如果您需要更快,近似值可能是最好的方法。

    要获得一个快速的近似解决方案(不保证它有多接近),您需要一个能够快速确定哪些用户可能与新用户相似的数据结构。

    构建该结构的一种方法:

    1. 随机选择 300 个用户。这些将是 300 个集群的种子用户。理想情况下,您将使用 300 个最不密切相关的用户,但这可能不切实际,仍然可能明智的做法是确保无种子用户与其他用户的关系过于密切(作为比较的总和或平均值)其他用户)。
    2. 然后由每个加入集群的用户填充集群,该集群的代表用户与其最匹配。
    3. 然后可以通过从该集群中挑选前 10 个最密切相关的用户来确定前 10 个用户。

    如果您确保集群的数量和每个集群的用户始终非常接近 sqrt(用户数),那么您只需检查集群内的点即可在 O(sqrt(N)) 中获得公平的近似值.您可以通过将用户包含在其他集群中并检查每个集群的代表用户来改进该近似值。你检查的集群越多,你就越接近 O(N) 和一个精确的解决方案。虽然,可能没有办法说当前的解决方案与确切的解决方案有多接近。在检查超过总数的 log(sqrt(N)) 集群后,您可能会开始遇到递减的回报。这会让你处于 O(sqrt(N) log(sqrt(N)))。

    【讨论】:

    • 谢谢,你提到的两点我都已经考虑过了。关于兴趣 - 每 1000 个兴趣可能会有 70 次重复。你认为用图表的想法来实现这样的比率是否明智? (假设我们有一百万个兴趣)
    • 一百万平方是 10^12,如果其中 7% 是重复的,那么您可以将其降低到 8.649^11。所以运行时间减少了 13.5%。由于制作图表,它会减少,但可能仍在该范围内。无论哪种方式,它都不会对整体运行时间产生太大影响,尽管这可能足以值得麻烦。这个决定取决于你。
    • 您唯一的另一种可能性是您可能能够创建某种将“相似”兴趣组合在一起的数据结构。但是,在这种情况下,您可能看起来实际上是在重复很多兴趣。但是,如果你能让它工作。然后你会得到与我提到的 B、C、D 效果相关的 A。在这一点上,这可能是你真正有机会获得比 O(N^2) 更好的算法。可能值得在 Cross Validated 上提出这个问题,或者根据数据结构重新提出这个问题来组织兴趣。
    • 哦等等,还有一件事。你需要一个精确的算法还是一个近似的算法?好像您允许一些近似值一样,您应该能够获得线性结果。唯一的问题是近似值是否足够好。
    • '某种将“相似”兴趣组合在一起的数据结构'--> 我明白了,我会考虑这个。 :/ 一个近似的就可以了,我不需要任何精确或完美的东西,但当然要保持一定的匹配质量。
    【解决方案2】:

    一些想法......

    不完全是图论解决方案。

    假设一组有限的兴趣。为每个用户维护一个位序列,其中每个兴趣都是一个位,表示用户是否有该兴趣。 对于新用户,只需将比特序列与现有用户的比特序列相乘,然后找到结果中的比特数,即可了解他们的兴趣匹配程度。

    【讨论】:

    • 谢谢。但是,如果我没记错的话,您所说的解决方案是在是/否二进制基础上比较兴趣,对吗? IE。两组中的 Billie Jean 会导致位为 1,但一组中的 Billie Jean 和另一组中的 Thriller 会导致位为 0。但是我的匹配函数比较并给出一个正数作为结果,就像渐变一样,而不是一个布尔值。
    【解决方案3】:

    我只能想到一种解决问题的方法,因为以下内容的结果 取决于利益之间相互关系的性质。

    =>步骤:1 正如您的标题所说。构建一个无向加权图,其中兴趣为顶点,它们之间的加权匹配为边。

    =>step:2 - 聚类兴趣。 (最复杂的)

    Kmeans 是一种常用的聚类算法,但基于 K-Dimensional vector space.refer wiki 了解 K-means 是如何工作的。 它最小化所有集群的(每个点的距离总和 ^ 2 并说集群的中心)的总和。在您的情况下,没有可用的尺寸。所以尝试是否可以通过创建某种规则来应用最小化逻辑,对于两个顶点之间的距离,更高的匹配 => 更小的距离,反之亦然(wiki-miner 提供的不同匹配级别是什么?)。选择集群的平均值作为所选集合中连接最多的顶点,页面排名听起来是“找出连接最多的顶点”的好选择。

    “Pair-counting F-Measure”听起来很适合您的需要(加权图),请检查其他可用选项。

    (注意:不断修改这一步,直到找到正确的聚类算法并且 距离规则的正确校准,没有找到集群等。 )

    =>步骤:3 - 评估集群

    从这里开始,它就像校准一些东西以满足您的需要。 检查集群,重新评估: 簇的数量,簇间距离,簇内顶点之间的距离,簇的大小, 时间\精度权衡(比较最终 - 没有任何聚类的匹配结果) goto: step-2 直到这个评估满意。

    =>步骤:4 - 检查新的兴趣

    遍历所有集群,计算每个集群的连通性,基于高连通性对集群进行排序,用于排序前 x% 的集群 对高度关联的兴趣进行排序和过滤。

    =>step:5 - 匹配用户

    使用步骤4中获得的兴趣反向查找所有用户的集合,比较两个用户的所有兴趣,生成分数。

    =>step:6 - 将上述内容分开 您可以根据流量和内容将负载(多台机器可用于集群 machine-n 集群)分配到多个系统\处理器。

    这个问题的应用是什么,预期的流量是多少?


    找到新兴趣和“集群中的一组兴趣”之间的连通性的另一种解决方案 C. Wiki-Miner 在一组 wiki 文档上运行,我称之为 UNIVERSE。

    1:对于每个集群,从 UNIVERSE 中获取和维护(索引,lucene 可能很方便)“一组高相关文档”(我称之为 HRDC)。所以如果你有'N'个集群,你就有'N'个HRDC。

    2:当新的兴趣出现时,为每个 HRDC 找到“与集群的连接性”=“HRDC 中的兴趣命中率/UNIVERSE 中的兴趣命中率”。

    3:对“Conectivity with Cluster”进行排序并选择高度连接的集群。

    4:根据适合您的时间\精度权衡,将集群中的所有顶点与新兴趣或高度连接的顶点(使用页面排名)进行比较。

    【讨论】:

    • 啊!简化你所说的,整个集合都是集群的,当一个新用户进来时,我不会将他/她的兴趣与主集合中的所有其他兴趣进行比较,而是计算它与每个集群的匹配程度,并遍历它们。一旦找到具有最佳连接性的用户,我就会反向查找对该集群感兴趣的用户。 ==> 较小的比较。但是,我无法弄清楚的部分 - “计算每个集群中的连通性” - 我该怎么做?我是否需要用标签“标记”每个集群,然后将兴趣字符串与该标签进行比较?
    • 对于每个集群都有一组“具有高连接性的顶点”HCI,比如每个集群中 X% 的顶点。将新兴趣与所有这些顶点进行比较。您如何获得 HCI? -> 在集群中应用 Page Ranking 以选择 HCI。
    • 使用它们之间的兴趣比较结果的倒数作为距离可能是明智的。
    • 是的,1/X 可以是一个,(C - X) 可以是另一个,取决于 Wiki-Minor 提供的 MATCH 值的范围,有时我们可能想说 2 个顶点不是完全连接,我们不想要一个所有顶点都连接到其他每个顶点的图。首先,我们可以选择逆,有限制条件,if (Match > LOWEST_MATCH) { distance = 1/Match; } else { 距离 = 无穷大;但是对于这个问题,我觉得算法会根据连接的性质和获得的集群进行修改(很多)。 ...一个非常有趣的问题值得思考\谈论。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多