【发布时间】:2018-02-16 02:26:02
【问题描述】:
我正在尝试通过在 Accord.Net 中使用 OneclassSupportVectorLearning 来实现异常检测。我在训练过程中遇到了 NullReference 错误。下面是我在测试中的示例代码。 感谢是否有人可以帮助我解决这个问题。
double[][] inputs =
{
new double[] { 0, 1, 1, 0 }, // 0
new double[] { 0, 1, 0, 0 }, // 0
new double[] { 0, 0, 1, 0 }, // 0
new double[] { 0, 1, 1, 0 }, // 0
new double[] { 0, 1, 0, 0 }, // 0
};
var oteacher = new OneclassSupportVectorLearning<ChiSquare,double[]>();
var k = oteacher.Learn(inputs); //NullReference error occur here.
编辑------------------------------ ----------------------
根据 Jstreet 的评论,尝试下面的代码,但它适用于 2-dim,但在更高维度上会失败。
static void Main(string[] args)
{
Random r = new Random(DateTime.Now.Millisecond);
int size = 1000;
int min = 45;
int max = 55;
double[][] inputs = new double[size][];
for (int i = 0; i < size; i++)
{
double[] d = new double[] { r.Next(min,max), r.Next(min,max), r.Next(min,max), r.Next(min,max) };
inputs[i] = d;
}
var oteacher = new OneclassSupportVectorLearning<ChiSquare>();
var k = oteacher.Learn(inputs);
double[][] test =
{
// normal
new double[] { 50, 53 , 50, 50},
new double[] { 49, 52 , 50, 50},
new double[] { 48, 51 , 50, 50},
new double[] { 47, 52 , 50, 50},
new double[] { 46, 53 , 50, 50},
// anomalies
new double[] { 50, 70, 70, 70 },
new double[] { 51, 69, 70, 70 },
new double[] { 52, 68, 70, 70 },
new double[] { 53, 67, 70, 70 },
new double[] { 54, 66, 70, 70 },
};
foreach (double[] d in test)
{
if (k.Decide(d) == true)
Console.WriteLine(" OK = {0}, {1}, {2}, {3}", d[0], d[1], d[2], d[3]);
else Console.WriteLine(" Anomaly = {0}, {1}, {2}, {3}", d[0], d[1], d[2], d[3]);
}
Console.ReadLine();
}
【问题讨论】:
-
更新到版本 3.4.2-alpha.
-
感谢 jstress!我尝试了最新的预版本,它现在可以运行了。当它完成学习时,我通过传回训练集来运行“k.Decide(inputs)”方法。但它只是返回整个训练集的所有“假”(假设都是“真”)。我在这里检查了代码,根据在线文档它应该是有效的。不胜感激,如果你能分享我更多的提示。
标签: c# .net machine-learning svm accord.net