3

(音楽愛好家への警告: この質問はユーロビジョン ソング コンテストに関するものです)

ユーロビジョン ソング コンテストはヨーロッパで人気のイベントです。概念に慣れていない人のために説明すると、これは基本的に、参加国ごとに歌を演奏し、他の国に投票するコンテストです. 各国は他の 10 人の参加者にポイントを与えることができます。好きな曲に 12 ポイントを与え、2 番目に好きな曲に 10 ポイントを与え、次に 8 を 1 に減らします。つまり、国は他の 10 の国にポイントを与えます。

私は、何年にもわたって投票を分析し、互いに投票する傾向がある国である「投票ブロック」を検出するアルゴリズムを作成しようとしています。

ポイントを保存するには、次の 2 つのタイプを使用します。

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;

答えが必要な質問が 2 つあります。

  1. ブロックスコアはどのように計算すればよいですか? 国のグループがどれだけ「友好的」かを測定する良い方法が必要です。私の予備テストでは、(グループ内の国間で与えられたポイントの合計)/(測定したい期間の年数 * 国の数) を使用しました。これは合理的に聞こえますか?伝統的に ESC の文脈で「友好的」と見なされてきた国をテストすると、高い BlocScore が得られるように見えますが、それが完璧だとは思いません。

  2. ブロックが任意の数の国になる可能性があることを考慮して、潜在的なブロックをどのようにループしますか。たとえば、2 か国から 10 か国のブロックに限定することもできますが、任意のサイズのブロックを検出する一般的なアルゴリズムが必要です。私の計算では、57 か国が ESC に参加しており、1 ブロックあたり最大 10 か国に制限しても、430 億ブロックを超えます。

この特定の目的のためのアルゴリズムはありますか? または、適応できる一般的なアルゴリズムがいくつかありますか? 私はそれをグーグルで検索しようとしましたが投票ブロックとは何かの定義のみを見つけ、それらを検出する方法は見つけません。

4

1 に答える 1

1

これは、私の理解が正しければ重みによるクラスタリングにすぎないため、Louvain Methodをチェックする価値はあるかもしれませんが、100 か国未満の国間の相互作用を調べているため、重みが少し重すぎる可能性があります。

より簡単な 1 つの簡単なアイデア: 投票をリンクとしてモデル化し、それらに異なる強度を割り当ててから、Force 有向グラフ描画アルゴリズムを使用して while グラフをレイアウトし、最後にクラスタリングを行うことができますか? もちろん、最終的なビジュアライゼーションは、結果を見るだけでかなり簡単にクラスター化できるはずです。

この方法では、グラフ ファイルを生成し、Gephi などのツールを使用してそれを行うこともできます。

また、関連する投稿は次のとおりです。グラフでコミュニティを検出するためのアルゴリズムの実装はありますか?

于 2013-06-03T21:45:59.717 に答える