gpt4 book ai didi

c# - 在 Accord.Net 中如何使用 One-Class SVM 进行异常检测?

转载 作者:太空宇宙 更新时间:2023-11-03 12:31:25 25 4
gpt4 key购买 nike

我正在尝试通过在 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();

最佳答案

我建议您尝试使用二维数据集,这样您就可以可视化结果并感受一下:

    static void Main(string[] args)
{
Random r = new Random(DateTime.Now.Millisecond);

int size = 100;
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) };
inputs[i] = d;
}

var oteacher = new OneclassSupportVectorLearning<ChiSquare>();
var k = oteacher.Learn(inputs);

double[][] test =
{
// normal
new double[] { 50, 53 },
new double[] { 49, 52 },
new double[] { 48, 51 },
new double[] { 47, 52 },
new double[] { 46, 53 },
// anomalies
new double[] { 50, 70 },
new double[] { 51, 69 },
new double[] { 52, 68 },
new double[] { 53, 67 },
new double[] { 54, 66 },
};

foreach (double[] d in test)
{
if (k.Decide(d) == true)
Console.WriteLine(" OK = {0}, {1}", d[0], d[1]);
else Console.WriteLine(" Anomaly = {0}, {1}", d[0], d[1]);
}

Console.ReadLine();
}

此示例代码生成以下输出:

 OK = 50, 53 
OK = 49, 52
OK = 48, 51
OK = 47, 52
OK = 46, 53
Anomaly = 50, 70
Anomaly = 51, 69
Anomaly = 52, 68
Anomaly = 53, 67
Anomaly = 54, 66

这是相同结果的图形 View :

enter image description here


编辑:就像我说的,这需要一些实验。这是我对 4 维输入数据集的结果。请注意,我减少了每个维度的可变性并保持相同的输入大小 100。

    static void Main(string[] args)
{
Random r = new Random(DateTime.Now.Millisecond);

int size = 100;
int min = 45;
int max = 50;
int min2 = 60;
int max2 = 65;

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[] { r.Next(min, max), r.Next(min, max), r.Next(min, max), r.Next(min, max) },
new double[] { r.Next(min, max), r.Next(min, max), r.Next(min, max), r.Next(min, max) },
new double[] { r.Next(min, max), r.Next(min, max), r.Next(min, max), r.Next(min, max) },
new double[] { r.Next(min, max), r.Next(min, max), r.Next(min, max), r.Next(min, max) },
new double[] { r.Next(min, max), r.Next(min, max), r.Next(min, max), r.Next(min, max) },
// anomalies
new double[] { r.Next(min2, max2), r.Next(min2, max2), r.Next(min2, max2), r.Next(min2, max2) },
new double[] { r.Next(min2, max2), r.Next(min2, max2), r.Next(min2, max2), r.Next(min2, max2) },
new double[] { r.Next(min2, max2), r.Next(min2, max2), r.Next(min2, max2), r.Next(min2, max2) },
new double[] { r.Next(min2, max2), r.Next(min2, max2), r.Next(min2, max2), r.Next(min2, max2) },
new double[] { r.Next(min2, max2), r.Next(min2, max2), r.Next(min2, max2), r.Next(min2, max2) },
};

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();
}

结果:

OK = 49, 46, 47, 49
OK = 49, 45, 45, 47
OK = 45, 45, 46, 47
OK = 47, 49, 47, 48
OK = 45, 45, 47, 48
Anomaly = 62, 60, 61, 63
Anomaly = 61, 63, 63, 64
Anomaly = 64, 60, 60, 64
Anomaly = 61, 64, 63, 63
Anomaly = 62, 60, 62, 62

关于c# - 在 Accord.Net 中如何使用 One-Class SVM 进行异常检测?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42582814/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com