1732983124
2024-11-30 15:33:00
2024 年 11 月 29 日、午後 7 時 11 分、Drang 著
数日前、私はグラント・サンダーソンによるこの短い YouTube ビデオを次のサイトで見ました。 3青1茶色:
このビデオの要点は、3 つの独立した確率変数がある場合、 、 、 そして 、すべて 0 と 1 の間に均一に分布している場合、
どこ 括弧内は確率を表します。
ここで、私は Grant と同じ表記法を使用していないことに注意してください。このようなことを学ぶ授業で使用した教科書は、Ang and Tang の本でした。 工学計画および設計における確率の概念。彼らはランダム変数には大文字を使用し、特定の値には小文字を使用しました。これは、ランダムと非ランダムを簡単に区別できる優れた規則です。 45年間この考えを貫き通していますが、変えるつもりはありません。
確率 の関数です として知られています 累積分布関数1 (CDF)の 。したがって、上で与えられた確率は関数の CDF です。 そして 。
Grant は、これら 2 つの関数が同じ CDF を持つ理由を説明するいつもの素晴らしい仕事をしていますが、疑問がある場合は、彼の成果を数値的に確認するのは非常に簡単です。これは、非常に多くのコンピューティング能力を自由に使えることの大きな利点の 1 つです。
3 つのセットを生成します。 一様分布からの乱数を適用するには、 max そして sqrt 関数をそれらに入力し、結果を昇順に並べ替えます。次に、各値のランク (つまり、並べ替えられたリスト内での位置) を次の値で割ることにより、確率を推定できます。 。
これがどのように機能するかの例を見てみましょう。 0 から 1 までの一様分布から 20 個の乱数を生成し、それらの平方根を求めて並べ替えます。並べ替えられた値、その順位、および 20 で割られた順位を次に示します。
| 価値 | ランク | ランク/20 |
|---|---|---|
| 0.15153773 | 1 | 0.05 |
| 0.31017013 | 2 | 0.10 |
| 0.32107819 | 3 | 0.15 |
| 0.36746846 | 4 | 0.20 |
| 0.47920455 | 5 | 0.25 |
| 0.51328779 | 6 | 0.30 |
| 0.55133211 | 7 | 0.35 |
| 0.65800726 | 8 | 0.40 |
| 0.72510687 | 9 | 0.45 |
| 0.76085816 | 10 | 0.50 |
| 0.80286435 | 11 | 0.55 |
| 0.81393308 | 12 | 0.60 |
| 0.82690246 | 13 | 0.65 |
| 0.90907066 | 14 | 0.70 |
| 0.91344562 | 15 | 0.75 |
| 0.91666637 | 16 | 0.80 |
| 0.91701938 | 17 | 0.85 |
| 0.94649904 | 18 | 0.90 |
| 0.94874985 | 19 | 0.95 |
| 0.99254165 | 20 | 1.00 |
これらの点をプロットすると、次のようになります。
ここで、(0, 0) と (1, 1) に追加の点を追加して、それらが限界であることを思い出させます。 0 以下の値は存在せず、すべての値は 1 以下でなければなりません。
プロットを完成させるには、各点から次の点まで水平線が必要です。 × 関数が次のポイントにジャンプする値。

なぜ?たとえば、サンプル値の 40% (20 個中 8 個) が以下であるためです。 どれでも 値は 0.65800726 (両端を含む) から 0.72510687 (両端を含む) までです。グラフの他のすべての中間部分についても同様です。
それぞれにステップがあるので、 × 値を指定する場合、点を表示する必要はなく、線だけを表示する必要があります。ここに両方のプロットがあります max そして sqrt 20 個のサンプルのサンプル CDF と、Grant によって提供された分析ソリューション:

サンプル CDF は、分析的な CDF にかなり近いように見えます。サンプル数を 100 に増やして、何が得られるかを見てみましょう。

予想通りの分析結果に近づきました。ばかげているので、10,000 個のサンプルを使用してこれをもう一度実行します。

これだけ多くのサンプルがあると、ステップを見ることさえできませんが、両方のサンプル CDF が分析的な CDF に収束していることは明らかです。
統計のバックグラウンドをお持ちの方は、私が次のようなことを実行することを期待しているかもしれません。 コルモゴロフ・スミルノフ検定 サンプルと分析 CDF の間の適合性を確認します。しかし、私たちが行ったことは、グラントの仕事に対する(それが必要であるかのように)十分なチェックだったと思います。 KS テストはご自身で進めることもできます。
数値チェックを実行するのは良いことですが、これらのグラフを作成する主な目的は、 step 方法 Matplotlib で。これは、このタイプのグラフ用に特別に作成されたプロット ルーチンです。通常通り使用できる一方で、 plot ステップワイズ関数の場合は、まずステップごとに 2 つの値を含む配列を構築する必要があります。使用上の利点 step それは、すべての帳簿作成を処理してくれるということです。渡す配列には、ステップごとに値が 1 つだけ必要です。 2 番目の値のプロットは自動的に行われます。
20 個のサンプルのグラフを生成するコードは次のとおりです。
python:
1: #!/usr/bin/env python3
2:
3: import numpy as np
4: import matplotlib.pyplot as plt
5:
6: # CDF by analysis
7: x = np.linspace(0, 1, 101)
8: cdfAnalysis = x**2
9:
10: # Sample CDFs using random numbers
11: rng = np.random.default_rng(seed=1732895964)
12: n = 20
13: heights = np.linspace(0, n, n+1)/n
14: heights = np.concatenate((heights, np.ones(1)))
15:
16: # Max of two uniform variates
17: X1 = rng.uniform(0, 1, n)
18: X2 = rng.uniform(0, 1, n)
19: Xmax = np.sort(np.maximum(X1, X2))
20: Xmax = np.concatenate((np.zeros(1), Xmax, np.ones(1)))
21:
22: # Sqrt of uniform variate
23: X3 = rng.uniform(0, 1, n)
24: Xsqrt = np.sort(np.sqrt(X3))
25: Xsqrt = np.concatenate((np.zeros(1), Xsqrt, np.ones(1)))
26:
27: # Create the plot with a given size in inches
28: fig, ax = plt.subplots(figsize=(6, 4), layout="tight")
29:
30: # Add plots
31: ax.step(Xmax, heights, where="post", color="#7570b3", lw=2, label="Max")
32: ax.step(Xsqrt, heights, where="post", color="#e7298a", lw=2, label="Sqrt")
33: ax.plot(x, cdfAnalysis, '--', color="black", lw=1, label="Analysis")
34:
35: # Title and axis labels
36: plt.title(f'CDFs (n = {n:,d})')
37: plt.xlabel('x')
38: plt.ylabel('Probability')
39:
40: # Make the border and tick marks 0.5 points wide
41: [ i.set_linewidth(0.5) for i in ax.spines.values() ]
42: ax.tick_params(which="both", width=.5)
43:
44: # Add the legend
45: ax.legend(loc=(.1, .6))
46:
47: # Save as PDF
48: plt.savefig(f'20241129-CDF comparison with {n} samples.png', format="png", dpi=200)
分析結果のプロットに使用される値は 7 ~ 8 行目に示されています。 NumPyが好きです linspace この関数はデフォルトで私が考えるように動作するため、開始値と終了値、生成する値の数を指定すると、実行が開始されます。最終値が含まれるかどうかを心配する必要はありません。そうです。
次のセクションの 11 ~ 14 行目では、乱数発生器と、両方のステップの高さを設定します。 max そして sqrt サンプル。指定できるのは、 シード値 NumPy の乱数ジェネレーター用。これは、コードの編集およびデバッグ中に、スクリプトを実行するたびに同じ値のセットを取得したい場合に役立ちます。私が使用したシードは、このコードを書き始めたときのものでした。 エポック秒。コマンドラインから取得しました
date +'%s'
シードを設定するもう 1 つの利点は、コードを実行した他の人が私と同じプロットを取得できることです。
このコードは 20 サンプル用ですが、12 行目は任意の数のサンプルを処理できるように編集できます。
の concatenate 関数 14 行目では、末尾に 1 を追加します。 heights 変数。そうする理由については、この記事の前半で説明しました。わずか 20 サンプルでは価値は小さいですが、10,000 サンプルになるとあまり役に立ちません。
17 ~ 20 行目で生成されるのは、 × の値 max サンプル。 0 と 1 の間で均一に分布する 2 セットの乱数を生成し、各ペアの最大値を取得して昇順に並べ替えます。の concatenate 次に関数を使用して、先頭に 0 を追加しました。 Xmax 配列と末尾の 1。
23 ~ 25 行目で、 × の値 sqrt サンプル。プロセスは次のようなものです max サンプルを生成しますが、生成する必要があるのは乱数のセットを 1 つだけです。
この時点から、すべては計画です。重要な機能は、 step 31行目と32行目。 × 値 (どちらか Xmax または Xsqrt) そして heights に渡されます step、すべてのプロットを処理します。興味深いパラメータは、 where、どちらかを割り当てることができます pre (デフォルト) または post。の where パラメータは、グラフの水平部分を各指定点の前にプロットするか後ろにプロットするかを指定します。さまざまな配列を設定した方法により、 post 正しい選択でした。
31 行目と 32 行目の色の値は、 ColorBrewer サイト。これらは、色盲の視聴者と色盲でない視聴者の両方にとって簡単に区別できるように設計されています。 Matplotlib で ColorBrewer の色を自動的に指定する方法があるのではないかと思いますが、それについては調べていません。
コードのもう 1 つの興味深い部分は、36 行目と 48 行目で、12 行目で指定されたサンプル数に応じてタイトルとファイル名が変更されることです。
先ほども言いましたが、分析をチェックするためにコンピューターが身近にあるのは素晴らしいことです。数値積分と微分、モンテカルロ シミュレーション、結果のグラフ化などは、利用可能なソフトウェアの使い方を独学で学べば、すぐに結果を得ることができます。これらは確かに証明ではなく、コンピューター ソリューションを誤って設定する危険が常にあります。分析的にたどったのと同じ間違った道を数値的にたどるのは簡単です。しかし、注意深く実行すれば、これらのチェックは、分析ソリューションだけでは得られない自信を与えることができます。
#平方根と最大値 #すべて