Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
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;
}
Exemplo n.º 3
0
Arquivo: rng.c Projeto: LuaDist/numlua
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;
}