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

时间:2013-01-08 15:48:41

标签: graph matching graph-algorithm bigdata

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

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

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

因此,上述功能需要不可忽视的时间,总而言之,当我们比较数千(可能是数百万?)用户及其数百个兴趣时,需要花费大量时间。对于100,000个用户,我不能以这种方式在很短的时间内(<30秒)进行100,000次用户比较。但是,我必须在30秒内提出前10项建议,可能是初步建议,然后在接下来的1分钟内对其进行改进,计算出改进的建议。简单地比较1个用户和N个用户的顺序太慢了。

问题:
请建议一种算法,方法或工具,用它来改善我的情况或解决我的问题。

3 个答案:

答案 0 :(得分:2)

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

=&gt;步骤:1正如您的标题所示。建立一个无兴趣的加权图,其中兴趣为顶点,加权匹配为边。

=&gt;步骤:2 - 聚集兴趣。 (最复杂的)

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

“配对计数F测量”听起来符合您的需要(加权图),检查其他可用选项。

(注意:继续修改此步骤,直到找到正确的群集算法并且 找到了距离规则的正确校准,没有聚类等。 )

=&gt;步骤:3 - 评估群集

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

=&gt;步骤:4 - Examinie new inerest

遍历所有集群,计算每个集群中的连通性,基于高连接性对集群进行排序,对排序集群的前x%进行排序 排序并过滤掉高度关联的利益。

=&gt;步骤:5 - 匹配用户

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

=&gt;步骤:6 - 除上述之外 您可以根据流量和内容将负载(多台计算机可用于群集机器群集)分配到多个系统\处理器。

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


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

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

2:当一个新兴趣出现时,每个HRDC都会发现“Conectivity with Cluster”=“HRDC的兴趣比率/ UNIVERSE的兴趣比率”。

3:将“Conectivity with Cluster”排序并选择Highly connected cluster。

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

答案 1 :(得分:1)

一个缺陷是你的算法复杂性基于错误的东西。真正的问题是你必须将每个独特的兴趣与其他所有独特的兴趣(以及与自身的兴趣)进行比较。

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

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

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

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

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

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

    近似解决方案:

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

    要获得快速近似解决方案(无法保证其接近程度),您需要一种数据结构,以便能够快速确定哪些用户可能与新用户相似。

    构建该结构的一种方法:

    1. 挑选300名随机用户。这些将是300个集群的种子用户。理想情况下,你会使用最不密切相关的300个用户,但这可能不实用,但确保无种子用户与其他用户关系太密切(作为其比较的总和或平均值)仍然是明智的。其他用户)。
    2. 然后,每个加入代表用户最匹配的群集的用户填充群集。
    3. 然后可以通过从该群集中挑选最密切相关用户的前10位用户来确定最高吨位。
    4. 如果确保群集的数量和每个群集的用户总是非常接近sqrt(用户数),那么只需检查群集中的点,就可以获得O(sqrt(N))的公平近似值。您可以通过将用户包含在其他群集中并检查每个群集的代表用户来改进该近似值。你检查的集群越多,你越接近O(N)和一个确切的解决方案。虽然,可能没有办法说明当前解决方案与确切解决方案的接近程度。在检查了多个log(sqrt(N))簇的总数之后,你有可能开始达到黯淡的回报。哪个会把你放在O(sqrt(N)log(sqrt(N)))。

答案 2 :(得分:0)

很少有想法......

不完全是图论解决方案。

假设一组有限的兴趣。对于每个用户保持一个比特序列,其中每个兴趣是表示用户是否具有该兴趣的比特。 对于新用户,只需将位序列与现有用户位序列相乘,并找到结果中的位数,以便了解其兴趣与其匹配程度。