public static void InitialParameter(int _m, int _n, int _k) { m = _m + 1; n = _n; k = _k; alpha = Enumerable.Range(0, m - 1).Select(dp => 1.0).ToArray(); beta = Enumerable.Range(0, k).Select(dp => 1.0).ToArray(); MathNet.Numerics.Distributions.Dirichlet dPhi = new MathNet.Numerics.Distributions.Dirichlet(alpha); MathNet.Numerics.Distributions.Dirichlet dTheta = new MathNet.Numerics.Distributions.Dirichlet(beta); phi = new MathNet.Numerics.Distributions.Categorical[m]; zArr = new int[n]; var p = new double[k]; for (int i = 0; i < k; i++) p[i] = 1.0 / k; theta = new MathNet.Numerics.Distributions.Categorical( p ); for (int i = 0; i < n; i++) { zArr[i] = theta.Sample(); } for (int i = 0; i < m; i++) { phi[i] = new MathNet.Numerics.Distributions.Categorical( dPhi.Sample() ); } }
public static void GibbsSamplingEach(List<SequenceEle> seq, int[][] matrix) { for (int i = 0; i < n; i++) { //draw z double[] p = new double[k]; for (int z = 0; z < k; z++) { var theta_tmp = theta.P[z]; var phi_tmp = 0.0; if (i == 0) try { phi_tmp = phi[m - 1].P[seq[i].tIndex]; } catch (Exception e) { } else try { phi_tmp = phi[seq[i - 1].tIndex].P[seq[i].tIndex]; } catch (Exception e) { } if (phi_tmp <= 0) phi_tmp = 1.0 / Math.Pow(10, 100); try { var f = Math.Exp( (-1) * Math.Pow((z + 1 - matrix[i][seq[i].tIndex] ), 2) ); p[z] = Math.Pow(10, 10) * theta_tmp * phi_tmp * f; } catch (Exception e) { } } try { MathNet.Numerics.Distributions.Categorical dis = new MathNet.Numerics.Distributions.Categorical(p); zArr[i] = dis.Sample(); } catch (Exception e) { } var beta_tmp = new double[k]; beta.CopyTo(beta_tmp, 0); foreach (var g in zArr.GroupBy(dp => dp)) { beta_tmp[g.Key] += g.Count(); } var d_tmp = new MathNet.Numerics.Distributions.Dirichlet(beta_tmp); theta = new MathNet.Numerics.Distributions.Categorical(d_tmp.Sample()); for (int j = 0; j < m; j++) { p = Enumerable.Range(0, m).Select(dp => 1.0).ToArray(); for (int ii = 0; ii < n; ii++) { if (j == m - 1 && ii == 0) { try { var z = zArr[ii]; var f = Math.Exp( (-1) * Math.Pow((z - matrix[ii][seq[ii].tIndex] / ((double)matrix[ii].Max()) * k), 2) ); p[seq[ii].tIndex] *= phi[j].P[seq[ii].tIndex] * f; } catch (Exception e) { } } else { if (ii == 0) continue; try { if (seq[ii - 1].tIndex == j) { var z = zArr[ii]; var f = Math.Exp( (-1) * Math.Pow((z + 1 - matrix[ii][seq[ii].tIndex] ), 2) ); p[seq[ii].tIndex] *= phi[j].P[seq[ii].tIndex] * f; } } catch (Exception e) { } } } for (int s = 0; s < p.Length; s++) if (p[s] == 1.0 || p[s] <= 0) p[s] = 1.0 / Math.Pow(10, 100); phi[j] = new MathNet.Numerics.Distributions.Categorical(p); } } }