public Create ( bool logarithm, double &transitionMatrix, double &initialState ) : int | ||
logarithm | bool | |
transitionMatrix | double | |
initialState | double | |
리턴 | int |
public int Create(bool logarithm, out double[,] transitionMatrix, out double[] initialState)
{
int m = System.Math.Min(States, Deepness);
double[,] A = new double[States, States];
if (random)
{
// Create pi
double sum = 0;
for (int i = 0; i < states; i++)
sum += pi[i] = Accord.Math.Random.Generator.Random.NextDouble();
for (int i = 0; i < states; i++)
pi[i] /= sum;
// Create A using random uniform distribution,
// without allowing backward transitions
for (int i = 0; i < states; i++)
{
sum = 0.0;
for (int j = i; j < m; j++)
sum += A[i, j] = Accord.Math.Random.Generator.Random.NextDouble();
for (int j = i; j < m; j++)
A[i, j] /= sum;
}
}
else
{
// Create A using equal uniform probabilities,
// without allowing backward transitions.
for (int i = 0; i < states; i++)
{
double d = 1.0 / Math.Min(m, states - i);
for (int j = i; j < states && (j - i) < m; j++)
A[i, j] = d;
}
}
if (logarithm)
{
transitionMatrix = Elementwise.Log(A);
initialState = Elementwise.Log(pi);
}
else
{
transitionMatrix = A;
initialState = (double[])pi.Clone();
}
return States;
}
public void ForwardTest3() { var topology = new Forward(states: 3, deepness: 2); double[,] actualA; double[] actualPi; double[,] expectedA; double[] expectedPi; int actualStates = topology.Create(true, out actualA, out actualPi); int expectedStates = topology.Create(false, out expectedA, out expectedPi); for (int i = 0; i < 3; i++) for (int j = 0; j < 3; j++) Assert.AreEqual(actualA[i, j], System.Math.Log(expectedA[i, j])); for (int i = 0; i < 3; i++) for (int j = 0; j < 3; j++) Assert.AreEqual(actualPi[i], System.Math.Log(expectedPi[i])); Assert.AreEqual(actualStates, expectedStates); Assert.AreEqual(actualStates, 3); }