相対好み評価について書き直してみた。

前回との違い

 1つのエントリーに情報をまとめ、新しく順位付け手法を追加。
 前回のエントリーはこちら

相対好み評価とは

 相対好み評価とは、その作品がどのくらい視聴者に好まれているかを、ユーザーが行った他の作品との比較評価データを元に数値化する評価方式。
 比較評価とは、作品Aと作品Bを評価する時、「AがBより好み」と「BがAより好み」のどちらかで評価する事。
 以下、数値化された評価を評価値と呼ぶ。
 以下、評価を行うユーザーをレビュアーと呼ぶ。

評価値は何を意味するのか

 作品Aが、作品Bより評価値がN点高い場合、作品AとBを比較評価した時、作品Aのほうが好みだと答えるレビュアーの割合がBのよりM%高いと推定される。のような事を表す。
 例えるなら、ドラゴンボールの戦闘力を対数表記したもの。が近いかもしれない。

採点方式との違い

 レビュアーが0〜10点の間で投票を行い、その平均を評価値にする採点方式(範囲投票)の場合、10点を超える点数や、0点を下回る点数はつかない。相対評価の場合、点数の上限や下限は無い*1
 PIXIVのように、採点する人のほとんどが10点をつけてしまい、平均値が意味を持たないというような事は無い。
 計算量が多い。
 ある程度データが集まらないと評価値が収束しない。

相対評価が使われている例

 俺がこの方式を勉強した元ネタのサイト。
 http://kashi.dip.jp/~kashi/rating/
 ゲーム「カルネージハートポータブル」でユーザーが作ったOKEの強さを相対評価しているサイト
 http://www.asahi-net.or.jp/~vw4k-kbys/chp/rating/
 各国のサッカー代表の勝率を相対評価しているサイト
 http://www.eloratings.net/
 wikipediaでの、より簡易的な算出法の解説。この手法は評価値を正確にするのに、より大量のデータが必要になる。計算量は少なくて済む。
http://ja.wikipedia.org/wiki/%E3%82%A4%E3%83%AD%E3%83%AC%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0

評価値の計算方法。

 まず、比較評価データを集める。

  • Aが、Bより好みと答えたレビュアーが3人
  • Bが、Aより好みと答えたレビュアーが1人
  • Bが、Cより好みと答えたレビュアーが2人
  • Cが、Bより好みと答えたレビュアーが3人

 これをリーグ表の形で表すとこんな感じになる。

 次に比較評価データを数式に変換する。

  • レビュアーの人数 * log( 1 + exp( -k( より好みな作品の評価値 - より好みでない作品の評価値 ) ) )

 に、比較評価データの数字を入れて

  • 3 * log( 1 + exp( -k( Xa - Xb ) ) )
  • 1 * log( 1 + exp( -k( Xb - Xa ) ) )
  • 2 * log( 1 + exp( -k( Xb - Xc ) ) )
  • 3 * log( 1 + exp( -k( Xc - Xb ) ) )

 となる。logは対数関数、expは指数関数、kはレーティングのスケールを決める数字。Xnは、これから計算するそれぞれの作品の評価値を表す。次にレーティングのスケールを決定する。
 レーティングのスケールは「レーティングが高い作品と低い作品を比較評価した時、レーティングの差がnなら、高い作品が好まれる確率はm/m+1になると推定する」このnとmに何の数字が入るかという事*2。採点評価でいうと、満点を5点にするか、100点にするかを決める事に相当する。だいたい標準的には、「レーティングが高い作品と低い作品を比較評価した時、レーティングの差が400なら、高い作品が好まれる確率は10/11になると推定する。」のような設定が用いられる*3。ここではこれに従う*4。これに基づいて式を作るとこうなる。

  • 3 * log( 1 + 10^( -0.0025( Xa - Xb ) ) )
  • 1 * log( 1 + 10^( -0.0025( Xb - Xa ) ) )
  • 2 * log( 1 + 10^( -0.0025( Xb - Xc ) ) )
  • 3 * log( 1 + 10^( -0.0025( Xc - Xb ) ) )

 expのところにさっきのmが来て、kにはnの逆数が入る。これで、Xnに適当な数字を入れてgoogleに突っ込めば答えが出てくる状態になった。
 このレーティングは相対値なので、評価値を決定するには絶対の基準を決定する必要がある。今回は「作品Aの評価値は常に1000」とする。

  • 3 * log( 1 + 10^( -0.0025( 1000 - Xb ) ) )
  • 1 * log( 1 + 10^( -0.0025( Xb - 1000 ) ) )
  • 2 * log( 1 + 10^( -0.0025( Xb - Xc ) ) )
  • 3 * log( 1 + 10^( -0.0025( Xc - Xb ) ) )

 Xaにあらかじめ1000を代入しておく。そして、この4つの式の答えの合計が一番小さくなるXbと、Xcの値が、それぞれ作品BとCの評価値になる。

  • Xa=1000
  • Xb=809くらい
  • Xc=880くらい

評価値が収束しない場合

10

 このように、作品AよりBが好み。と答えた人が一人もいない場合、評価値は収束せず、Aの評価値は無限大、Bの評価値はマイナス無限大になる。この場合、

10

 と、Bが好みなダミー評価を加えることで収束する。Bが好みなレビュアーが現れれば、そのときにダミー評価を取り除く。

10 10 10
10 10 10
10
10

 このデータの場合、作品C、Dはどちらも作品A、Bより好みという評価が無い。この場合も収束せず、AとBは無限大、CとDはマイナス無限大になる。この場合もダミー評価を入れれば収束する

10 10 10
10 10 10
10
10

 このデータの場合、A>B>C>Aと、評価が循環する。これは収束し、評価値はA=B=Cになる。
 既に評価値が算出できる作品群に対し、より好み、より好みでない両方の評価がそれぞれ1個以上あるなら、その作品は評価値が算出できる

 Aの評価値を基準としてあらかじめ決定しておく。Bと評価値が算出できるAを見ると、Aに対してより好みが1人、Aに対してより好みでないが1人あるので、Bは評価値を算出できる。Cと評価値が算出できるA,Bを見ると、Bに対してより好みが1人、Aに対してより好みでないが1人あるので、Cは評価値を算出できる。Dと評価値が算出できるA、B、Cを見ると、Aに対してより好みが1人いるが、より好みでないがA、B、Cに対して1つも無いので、Dは評価値を算出できない。ダミー評価で解決できる

 ダミー評価は0を全て埋める必要が無い。評価値を算出できる条件が満たされればそれで良い。

順位付けによる比較評価データの収集。

 比較評価データを効率よく集めるために、順位付けを行う。
 順位付けとは、レビュアーが、複数の作品を、好みの順番に並べる事。
 例・レビュアーX、Y、Zが、作品A、B、Cを順位付けして

  • レビュアーXの順位、A>B>C
  • レビュアーYの順位、B>A
  • レビュアーZの順位、C>B

 という結果になった。A>Bのとき、AはBより好みだという意味。このデータは、このように表に置き換えられる。

 Xの順位付けをみると、AはBより好み、BはCより好み、AはCより好みなので、表にするとこうなる。Y、Zも同様。これを全て合計する。

 このように比較データを集める。今回、レビュアー1人が3作品を順位付けすることで3回分の比較評価データが得られた。100作品を順位付けすれば、比較評価4950回分のデータを得られる。

データ収集はカテゴリー単位で行う。

 ニコニコ動画なんかの場合、カテゴリーごとに動画の形態が大きく変わり、カテゴリーごとに評価基準が変わったりもする。相対好み評価は一次元のスカラーな評価なので、評価基準は出来るだけ揃ってるほうが望ましい。そこで、評価はカテゴリーごとに行う。
 あるレビュアーが、カテゴリーA、Bが付けられた4つの動画について順位付けして

  • A1>B1>A2>B2

 という結果になった。この場合、表に置き換える際、いったんカテゴリーごとに分割して

  • A1>A2
  • B1>B2

 このようにした上で、カテゴリAのみの表、カテゴリBのみの表に置き換える。

A1 A2
A1
A2
B1 B2
B1
B2

 そして、それぞれのカテゴリごとに評価値の算出を行う。

カテゴリーが一つの作品に二つ以上付いている場合。

 あるレビュアーが、第一カテゴリーA、Bおよび第二カテゴリーX、Yが付けられた4つの動画について順位付けして

  • AX>BX>AY>BY

 という結果になった。この場合、カテゴリーごとに、そのカテゴリーが付いた動画を抜き出して

  • AX>AY
  • BX>BY
  • AX>BX
  • AY>BY

 の四つを作り、それぞれ置き換える

AX AY
AX
AY
BX BY
BX
BY
AX BX
AX
BX
AY BY
AY
BY

 そして、それぞれのカテゴリごとに評価値の算出を行う。このとき、カテゴリが複数付いている動画は、評価値も複数持つ事になる。たとえばカテゴリAおよびXが付く動画には、「カテゴリAとしての評価値」と「カテゴリXとしての評価値」の2つの評価値が付く。

*1:上限や下限を設定することは出来る。評価値が悪い作品を作りたくないなら、下限を設定するのもいいかもしれない。

*2:正確に書くと、推定勝率=1/(1+m^((相手のレート-自分のレート)/n))

*3:チェスなどで

*4:たとえばこれを、将棋なんかの段級位っぽくしたいなら、nを1、mを3とかにすればそれっぽくなるんじゃないかな。これだと1段上の人の勝率は3/4になる、って感じ。