AtCoderProblems icon indicating copy to clipboard operation
AtCoderProblems copied to clipboard

正解時間の情報を利用して難易度を推定する

Open key-moon opened this issue 5 years ago • 2 comments

概要

#820 にての正解時間を利用しての難易度のモデル化について考えると、正解時間を用いた難易度推定が可能になるかもしれないです。

詳細

その時点での未回答者について全く考えず、現在の正答者についてのみの尤度を考えます。上 issue にて導出した式 image をレート r の参加者が難易度 d の問題を時間 t で正答できているという事象の確率密度関数に代入すると、 image となります。これより、尤度関数 L(d)image と定めます。対数を取ると、 image となります。c=1/(C*discrim) とした上で σ について偏微分すると、 image となり、上式の偏微分が0になるために σ が満たすべき条件は image と、二次方程式の形で書き表すことができました。

評価

上モデルの discrimlog(e)/400 に固定した上で d をグリッドサーチして最尤推定を行いましたが、あまりうまい結果は得られませんでした。(まともなデータは後ほど用意します)

考えうる改善

正答していない参加者を全く考慮できていないので、不正確な結果になってしまったと考えます。時間 t_cur の時点でレート r の参加者が難易度 d の問題に正答できていないという事象の確率は、ロジスティック分布の累積分布関数 1/1+exp((μ−logt)/s) を用いて image となりますが、これを log に突っ込んでもそこまでうまい形にはなってくれなさそうです。 (そもそも連続亭な確率密度関数と「解けていない」という離散的な事象の確率を同じ尤度に突っ込んでいいのか悩む所ですが、今回はパラメータを変化させることで unsolved の数が変化することはないために2つの事象として分けて処理してしまって良いと思われます(?)) 偏微分すると image のような形にはなるので、二次方程式のどこかに頑張ってねじ込むことは出来なくはなさそうですが、結局勾配降下法のような形をとってしまうことになりそうだと感じています。

key-moon avatar Nov 24 '20 01:11 key-moon

導出がおかしそうです。 以下 A = C * discrim * |σ| と置きます

A * (d - r) + log(t_end) の次元は時間の対数なので、これの誤差は対数正規分布ではなく正規分布に従うはずです。 つまり、2行目で対数正規分布の密度関数に突っ込んでるところが怪しいと思います。

代わりに正規分布の密度関数に突っ込むとすると、全体としてやりたい操作は正規分布のフィッティングになります。 いきなり計算する前に少し式を整理します。

今考えているモデルは、レーティング r の人の回答時間が t のときに t は log(t) = A * (d - r) + log(t_end) + N(0, σ') という分布に従うということでした(N(0, σ') は平均0、分散σ'の正規分布に従う確率変数)。

これを変形すると log(t) - ln(t_end) = -A * r + Ad + N(0, σ') というの r に関する線形モデルになります。 これを最小二乗法でフィッティングしたあとで得られた傾きと切片がそれぞれ -A, Ad になることから d が求まる雰囲気があります。

amylase avatar Nov 24 '20 07:11 amylase

「考えうる改善」で説明されているところは要するにコンテスト時間中に正答しなかった人のデータをどう扱うかという話で、これは #820 でも言及しましたが、過去に #290 で潜在変数を導入する作戦を試みていまいちうまく行ってません。打ち切り(truncation / censoring)の扱いにはいろいろな作法があるのでもしかしたら他にいい方法があるのかもしれません。

amylase avatar Nov 24 '20 08:11 amylase