Graph 通过匹配N个顶点构建无向加权图

Graph 通过匹配N个顶点构建无向加权图,graph,matching,graph-algorithm,bigdata,Graph,Matching,Graph Algorithm,Bigdata,问题: 我想通过将某个用户的“兴趣”与所有其他用户的兴趣进行比较,为其推荐十大最适合的匹配项。我正在用户之间构建一个无向加权图,其中权重=两个用户之间的匹配分数。 我已经有一组N个用户:S。对于S中的任何用户U,我都有一组兴趣I。经过很长一段时间(一周?)后,我创建了一个新用户U,其中包含一组兴趣,并将其添加到S中。要为这个新用户生成一个图,我将迭代地将新用户的兴趣集I与S中所有用户的兴趣集进行比较。问题在于“所有用户”部分。 让我们谈谈比较兴趣的功能。一组兴趣中的一个兴趣I是一个字符串。我正在

问题:
我想通过将某个用户的“兴趣”与所有其他用户的兴趣进行比较,为其推荐十大最适合的匹配项。我正在用户之间构建一个无向加权图,其中权重=两个用户之间的匹配分数。

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

让我们谈谈比较兴趣的功能。一组兴趣中的一个兴趣I是一个字符串。我正在使用WikipediaMiner比较两个字符串/兴趣(它使用Wikipedia链接来推断两个字符串的关系有多密切。例如Billy Jean&Thriller==>high match,Brad Pitt&牙买加===>low match等等)。我也问了一个问题,看看是否有比我目前使用的更好的解决方案。


因此,上面的功能需要花费不可忽略的时间,总的来说,当我们比较数千(也许数百万?)用户及其数百个兴趣时,这将花费大量时间。对于100000个用户,我无法在短时间内进行100000个用户的比较(一个缺陷是,你将算法复杂性建立在错误的基础上。真正的问题是,你必须将每个独特的兴趣与每个其他独特的兴趣(以及该兴趣与自身)进行比较

如果所有的兴趣都是唯一的,那么你可能什么也做不了。然而,如果你有很多重复的兴趣,你也许可以通过下面的方法来加速算法

  • 创建一个图表,将每个感兴趣的用户与感兴趣的用户关联起来。以允许快速查找的方式

  • 创建一个图表,显示每个兴趣与其他兴趣之间的关系,也可以采用允许快速查找的方式

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

    最后,将该用户和他们的兴趣添加到用户和兴趣图中。这是最后一次操作,以便兴趣最匹配的用户不是用户本身

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

    近似解:

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

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

    构建该结构的一种方法:

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

  • 如果您确保集群的数量和每个集群的用户数始终非常接近sqrt(用户数),那么您将获得O(sqrt(N))的公平近似值只检查集群内的点。您可以通过在其他集群中包括用户并检查每个集群的代表用户来改进近似值。您检查的集群越多,越接近O(N)一个精确的解决方案。虽然,可能无法确定当前的解决方案与精确的解决方案有多接近。在检查了超过总数的log(sqrt(N))集群之后,很有可能会出现递减回报。这将使您处于O(sqrt(N)log(sqrt(N))).

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

    如果所有的兴趣都是唯一的,那么你可能什么也做不了。然而,如果你有很多重复的兴趣,你也许可以通过下面的方法来加速算法

  • 创建一个图表,将每个感兴趣的用户与感兴趣的用户关联起来。以允许快速查找的方式

  • 创建一个图表,显示每个兴趣与其他兴趣之间的关系,也可以采用允许快速查找的方式

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

    最后,将该用户和他们的兴趣添加到用户和兴趣图中。这是最后一步,这样用户的兴趣最接近