public void SerializeTest2()
{
double[][] inputs =
{
new double[] { 1, 4, 2, 0, 1 },
new double[] { 1, 3, 2, 0, 1 },
new double[] { 3, 0, 1, 1, 1 },
new double[] { 3, 0, 1, 0, 1 },
new double[] { 0, 5, 5, 5, 5 },
new double[] { 1, 5, 5, 5, 5 },
new double[] { 1, 0, 0, 0, 0 },
new double[] { 1, 0, 0, 0, 0 },
};
int[] outputs =
{
0, 0,
1, 1,
2, 2,
3, 3,
};
// Reload the machines
var target = Serializer.Load<MultilabelSupportVectorMachine>(Properties.Resources.ml_svm);
double actual;
int count = 0; // Compute errors
for (int i = 0; i < inputs.Length; i++)
{
double[] responses;
target.Compute(inputs[i], out responses);
int y; responses.Max(out y);
if (y != outputs[i]) count++;
}
actual = (double)count / inputs.Length;
Assert.AreEqual(0, actual);
Assert.AreEqual(5, target.Inputs);
Assert.AreEqual(4, target.Classes);
double[] thresholds = target.Machines.Apply(x => x.Threshold);
double[][][] svs = target.Machines.Apply(x => x.SupportVectors);
double[][] weights = target.Machines.Apply(x => x.Weights);
string str = weights.ToString(CSharpJaggedMatrixFormatProvider.InvariantCulture);
var expectedThresholds = new double[] { -1.02283345107303, -1.84854331146833, -1.54770710059171, 1.58508471778734 };
var expectedSVs = new double[][][]
{
new double[][]
{
new double[] { 1, 5, 5, 5, 5 },
new double[] { 1, 3, 2, 0, 1 },
new double[] { 3, 0, 1, 0, 1 },
new double[] { 0, 5, 5, 5, 5 },
new double[] { 1, 0, 0, 0, 0 },
new double[] { 1, 0, 0, 0, 0 }
},
new double[][]
{
new double[] { 3, 0, 1, 1, 1 },
new double[] { 1, 0, 0, 0, 0 },
new double[] { 3, 0, 1, 0, 1 },
new double[] { 1, 0, 0, 0, 0 },
new double[] { 1, 5, 5, 5, 5 }
},
new double[][]
{
new double[] { 1, 5, 5, 5, 5 },
new double[] { 1, 4, 2, 0, 1 },
new double[] { 0, 5, 5, 5, 5 }
},
new double[][]
{
new double[] { 1, 0, 0, 0, 0 },
new double[] { 3, 0, 1, 1, 1 },
new double[] { 1, 3, 2, 0, 1 },
new double[] { 3, 0, 1, 0, 1 }
}
};
double[][] expectedWeights = new double[][] {
new double[] { -0.0234960254651262, 0.39850600072147, -0.0378635563194698, -0.0921056339066905, -0.15657076610795, -0.0884700189222341 },
new double[] { 0.274739982272114, -0.161382051864791, 0.152130797418313, -0.209064650742987, -0.0564240770826484 },
new double[] { 0.0384615384615383, -0.0392011834319528, 0.000739644970414358 },
new double[] { 0.373020681418016, -0.00340179246301696, -0.079374696169365, -0.290244192785634 }
};
//Matrix.IsEqual(
Assert.IsTrue(thresholds.IsEqual(expectedThresholds, rtol: 1e-8));
Assert.IsTrue(svs.IsEqual(expectedSVs, rtol: 1e-8));
Assert.IsTrue(weights.IsEqual(expectedWeights, rtol: 1e-8));
}