※この記事は10月13日に書いています。
特に本文とは関係ないのですが、はてな記法に興味があったので、試してみます。
tex記法
正規分布に関連する分析を数式で解けたら格好良いなと思って、tex記法を使おうと思ったのですが、高校の範囲で履修する不定積分は次の4種類だとわかって数式解放は断念しました。多分、高度な積分を大学のときに習っていたのでしょうが、大学入学後はプログラミング言語の世界に走ってしまいましたので、記憶に残っていません。数学の知識は微分積分どころか四則計算のレベルまで退化してしまいました。でも、いつかは tex記法を使って記事を書きたいものです。
(1) | (2) | ||
---|---|---|---|
(3) | (3') | ||
(4) | (4') |
参考までに正規分布で使用する確率密度関数は次のように定義されます。
スーパーpre記法(シンタックス・ハイライト)
で、結局、頼れるのはプログラムによる数値解析ですが、あまりソースコードを晒したくはないのですが、エクセルにある normdist 関数と normsinv 関数を Java言語で使用したいという要望をネットでよく見かけるので、ちょっと紹介しておきます。
- 参考
- final double REV_SQRT_2_PI = 1 / Math.sqrt(2 * Math.PI);
- double y = REV_SQRT_2_PI * Math.exp(-x * x / 2);
- Java 版 normdist 関数, normsdist 関数
static double normdist(double score, double average, double deviation, boolean isCumulative) { final double REV_SQRT_2_PI = 1 / Math.sqrt(2 * Math.PI); final double STEP = 0.0001; double stdScore = (score - average) / deviation if (! isCumulative) { return REV_SQRT_2_PI * Math.exp(-stdScore * stdScore / 2); } double cumulative = 0; for (double x = Math.abs(stdScore); x > 0; x -= STEP) { double y = REV_SQRT_2_PI * Math.exp(-x * x / 2); cumulative += y * STEP; } return (stdScore > 0) ? 0.5 + cumulative : 0.5 - cumulative; } static double normsdist(double score) { return normdist(score, 0, 1, true); }
- Java 版 normsinv 関数, norminv 関数
static double normsinv(double distribution) { final double REV_SQRT_2_PI = 1 / Math.sqrt(2 * Math.PI); final double MAX = 6; final double STEP = 0.0001; double score = MAX; double subDistribution = Math.abs(distribution - 0.5); for (double x = 0; x < MAX; x += STEP) { double y = REV_SQRT_2_PI * Math.exp(-x * x / 2); subDistribution -= y * STEP; if (subDistribution <= 0) { score = x; break; } } return (distribution > 0.5) ? score : -score; } static double norminv(double distribution, double average, double deviation) { return average + normsinv(distribution) * deviation; }