double CHierarchicalDP::SamplingLambda( double oldLambda ) { for(int i=0 ; i<50 ; i++ ) { float gammaB = 0; // ガンマ関数スケールパラメータ float gammaA = 0; // ガンマ関数形状パラメータ int numAllTables = 0; for(int d=0 ; d<m_dataNum ; d++ ) { int len = m_documents_d[d].length; // ベータ分布からサンプル生成 float w = genbet( (float)oldLambda+1 , (float)len ); gammaB -= log(w); // 二値分布からサンプリング int s = (RandF() * (oldLambda + len)) < len ? 1 : 0; gammaA -= s; // テーブルの総数を計算 numAllTables += (int)m_documents_d[d].tables_t.size()-1; } // 事後分布のパラメタを計算 gammaA += (float)(HDP_CONCPARA_PRIOR_A + numAllTables); gammaB += (float)HDP_CONCPARA_PRIOR_B; // 更新 oldLambda = (double)gengam( gammaB , gammaA ); } return oldLambda; }
double CHierarchicalDP::SamplingGamma( double oldGamma ) { // テーブルの総数を計算 int numAllTables = 0; for(int k=0 ; k<m_dishes_k.size() ; k++ ) { numAllTables += m_dishes_k[k].GetPopularity(); } for(int i=0 ; i<20 ; i++ ) { float gammaB = 0; // ガンマ関数スケールパラメータ float gammaA = 0; // ガンマ関数形状パラメータ int numDish = (int)m_dishes_k.size(); // ベータ分布からサンプル生成 float w = genbet( (float)oldGamma+1 , (float)numAllTables ); // 二値の分布をサンプリング int s = (RandF() * (oldGamma + numDish)) < numDish ? 1 : 0; gammaA = (float)(HDP_CONCPARA_PRIOR_A + numDish - s); gammaB = (float)(HDP_CONCPARA_PRIOR_B - log(w)); // 更新 oldGamma = (double)gengam( gammaB , gammaA ); } return oldGamma; }
static int rbeta_rng (lua_State *L) { nl_RNG *r = getrng(L); lua_Number a = luaL_checknumber(L, 1); lua_Number b = luaL_checknumber(L, 2); checknp(L, a); checknp(L, b); setdeviate(number, genbet(r, a, b), 3); return 1; }