查找投票集团的算法

时间:2013-06-03 21:37:54

标签: algorithm cluster-analysis voting

(警告音乐爱好者:这个问题涉及欧洲歌唱大赛)

欧洲歌唱大赛是欧洲的热门活动。对于那些不熟悉这个概念的人来说,它基本上是一个比赛,每个参赛国家都会演唱一首歌,然后为其他国家投票。每个国家都可以向其他10位参赛者颁发积分,给予他们最喜欢的歌曲12分,第二首歌曲为10分,然后8分为1.换句话说,一个国家给其他10个国家分数。

我正在尝试编写一种算法来分析多年来的投票,并发现“投票集团”,即那些倾向于互相投票的国家。

我使用这两种类型来存储点:

TPoints = record
  FromCountry : string; //ID of the country
  ToCountry   : string;
  Year        : integer;
  Semifinale  : boolean;
  Amount      : integer; //1-8,10,12 for years 1975-present, other values for year 1957-1974
end;

TAllPoints = class(TList<TPoints>)
  //Methods i _think_ I need:
  function Sum(aFrom,aTo : string; aFromYear : integer = 0; aToYear : integer = 0) : integer;
  function BlocScore(aCountries: array of string; aFromYear : integer = 0; aToYear : integer = 0) : double;
end;

我需要回答两个问题。

  1. 我应该如何计算BlocScore?我需要一个很好的方法来衡量一组国家的“友好”程度。对于我的初步测试,我使用了(组内各国家之间获得的积分总和)/(我希望衡量的时期数*国家数量)。这听起来合理吗?当我测试那些在ESC背景下传统上被视为“友好”的国家时,它似乎给了他们一个很高的BlocScore,但我不相信它是完美的。

  2. 考虑到集团可以是任何数量的国家,我如何循环潜在的集团。我可以将自己限制在2到10个国家的集团,但我想要一种检测任何规模的集团的通用算法。根据我的统计,这些年来有57个国家参加了ESC竞赛,即使我每个国家最多限制10个国家,也有超过430亿个集团。

  3. 是否有针对此特定目的的算法?或者是否有一些可以调整的通用算法?我试图谷歌它,但我只找到投票集团 的定义,而不是如何检测它们。

1 个答案:

答案 0 :(得分:1)

如果我理解它,这只是权重聚类,所以Louvain Method可能值得一试,但是因为你正在研究不到一百个国家之间的相互作用,所以它可能有点过于沉重。 / p>

一个更简单的快速想法:你可以将投票建模为链接,并为它们分配不同的强度,然后可以使用Force directed graph drawing算法来布局while图,最后进行聚类吗?当然,通过查看结果,最终的可视化应该很容易聚类。

对于这种方法,您还可以生成图形文件,然后使用像Gephi这样的工具来完成它。

此外,这是一篇相关的帖子:Are there implementations of algorithms for community detection in graphs?