(警告音乐爱好者:这个问题涉及欧洲歌唱大赛)
欧洲歌唱大赛是欧洲的热门活动。对于那些不熟悉这个概念的人来说,它基本上是一个比赛,每个参赛国家都会演唱一首歌,然后为其他国家投票。每个国家都可以向其他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;
我需要回答两个问题。
我应该如何计算BlocScore?我需要一个很好的方法来衡量一组国家的“友好”程度。对于我的初步测试,我使用了(组内各国家之间获得的积分总和)/(我希望衡量的时期数*国家数量)。这听起来合理吗?当我测试那些在ESC背景下传统上被视为“友好”的国家时,它似乎给了他们一个很高的BlocScore,但我不相信它是完美的。
考虑到集团可以是任何数量的国家,我如何循环潜在的集团。我可以将自己限制在2到10个国家的集团,但我想要一种检测任何规模的集团的通用算法。根据我的统计,这些年来有57个国家参加了ESC竞赛,即使我每个国家最多限制10个国家,也有超过430亿个集团。
是否有针对此特定目的的算法?或者是否有一些可以调整的通用算法?我试图谷歌它,但我只找到投票集团 的定义,而不是如何检测它们。
答案 0 :(得分:1)
如果我理解它,这只是权重聚类,所以Louvain Method可能值得一试,但是因为你正在研究不到一百个国家之间的相互作用,所以它可能有点过于沉重。 / p>
一个更简单的快速想法:你可以将投票建模为链接,并为它们分配不同的强度,然后可以使用Force directed graph drawing算法来布局while图,最后进行聚类吗?当然,通过查看结果,最终的可视化应该很容易聚类。
对于这种方法,您还可以生成图形文件,然后使用像Gephi这样的工具来完成它。
此外,这是一篇相关的帖子:Are there implementations of algorithms for community detection in graphs?