[Top] | [Contents] | [Index] | [ ? ] |
@overfullrule=0pt
1. 2元分割表HGMの関数説明書について | ||
2. 2元分割表HGMの関数 | ||
* modular計算 | ||
---|---|---|
Index |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
この説明書では HGM(holonomic gradient method) を用いた2元分割表の関数について説明する. ChangeLog の項目は www.openxm.org の cvsweb で ソースコードを読む時の助けになる情報が書かれている.
本文中で引用している文献を列挙する.
このマニュアルで説明する関数を用いたプログラム例は gtt_ekn/test-t1.rr など.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
2.1.1 gtt_ekn.gmvector | ||
2.1.2 gtt_ekn.nc | ||
2.1.3 gtt_ekn.lognc | ||
2.1.4 gtt_ekn.expectation | ||
2.1.5 gtt_ekn.setup | ||
2.1.6 gtt_ekn.upAlpha | ||
2.1.7 gtt_ekn.cmle |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
gtt_ekn.gmvector
:: 周辺和 beta, セルの確率 p の二元分割表に付随する超幾何関数 E(k,n) の値およびその微分の値を戻す.
の別名である.
ベクトル, 超幾何関数の値とその微分. 詳しくは下記.
行和, 列和のリスト. 成分はすべて正であること.
二元分割表のセルの確率のリスト
[[1,y11,...,y1n], [1,y21,...,y2n],..., [1,ym1, ...,ymn], [1,1, ..., 1]]
(1 が L 字型に並ぶ), と正規化した級数である.
S=F_D(-b[1,1], [-b[2,2],...,-b[2,n+1]], b[2,1]-b[1,1]+1 ; y)/C,
C=b[1,1]! b[2,2]! ... b[2][n+1]! (b[2,1]-b[1,1])! とおく. 1/C は L 字型の分割表
[[b[1,1], 0, ..., 0 ], [b[2,1]-b[1,1],b[2,2], ..., b[2,n+1]]]
に対応. gmvector は
[S,(y11/a2) d_11 S,(y12/a3) d_12 S, ..., (y1n/a_(n+1)) d_1n S]
である. ここで d_ij は yij についての微分,
[a0, a1, ... ,a_(n+2)] = [-b[1,2],-b[1,1],b[2,2], ..., b[2,n+1],b[2,1]]
である.
例: 次は2 x 2 分割表で行和が [5,1], 列和が [3,3], 各セルの確率が [[1/2,1/3],[1/7,1/5]] の場合の gmvector の値である.
[3000] load("gtt_ekn.rr"); [3001] ekn_gtt.gmvector([[5,1],[3,3]],[[1/2,1/3],[1/7,1/5]]) [775/27783] [200/9261] |
参考: 2 x m 分割表(Lauricella FD)についてはパッケージ tk_fd でも下記のように同等な 計算ができる. 守備範囲の異なるプログラム同士の比較, debug 用参考.
[3080] import("tk_fd.rr"); [3081] A=tk_fd.marginal2abc([4,5],[2,4,3]); [-4,[-4,-3],-1] // 2変数 FD のパラメータ. a,[b1,b2],c [3082] tk_fd.fd_hessian2(A[0],A[1],A[2],[1/2,1/3]); Computing Dmat(ca) for parameters B=[-4,-3],X=[ 1/2 1/3 ] [4483/124416,[ 1961/15552 185/1728 ], [ 79/288 259/864 ] [ 259/864 47/288 ]] // 戻値は [F=F_D, gradient(F), Hessian(F)] // ekn_gt での例と同じパラメータ. [3543] A=tk_fd.marginal2abc([5,1],[3,3]); [-5,[-3],-1] [3544] tk_fd.fd_hessian2(A[0],A[1],A[2],[(1/3)*(1/7)/((1/2)*(1/5))]); Computing Dmat(ca) for parameters B=[-3],X=[ 10/21 ] [775/27783,[ 20/147 ],[ 17/42 ]] |
参考: 一般の A 分布の正規化定数についての Hessian の計算は実験的 package ot_hessian_ahg.rr で実装のテストがされている. (これはまだ未完成のテスト版なので出力形式等も将来的には変更される.)
import("ot_hgm_ahg.rr"); import("ot_hessian_ahg.rr"); def htest4() { extern C11_A; extern C11_Beta; Hess=newmat(7,7); A =C11_A; Beta0= [b0,b1,b2,b3]; BaseIdx=[4,5,6]; X=[x0,x1,x2,x3,x4,x5,x6]; for (I=0; I<7; I++) for (J=0; J<7; J++) { Idx = [I,J]; H=hessian_simplify(A,Beta0,X,BaseIdx,Idx); Hess[I][J]=H; printf("[I,J]=%a, Hessian_ij=%a\n",Idx,H); } return(Hess); } [2917] C11_A; [[0,0,0,1,1,1,1],[1,0,0,1,0,1,0],[0,1,1,0,1,0,1],[1,1,0,1,1,0,0]] [2918] C11_Beta; [166,36,290,214] [2919] Ans=htest4$ [2920] Ans[0][0]; [[((b1-b0-1)*x4)/(x0^2),[4]],[((b1-b0-1)*x6)/(x0^2),[6]], [(b1^2+(-2*b0-1)*b1+b0^2+b0)/(x0^2),[]],[(x6)/(x0),[6,0]],[(x4)/(x0),[4,0]]] |
gtt_ekn.setup
@ref{gtt_ekn.pfaffian_basis}
ChangeLog
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
gtt_ekn.nc
:: 周辺和 beta, セルの確率 p の二元分割表の条件付き確率の正規化定数 Z およびその微分の値を戻す.
ベクトル [Z,[[d_11 Z, d_12 Z, ...], ..., [d_m1 Z, d_m2 Z, ...., d_mn Z]]]
行和, 列和のリスト. 成分はすべて正であること.
二元分割表のセルの確率のリスト
例: 2x3 分割表での Z とその微分の計算.
[2237] gtt_ekn.nc([[4,5],[2,4,3]],[[1,1/2,1/3],[1,1,1]]); [4483/124416,[ 353/7776 1961/15552 185/1728 ] [ 553/20736 1261/15552 1001/13824 ]] |
参考: 2 x m 分割表(Lauricella FD)についてはパッケージ tk_fd でも下記のように同等な 計算ができる.
[3076] import("tk_fd.rr"); [3077] A=tk_fd.marginal2abc([4,5],[2,4,3]); [-4,[-4,-3],-1] [3078] tk_fd.ahmat_abc(A[0],A[1],A[2],[[1,1/2,1/3],[1,1,1]]); RS=[ 4 5 ], CSnew=[ 2 4 3 ], Ynew=[ 1 1/2 1/3 ] [ 1 1 1 ] Computing Dmat(ca) for parameters B=[-4,-3],X=[ 1/2 1/3 ] [4483/124416,[[353/7776,1961/15552,185/1728], [553/20736,1261/15552,1001/13824]]] // 戻値は [Z, [[d_11 Z, d_12 Z, d_13 Z], // [d_21 Z, d_22 Z, d_23 Z]]] の値. // ここで d_ij は i,j 成分についての微分を表す. |
ChangeLog
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
gtt_ekn.lognc
:: 周辺和 beta, セルの確率 p の二元分割表の条件付き確率の正規化定数 Z の log の近似値およびその微分の近似値を戻す.
ベクトル [log(Z), [[d_11 log(Z), d_12 log(Z), ...], [d_21 log(Z),...], ... ]
行和, 列和のリスト. 成分はすべて正であること.
二元分割表のセルの確率のリスト
例: 2 × 3 分割表での例. 第一成分のみ近似値.
[2238] gtt_ekn.lognc([[4,5],[2,4,3]],[[1,1/2,1/3],[1,1,1]]); [-3.32333832422461674630,[ 5648/4483 15688/4483 13320/4483 ] [ 3318/4483 10088/4483 9009/4483 ]] |
参考: 2 x m 分割表(Lauricella FD)についてはパッケージ tk_fd でも下記のように同等な 計算ができる.
[3076] import("tk_fd.rr"); [3077] A=tk_fd.marginal2abc([4,5],[2,4,3]); [-4,[-4,-3],-1] [3078] tk_fd.log_ahmat_abc(A[0],A[1],A[2],[[1,1/2,1/3],[1,1,1]]); RS=[ 4 5 ], CSnew=[ 2 4 3 ], Ynew=[ 1 1/2 1/3 ] [ 1 1 1 ] Computing Dmat(ca) for parameters B=[-4,-3],X=[ 1/2 1/3 ] [-3.32333832422461674639485797719209322217260539267246045320, [[1.2598706, 3.499442, 2.971224], [0.7401293, 2.250278, 2.009591]]] // 戻値は [log(Z), // [[d_11 log(Z), d_12 log(Z), d_13 log(Z)], // [d_21 log(Z), d_22 log(Z), d_23 log(Z)]]] // の近似値. |
ChangeLog
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
gtt_ekn.expectation
:: 周辺和 beta, セルの確率 p の二元分割表の期待値を計算する.
二元分割表の各セルの期待値のリスト.
行和, 列和のリスト. 成分はすべて正であること.
二元分割表のセルの確率のリスト
2×2, 3×3 の分割表の期待値計算例.
[2235] gtt_ekn.expectation([[1,4],[2,3]],[[1,1/3],[1,1]]); [ 2/3 1/3 ] [ 4/3 8/3 ] [2236] gtt_ekn.expectation([[4,5],[2,4,3]],[[1,1/2,1/3],[1,1,1]]); [ 5648/4483 7844/4483 4440/4483 ] [ 3318/4483 10088/4483 9009/4483 ] [2442] gtt_ekn.expectation([[4,14,9],[11,6,10]],[[1,1/2,1/3],[1,1/5,1/7],[1,1,1]]); [ 207017568232262040/147000422096729819 163140751505489940/147000422096729819 217843368649167296/147000422096729819 ] [ 1185482401011137878/147000422096729819 358095302885438604/147000422096729819 514428205457640984/147000422096729819 ] [ 224504673820628091/147000422096729819 360766478189450370/147000422096729819 737732646860489910/147000422096729819 ] |
参考: 2 x m 分割表(Lauricella FD)についてはパッケージ tk_fd でも下記のように同等な 計算ができる.
[3076] import("tk_fd.rr"); [3077] A=tk_fd.marginal2abc([4,5],[2,4,3]); [-4,[-4,-3],-1] [3078] tk_fd.expectation_abc(A[0],A[1],A[2],[[1,1/2,1/3],[1,1,1]]); RS=[ 4 5 ], CSnew=[ 2 4 3 ], Ynew=[ 1 1/2 1/3 ] [ 1 1 1 ] Computing Dmat(ca) for parameters B=[-4,-3],X=[ 1/2 1/3 ] [[5648/4483,7844/4483,4440/4483], [3318/4483,10088/4483,9009/4483]] // 各セルの期待値. |
参考: 一般の A 分布の計算は ot_hgm_ahg.rr. まだ実験的なため, module 化されていない. ot_hgm_ahg.rr についての参考文献: K.Ohara, N.Takayama, Pfaffian Systems of A-Hypergeometric Systems II -- Holonomic Gradient Method, arxiv:1505.02947
[3237] import("ot_hgm_ahg.rr"); // 2 x 2 分割表. [3238] hgm_ahg_expected_values_contiguity([[0,0,1,1],[1,0,1,0],[0,1,0,1]], [9,6,8],[1/2,1/3,1/5,1/7],[x1,x2,x3,x4]|geometric=1); oohg_native=0, oohg_curl=1 [1376777025/625400597,1750225960/625400597, 2375626557/625400597,3252978816/625400597] // 2 x 2 分割表の期待値. // 2 x 3 分割表. [3238] hgm_ahg_expected_values_contiguity( [[0,0,0,1,1,1],[1,0,0,1,0,0],[0,1,0,0,1,0],[0,0,1,0,0,1]], [5,2,4,3],[1,1/2,1/3,1,1,1],[x1,x2,x3,x4,x5,x6]|geometric=1); [5648/4483,7844/4483,4440/4483,3318/4483,10088/4483,9009/4483] // 2 x 3 分割表の期待値. 上と同じ問題. |
3 x 3 分割表. 構造的0が一つ.
/* dojo, p.221 のデータ. 成績3以下の生徒は集めてひとつに. 2 1 1 8 3 3 0 2 6 row sum: 4,14,8 column sum: 10,6,10 0 を一つ含むので, (3,6) 型の A から 7 列目を抜く. */ A=[[0,0,0,1,1,1, 0,0], [0,0,0,0,0,0, 1,1], [1,0,0,1,0,0, 0,0], [0,1,0,0,1,0, 1,0], [0,0,1,0,0,1, 0,1]]; B=[14,8,10,6,10]; hgm_ahg_expected_values_contiguity(A,B,[1,1/2,1/3,1,1/5,1/7,1,1], [x1,x2,x3,x4,x5,x6,x7,x8]|geometric=1); // 答. [14449864949304/9556267369631, 10262588586540/9556267369631, 13512615942680/9556267369631, 81112808747006/9556267369631, 21816297744346/9556267369631, 30858636683482/9556267369631, 25258717886900/9556267369631,51191421070148/9556267369631] |
3 x 3 分割表.
/* 上のデータで 0 を 1 に変更. 2 1 1 8 3 3 1 2 6 row sum: 4,14,9 column sum: 11,6,10 */ A=[[0,0,0,1,1,1,0,0,0], [0,0,0,0,0,0,1,1,1], [1,0,0,1,0,0,1,0,0], [0,1,0,0,1,0,0,1,0], [0,0,1,0,0,1,0,0,1]]; B=[14,9,11,6,10]; hgm_ahg_expected_values_contiguity(A,B,[1,1/2,1/3,1,1/5,1/7,1,1,1], [x1,x2,x3,x4,x5,x6,x7,x8]|geometric=1); // 期待値, 答. x9 を指定していないので, 9番目の期待値は出力してない. [207017568232262040/147000422096729819, 163140751505489940/147000422096729819,217843368649167296/147000422096729819, 1185482401011137878/147000422096729819, 358095302885438604/147000422096729819,514428205457640984/147000422096729819, 224504673820628091/147000422096729819,360766478189450370/147000422096729819] // Z やその微分の計算は hgm_ahg_contiguity 関数がおこなうが, これの簡易インターフェースは // まだ書いてない. |
ChangeLog
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
gtt_ekn.setup
:: 分散計算用の環境設定をおこなう. 現在の環境を報告する.
例: 素数のリストを生成してファイル p.txt へ書き出す.
gtt_ekn.setup(|nps=2,nprm=20,minp=10^10,fgp="p.txt")$ |
ChangeLog
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
gtt_ekn.upAlpha
::
例: 以下の例は 2×2分割表(E(2,4)), 2×3分割表(E(2,5))の場合である. [2225] までは出力を略している.
[2221] gtt_ekn.marginaltoAlpha([[1,4],[2,3]]); [[a_0,-4],[a_1,-1],[a_2,3],[a_3,2]] [2222] gtt_ekn.upAlpha(1,1,1); // E(2,4) の a_1 方向の // contiguity を表現する行列 [2223] gtt_ekn.upAlpha(2,1,1); // E(2,4) の a_2 方向 [2224] gtt_ekn.upAlpha(3,1,1); // E(2,4) の a_3 方向 [2225] function f(x_1_1); [2232] gtt_ekn.pfaffian_basis(f(x_1_1),1,1); [ f(x_1_1) ] [ (f{1(x_1_1)*x_1_1)/(a_2) ] [2233] function f(x_1_1,x_1_2); f() redefined. [2234] gtt_ekn.pfaffian_basis(f(x_1_1,x_1_2),1,2); // E(2,5), 2*3 分割表 [ f(x_1_1,x_1_2) ] [ (f{1,0(x_1_1,x_1_2)*x_1_1)/(a_2) ] [ (f{0,1(x_1_1,x_1_2)*x_1_2)/(a_3) ] |
ChangeLog
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
gtt_ekn.cmle
::
例: 2 x 4 分割表.
U=[[1,1,2,3],[1,3,1,1]]; gtt_ekn.cmle(U); [[ 1 1 2 3 ] [ 1 3 1 1 ],[[7,6],[2,4,3,4]], // Data, row sum, column sum [ 1 67147/183792 120403/64148 48801/17869 ] // probability obtained. [ 1 1 1 1 ]] |
例: 上の例は次の関数に.
gtt_ekn.cmle_test3(); |
ChangeLog
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
3.1.1 gtt_ekn.chinese_itor |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
gtt_ekn.chinese_itor
:: mod p で計算した結果(ベクトル)から chinese remainder theorem, itor(integer to rational) で有理数ベクトルを得る.
例: [3!, 5^3*3!]=[6,750] が戻り値. 6 mod 109 =6, 750 mod 109=96 が最初の引数の [[6,96],109]. 以下同様.
gtt_ekn.setup(|nps=2,nprm=3,minp=101,fgp="p_small.txt"); SS=gtt_ekn.get_svalue(); SS[0]; [103,107,109] // list of primes SS[1]; [0,2] // list of server ID's gtt_ekn.chinese_itor([[[ 6,96 ],109],[[ 6,29 ],103],[[ 6,1 ],107]],SS[1]); [[ 6 750 ],1201289] // 引数はスカラーでもよい. gtt_ekn.chinese_itor([[96,109],[29,103]],SS[1]); [[ 750 ],11227] |
例: gtt_ekn/childprocess.rr (server で実行される) の関数 chinese (chinese remainder theorem) と euclid.
load("gtt_ekn/childprocess.rr"); chinese([newvect(2,[6,29]),103],[newvect(2,[6,750]),107*109]); // mod 103 で [6,29], mod (107*109) で [6,750] となる数を mod 103*(107*109) // で求めると, [[ 6 750 ],1201289] euclid(3,103); // mod 103 での 3 の逆数. つまり 1/3 -34 3*(-34) % 103; // 確かに逆数. 1 |
例: gtt_ekn/childprocess.rr (server で実行される) の関数 itor (integer to rational) の例. itor(Y,Q,Q2,Idx) では Y < Q2 なら Y がそのまま戻る. Idx は 内部用の index で好きな数でよい. 戻り値の第2成分となる.
load("gtt_ekn/childprocess.rr"); for (I=1;I<11; I++) print([I,itor(I,11,3,0)]); [1,[1,0]] [2,[2,0]] [3,[-2/3,0]] //euclid(3,11); ->4, 4*(-2)%11 -> 3 なので確かに -2/3 は元の数の候補 [4,[failure,0]] [5,[-1/2,0]] [6,[1/2,0]] [7,[-1/3,0]] [8,[failure,0]] [9,[-2,0]] [10,[-1,0]] |
ChangeLog
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Jump to: | G |
---|
Jump to: | G |
---|
[Top] | [Contents] | [Index] | [ ? ] |
[Top] | [Contents] | [Index] | [ ? ] |
[Top] | [Contents] | [Index] | [ ? ] |
This document was generated by Nobuki Takayama on June, 8 2017 using texi2html 1.76.
The buttons in the navigation panels have the following meaning:
Button | Name | Go to | From 1.2.3 go to |
---|---|---|---|
[ < ] | Back | previous section in reading order | 1.2.2 |
[ > ] | Forward | next section in reading order | 1.2.4 |
[ << ] | FastBack | beginning of this chapter or previous chapter | 1 |
[ Up ] | Up | up section | 1.2 |
[ >> ] | FastForward | next chapter | 2 |
[Top] | Top | cover (top) of document | |
[Contents] | Contents | table of contents | |
[Index] | Index | index | |
[ ? ] | About | about (help) |
where the Example assumes that the current position is at Subsubsection One-Two-Three of a document of the following structure:
This document was generated by Nobuki Takayama on June, 8 2017 using texi2html 1.76.