public void SparseLinearTest()
{
MulticlassSupportVectorMachine<Linear> svm1;
MulticlassSupportVectorMachine<Linear, Sparse<double>> svm2;
{
Accord.Math.Random.Generator.Seed = 0;
MemoryStream file = new MemoryStream(
Encoding.Default.GetBytes(Resources.iris_scale));
var reader = new SparseReader(file, Encoding.Default);
var samples = reader.ReadDenseToEnd();
double[][] x = samples.Item1;
int[] y = samples.Item2.ToMulticlass();
var learner = new MulticlassSupportVectorLearning<Linear>()
{
Learner = (p) => new LinearDualCoordinateDescent<Linear>()
};
svm1 = learner.Learn(x, y);
}
{
Accord.Math.Random.Generator.Seed = 0;
MemoryStream file = new MemoryStream(
Encoding.Default.GetBytes(Resources.iris_scale));
// Create a new Sparse Sample Reader to read any given file,
// passing the correct dense sample size in the constructor
var reader = new SparseReader(file, Encoding.Default);
var samples = reader.ReadSparseToEnd();
Sparse<double>[] x = samples.Item1;
int[] y = samples.Item2.ToMulticlass();
var learner = new MulticlassSupportVectorLearning<Linear, Sparse<double>>()
{
Learner = (p) => new LinearDualCoordinateDescent<Linear, Sparse<double>>()
};
svm2 = learner.Learn(x, y);
}
Assert.AreEqual(svm1.Models.Length, svm2.Models.Length);
for (int i = 0; i < svm1.Models.Length; i++)
{
var ma = svm1[i].Value;
var mb = svm2[i].Value;
Assert.IsTrue(ma.Weights.IsEqual(mb.Weights));
Assert.AreEqual(ma.SupportVectors.Length, mb.SupportVectors.Length);
for (int j = 0; j < ma.SupportVectors.Length; j++)
{
double[] expected = ma.SupportVectors[j];
double[] actual = mb.SupportVectors[j].ToDense(4);
Assert.IsTrue(expected.IsEqual(actual, 1e-5));
}
}
}
}