QBasicは私の最初のプログラミング言語でもありました。 私はBASICで20年近くプログラミングしていないので、この本当に奇妙な言語を思い出すことにしました。 ベイジアンアルゴリズムに多くの時間を費やしたので、20年前にベイジアン分析がユーティリティでどのように見えるかを見るのは面白いと思いました。
ここでは、BASICのベイジアンモデルで使用される標準のモンテカルロマルコフ連鎖法(MCMC)であるMetropolis-Hastingsアルゴリズムを実装します。
ラプラス分布を最も魅力的なデータセットに適用しました。パックあたりのカブの数です。 サンプルは16の学校で構成されていました。 その結果、BASIC( source )を使用して、結果を計算して推測しました。
BASICの入手先
BASICにはさまざまなバージョンがありますが、私は育ったMicrosoft QBasic 1.1を使いました。 QBasicには、ユーザー定義型や(注意!)関数など、多くの高度な機能があります。 しかし、小文字の番号付けとGOTOを使用して旧式のBASICを作成するため、追加の設定は使用しませんでした。つまり、Commodore 64 BASICなどにコードを簡単にインポートできます。
こちらから QBasicをダウンロードしてください 。 また、無料です。 もちろん、まだDOSを使用しているのでなければ、次のステップはDOSBoxエミュレーターをインストールすることです。 QBASIC.EXEを実行すると、非常にわかりやすい明るい青色のインターフェイスが表示されます。 カスタムスクリプトを使用してテストできます。 彼は画面をクリアし、「HELLO WORLD」を印刷します。
QBasicの行番号付けはそれほど重要ではありませんが、プログラムが順番に実行されるため、古いBASIC(たとえばCommodore 64上にある)では必要です。
実装するもの
ベイジアンモデルの計算方法を学習する場合、最初に遭遇する古典的なMCMCにMetropolis-Hastingsアルゴリズムを実装します。
提示するベイジアンモデルには、単純な1次元ラプラス分布があります(ガウス分布にブレークを与えるためです)。 ラプラス分布は、ガウス分布と同様に、もちろん対称ですが、より鋭いピークと浅いテールを持っています。
これには2つのパラメーターがあります。シフトパラメーターμは平均値を決定し、 中央値と範囲bは分布の幅を決定します。
ラプラス分布では、中央値はパラメーターμの最大確率推定値です。 これを最も単純なベイジアンモデルに含めるには、2つのパラメーターが必要です。 ここで、Uniform(−∞、∞)をμとlog(b)に簡単に適用します。これは、P(μ)、P(log(b))∝1です。 フルモデル:
x∼ラプラス(μ、b)
μ∼均一(−∞、∞)
log(b)〜均一(−∞、∞)
繰り返しますが、使用するデータはおそらく私が使用した中で最もかわいいデータです。 16個のオオカミパックのサンプルに含まれるカブの数が含まれています(ソース)。
Rでの実装
BASICを掘り下げる前に、Rですべてを実装します。
# x <- c(5, 8, 7, 5, 3, 4, 3, 9, 5, 8, 5, 6, 5, 6, 4, 7) # The log posterior density of the Laplace distribution model, when assuming # uniform/flat priors. The Laplace distribution is not part of base R but is # available in the VGAM package. model <- function(pars) { sum(VGAM::dlaplace(x, pars[1], exp(pars[2]), log = TRUE)) } # The Metropolis-Hastings algorithm using a Uniform(-0.5, 0.5) proposal distribution metrop <- function(n_samples, model, inits) { samples <- matrix(NA, nrow = n_samples, ncol = length(inits)) samples[1,] <- inits for(i in 2:n_samples) { curr_log_dens <- model(samples[i - 1, ]) proposal <- samples[i - 1, ] + runif(length(inits), -0.5, 0.5) proposal_log_dens <- model(proposal) if(runif(1) < exp(proposal_log_dens - curr_log_dens)) { samples[i, ] <- proposal } else { samples[i, ] <- samples[i - 1, ] } } samples } samples <- metrop(n_samples = 1000, model, inits = c(0,0)) # Plotting a traceplot plot(samples[,1], type = "l", ylab = expression(Location ~ mu), col = "blue") # Calculating median posterior and 95% CI discarding the first 250 draws as "burnin". quantile(samples[250:1000,1], c(0.025, 0.5, 0.975))
## 2.5% 50% 97.5% ## 4.489 5.184 6.144
(このスクリプトは、BASICで何が起こるべきかを示しています。RのMCMCでMetropolis-Hastingsメソッドを試したい場合は、 MCMCpackパッケージのMCMCmetrop1RまたはこのMetropolis-Hastingsスクリプトを使用します 。
BASICのモデル
画面をクリアすることから始めましょう(
CLS
CLS
)および変数の定義。
DIM
配列と行列を定義します。
この短いコードでも、奇妙なものがたくさんあります。
- 古い学校に固執しようとするので、行番号はどこにでもあります。 それは自動的に追加されませんが、私によって規定されており、時々私は行をスキップします。 したがって、良いライフハック-行に10を追加して、不足している行に番号を挿入し、残りを上書きしないようにします(たとえば
75
75
スクリーンショットで)。 古いBASICには関数がないため、GOSUB
コマンドで行番号が使用されますGOSUB
そしてGOTO.
GOTO.
- すべての演算子は大文字で記述されます。演算子を小文字で記述すると、大文字に修正されます。
- なぜ
SAMPLES!
かSAMPLES!
SAMPLES!
QBasicでは、すべての変数は数字であり、そのタイプを変更するには、変数名に文字を追加する必要があります。 だからTHIS$
THIS$
これは文字列THAT!
THAT!
浮動小数点数です。 パラメータは連続しているため、ほとんどの変数は「!」で終わります。 -
DATA
チームDATA
-これはデータをプログラムに入れる良い方法READ.
後でREAD.
関数を使用してデータを抽出できますREAD.
READ.
データセットが複数ある場合は、幸運を祈ります。
モデルの定義を継続します。 式
RETURN
で終わるサブルーチンとして提示します
RETURN
。
GOSUB
式によって呼び出されます
GOSUB
GOSUB
,
, RETURN
, GOSUB.
-, . , . , . , PARAMS!
LOGDENS!.
READ X!,
DATA
RESTORE
READ.
-. , GOSUB 520,
520. RND,
0 1.
:
SAMPLES!
, 95 .
: PRINT "HELLO", "YOU!" HELLO YOU!, PRINT "HELLO"; "YOU!" HELLOYOU! "," ";" .
, , . , . , 320 x 200. : LINE (, )-(, ).
:
, .
GOTO
, . 33 MHz, 386 ( ), , . :
, , 4-5 6. , BASIC R :
( MCMCDEMO.BAS ),
, 20 . GOTO
GOSUB
- . ( END IF
NEXT I.
) 386 . , .
,
, RETURN
, GOSUB.
-, . , . , . , PARAMS!
LOGDENS!.
READ X!,
DATA
RESTORE
READ.
-. , GOSUB 520,
520. RND,
0 1.
:
SAMPLES!
, 95 .
: PRINT "HELLO", "YOU!" HELLO YOU!, PRINT "HELLO"; "YOU!" HELLOYOU! "," ";" .
, , . , . , 320 x 200. : LINE (, )-(, ).
:
, .
GOTO
, . 33 MHz, 386 ( ), , . :
, , 4-5 6. , BASIC R :
( MCMCDEMO.BAS ),
, 20 . GOTO
GOSUB
- . ( END IF
NEXT I.
) 386 . , .
,
, RETURN
, GOSUB.
-, . , . , . , PARAMS!
LOGDENS!.
READ X!,
DATA
RESTORE
READ.
-. , GOSUB 520,
520. RND,
0 1.
:
SAMPLES!
, 95 .
: PRINT "HELLO", "YOU!" HELLO YOU!, PRINT "HELLO"; "YOU!" HELLOYOU! "," ";" .
, , . , . , 320 x 200. : LINE (, )-(, ).
:
, .
GOTO
, . 33 MHz, 386 ( ), , . :
, , 4-5 6. , BASIC R :
( MCMCDEMO.BAS ),
, 20 . GOTO
GOSUB
- . ( END IF
NEXT I.
) 386 . , .
,
, RETURN
, GOSUB.
-, . , . , . , PARAMS!
LOGDENS!.
READ X!,
DATA
RESTORE
READ.
-. , GOSUB 520,
520. RND,
0 1.
:
SAMPLES!
, 95 .
: PRINT "HELLO", "YOU!" HELLO YOU!, PRINT "HELLO"; "YOU!" HELLOYOU! "," ";" .
, , . , . , 320 x 200. : LINE (, )-(, ).
:
, .
GOTO
, . 33 MHz, 386 ( ), , . :
, , 4-5 6. , BASIC R :
( MCMCDEMO.BAS ),
, 20 . GOTO
GOSUB
- . ( END IF
NEXT I.
) 386 . , .
,
, RETURN
, GOSUB.
-, . , . , . , PARAMS!
LOGDENS!.
READ X!,
DATA
RESTORE
READ.
-. , GOSUB 520,
520. RND,
0 1.
:
SAMPLES!
, 95 .
: PRINT "HELLO", "YOU!" HELLO YOU!, PRINT "HELLO"; "YOU!" HELLOYOU! "," ";" .
, , . , . , 320 x 200. : LINE (, )-(, ).
:
, .
GOTO
, . 33 MHz, 386 ( ), , . :
, , 4-5 6. , BASIC R :
( MCMCDEMO.BAS ),
, 20 . GOTO
GOSUB
- . ( END IF
NEXT I.
) 386 . , .
,
, RETURN
, GOSUB.
-, . , . , . , PARAMS!
LOGDENS!.
READ X!,
DATA
RESTORE
READ.
-. , GOSUB 520,
520. RND,
0 1.
:
SAMPLES!
, 95 .
: PRINT "HELLO", "YOU!" HELLO YOU!, PRINT "HELLO"; "YOU!" HELLOYOU! "," ";" .
, , . , . , 320 x 200. : LINE (, )-(, ).
:
, .
GOTO
, . 33 MHz, 386 ( ), , . :
, , 4-5 6. , BASIC R :
( MCMCDEMO.BAS ),
, 20 . GOTO
GOSUB
- . ( END IF
NEXT I.
) 386 . , .
,
, RETURN
, GOSUB.
-, . , . , . , PARAMS!
LOGDENS!.
READ X!,
DATA
RESTORE
READ.
-. , GOSUB 520,
520. RND,
0 1.
:
SAMPLES!
, 95 .
: PRINT "HELLO", "YOU!" HELLO YOU!, PRINT "HELLO"; "YOU!" HELLOYOU! "," ";" .
, , . , . , 320 x 200. : LINE (, )-(, ).
:
, .
GOTO
, . 33 MHz, 386 ( ), , . :
, , 4-5 6. , BASIC R :
( MCMCDEMO.BAS ),
, 20 . GOTO
GOSUB
- . ( END IF
NEXT I.
) 386 . , .
,
, RETURN
, GOSUB.
-, . , . , . , PARAMS!
LOGDENS!.
READ X!,
DATA
RESTORE
READ.
-. , GOSUB 520,
520. RND,
0 1.
:
SAMPLES!
, 95 .
: PRINT "HELLO", "YOU!" HELLO YOU!, PRINT "HELLO"; "YOU!" HELLOYOU! "," ";" .
, , . , . , 320 x 200. : LINE (, )-(, ).
:
, .
GOTO
, . 33 MHz, 386 ( ), , . :
, , 4-5 6. , BASIC R :
( MCMCDEMO.BAS ),
, 20 . GOTO
GOSUB
- . ( END IF
NEXT I.
) 386 . , .
,
, RETURN
, GOSUB.
-, . , . , . , PARAMS!
LOGDENS!.
READ X!,
DATA
RESTORE
READ.
-. , GOSUB 520,
520. RND,
0 1.
:
SAMPLES!
, 95 .
: PRINT "HELLO", "YOU!" HELLO YOU!, PRINT "HELLO"; "YOU!" HELLOYOU! "," ";" .
, , . , . , 320 x 200. : LINE (, )-(, ).
:
, .
GOTO
, . 33 MHz, 386 ( ), , . :
, , 4-5 6. , BASIC R :
( MCMCDEMO.BAS ),
, 20 . GOTO
GOSUB
- . ( END IF
NEXT I.
) 386 . , .
,
, RETURN
, GOSUB.
-, . , . , . , PARAMS!
LOGDENS!.
READ X!,
DATA
RESTORE
READ.
-. , GOSUB 520,
520. RND,
0 1.
:
SAMPLES!
, 95 .
: PRINT "HELLO", "YOU!" HELLO YOU!, PRINT "HELLO"; "YOU!" HELLOYOU! "," ";" .
, , . , . , 320 x 200. : LINE (, )-(, ).
:
, .
GOTO
, . 33 MHz, 386 ( ), , . :
, , 4-5 6. , BASIC R :
( MCMCDEMO.BAS ),
, 20 . GOTO
GOSUB
- . ( END IF
NEXT I.
) 386 . , .
,
, RETURN
, GOSUB.
-, . , . , . , PARAMS!
LOGDENS!.
READ X!,
DATA
RESTORE
READ.
-. , GOSUB 520,
520. RND,
0 1.
:
SAMPLES!
, 95 .
: PRINT "HELLO", "YOU!" HELLO YOU!, PRINT "HELLO"; "YOU!" HELLOYOU! "," ";" .
, , . , . , 320 x 200. : LINE (, )-(, ).
:
, .
GOTO
, . 33 MHz, 386 ( ), , . :
, , 4-5 6. , BASIC R :
( MCMCDEMO.BAS ),
, 20 . GOTO
GOSUB
- . ( END IF
NEXT I.
) 386 . , .
,
, RETURN
, GOSUB.
-, . , . , . , PARAMS!
LOGDENS!.
READ X!,
DATA
RESTORE
READ.
-. , GOSUB 520,
520. RND,
0 1.
:
SAMPLES!
, 95 .
: PRINT "HELLO", "YOU!" HELLO YOU!, PRINT "HELLO"; "YOU!" HELLOYOU! "," ";" .
, , . , . , 320 x 200. : LINE (, )-(, ).
:
, .
GOTO
, . 33 MHz, 386 ( ), , . :
, , 4-5 6. , BASIC R :
( MCMCDEMO.BAS ),
, 20 . GOTO
GOSUB
- . ( END IF
NEXT I.
) 386 . , .
,
, RETURN
, GOSUB.
-, . , . , . , PARAMS!
LOGDENS!.
READ X!,
DATA
RESTORE
READ.
-. , GOSUB 520,
520. RND,
0 1.
:
SAMPLES!
, 95 .
: PRINT "HELLO", "YOU!" HELLO YOU!, PRINT "HELLO"; "YOU!" HELLOYOU! "," ";" .
, , . , . , 320 x 200. : LINE (, )-(, ).
:
, .
GOTO
, . 33 MHz, 386 ( ), , . :
, , 4-5 6. , BASIC R :
( MCMCDEMO.BAS ),
, 20 . GOTO
GOSUB
- . ( END IF
NEXT I.
) 386 . , .
-
,
, RETURN
,GOSUB.
-, . , . , . ,PARAMS!
LOGDENS!.
READ X!,
DATA
RESTORE
READ.
-. ,GOSUB 520,
520.RND,
0 1.
:
SAMPLES!
, 95 .
: PRINT "HELLO", "YOU!" HELLO YOU!, PRINT "HELLO"; "YOU!" HELLOYOU! "," ";" .
, , . , . , 320 x 200. :LINE (, )-(, ).
:
, .
GOTO
, . 33 MHz, 386 ( ), , . :
, , 4-5 6. , BASIC R :
( MCMCDEMO.BAS ),
, 20 .GOTO
GOSUB
- . (END IF
NEXT I.
) 386 . , .
-
,
, RETURN
,GOSUB.
-, . , . , . ,PARAMS!
LOGDENS!.
READ X!,
DATA
RESTORE
READ.
-. ,GOSUB 520,
520.RND,
0 1.
:
SAMPLES!
, 95 .
: PRINT "HELLO", "YOU!" HELLO YOU!, PRINT "HELLO"; "YOU!" HELLOYOU! "," ";" .
, , . , . , 320 x 200. :LINE (, )-(, ).
:
, .
GOTO
, . 33 MHz, 386 ( ), , . :
, , 4-5 6. , BASIC R :
( MCMCDEMO.BAS ),
, 20 .GOTO
GOSUB
- . (END IF
NEXT I.
) 386 . , .
-
,
, RETURN
,GOSUB.
-, . , . , . ,PARAMS!
LOGDENS!.
READ X!,
DATA
RESTORE
READ.
-. ,GOSUB 520,
520.RND,
0 1.
:
SAMPLES!
, 95 .
: PRINT "HELLO", "YOU!" HELLO YOU!, PRINT "HELLO"; "YOU!" HELLOYOU! "," ";" .
, , . , . , 320 x 200. :LINE (, )-(, ).
:
, .
GOTO
, . 33 MHz, 386 ( ), , . :
, , 4-5 6. , BASIC R :
( MCMCDEMO.BAS ),
, 20 .GOTO
GOSUB
- . (END IF
NEXT I.
) 386 . , .
-
,
, RETURN
,GOSUB.
-, . , . , . ,PARAMS!
LOGDENS!.
READ X!,
DATA
RESTORE
READ.
-. ,GOSUB 520,
520.RND,
0 1.
:
SAMPLES!
, 95 .
: PRINT "HELLO", "YOU!" HELLO YOU!, PRINT "HELLO"; "YOU!" HELLOYOU! "," ";" .
, , . , . , 320 x 200. :LINE (, )-(, ).
:
, .
GOTO
, . 33 MHz, 386 ( ), , . :
, , 4-5 6. , BASIC R :
( MCMCDEMO.BAS ),
, 20 .GOTO
GOSUB
- . (END IF
NEXT I.
) 386 . , .
-
,
, RETURN
,GOSUB.
-, . , . , . ,PARAMS!
LOGDENS!.
READ X!,
DATA
RESTORE
READ.
-. ,GOSUB 520,
520.RND,
0 1.
:
SAMPLES!
, 95 .
: PRINT "HELLO", "YOU!" HELLO YOU!, PRINT "HELLO"; "YOU!" HELLOYOU! "," ";" .
, , . , . , 320 x 200. :LINE (, )-(, ).
:
, .
GOTO
, . 33 MHz, 386 ( ), , . :
, , 4-5 6. , BASIC R :
( MCMCDEMO.BAS ),
, 20 .GOTO
GOSUB
- . (END IF
NEXT I.
) 386 . , .