Skip to content

Instantly share code, notes, and snippets.

@potakusan
Last active December 21, 2019 02:12
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save potakusan/30004f4c05e6887399e779afe0fac4e6 to your computer and use it in GitHub Desktop.
Save potakusan/30004f4c05e6887399e779afe0fac4e6 to your computer and use it in GitHub Desktop.
定義式と定義ファイルのアップデートについて(2019/12/10)

BPI計算式の修正について(再)

先日、BPIManager内で利用している、BPI算出に用いている係数(以下p=powCoef)を1.5から1.175に変更しました。
この件につきまして、青龍(@seiryu1210)様からアドバイスを頂きまして、あらためて次の通り算出し直すことにしました。
今回の変更により、各楽曲につきほぼ最適なpを設定することができ、BPIがより一層正確な実力指標として機能します。
BPIManagerをお使い頂いている皆様には、度重なる仕様変更により多大なご迷惑をお掛けし、誠に申し訳ございません。

*設定画面より、従来どおり係数を1.5に固定してBPIを算出できる機能を追加しました。お好みに合わせてお使いください。

TL;DR

  • 楽曲別に譜面係数を設定しました
  • 概ね楽曲特有の傾向に沿ったBPIの算出が可能になりました
  • 白壁など一部の楽曲においては譜面係数を調整しています
  • 定義ファイルに譜面係数を持っているので、設定画面->「定義データの更新」よりデータを更新してください

前提条件

前回と同じ前提条件下で話を進めています。
ただし、今回はBPI50未満の各定義域も考慮しています。それらを含めた順位表は以下の通りとなります。

BPI 順位
100 1
90 2.2
80 4.84
70 10.64
60 23.39
50 51.43
40 113.1
30 248.72
20 546.95
10 1202.78
0 -(皆伝平均)

以上の順位に該当するスコアをスクレイピングしたデータを各楽曲につきまとめたJSONファイルは下URLに置いてあります。
https://files.poyashi.me/json/meta.json
pの算出もこちらのデータに則って行いました。

算出方式(没案)

各EXスコアに対応するBPIの総和を取り、その値と理想値の差が一定水準未満になるまで繰り返す手法を考えました。
実際の設定としては、pを0.000001単位で変動させ、許容差は0.0001未満としました。
この方式を没とした理由は、各BPI帯で生じたズレを合計で相殺したpが算出されるためです。
実際に得られた値はこちらのテキストファイルに、次のフォーマットで示されています。
{楽曲名 p [100,90,80,70,60,50]の価値を持つEXスコアのBPI換算値(当該pを使用)}

算出方式(採用)

BPI = 100*(ln(S')/ln(Z'))^p (s >=k)
BPI = -100*(-ln(S')/ln(Z'))^p (s < k)

目的変数をp、説明変数を各BPIおよび上式ln(S')(s=各BPIに相当するEXスコア)とした、非線形最小二乗法を用いた回帰分析を行いました。
算出にあたり用いたコードはこちらです(汚くてごめんなさい)。
そして、標準誤差等を含む、実際に得られた値がこちらです。

この方式で得られたpを用いて、各EXスコアに対応するBPIを線で表したグラフと、サンプルとして用いたEXスコアの関係をプロットしたjpeg画像を出力し、こちらにアップしました。
一部の楽曲(Broken Sword(A)など)においてグラフと点が一致しない状態が依然として存在するものの、全体的にほぼ合理性のある値を取っているのではないかと考えます。

実例

p=1.5 p=1.175 今回の修正

Amazing Mirage(LEGGENDARIA)を例にとった実順位とのズレを比較しました。
今までで最も実順位に適したBPI・順位推定ができていることを確認できます。

今後の課題

①DPと☆11楽曲に関しては、サンプルとなる値が存在しない(iidxinfoに登録されていない)ため、とりあえずは従来どおりp=1.175で計算します。
対応については今後ゆっくりと考えたいと思います。

②p<0.8となる楽曲については、p=0.88に固定する修正を行いました。
具体的にはInnocent Walls(A)および(H)の2曲です。

修正前 修正後

上のグラフを見ていただければ分かるのですが、あまりにもpの係数が小さすぎる場合、BPI0付近でのBPI伸び率が大きくなり、BPIが「高ければ高いほど1点の重みが増す」指標であることに反すると考えたからです。
p=0.88に設定することで、BPIは出にくくなりましたが本定義に沿うことができました。
ただし、0.88としたのはあくまでフィーリングであり絶対的な根拠が存在するわけではありません。
その他、INSOMNIA(A)などにおいても、Innocent Wallsほど極端では無いですが係数が小さくなりすぎる問題が生じています。
これらの修正案は今後の課題です。

その他

BPIManager beta v0.0.1.9以降のバージョンで、本モデルを用いたBPI計算が可能になります。
なお、定義ファイルにこれらに関するデータが含まれるため、v20191210以降の定義ファイルへの更新が必要となります。
(本定義バージョンには一部楽曲に関する歴代の入力ミス修正が含まれます)

上記プロットは、各BPIの価値があるEXスコアと実際に計算式によって算出されるBPIのズレを表すグラフとなっており、一定の価値があると考えましたので、BPIManager beta v0.0.1.9以降個別楽曲画面「詳細」タブ内にて、p(便宜上譜面係数と称しています)とともに確認できるようにしました。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment