我試圖通過在Accord.Net中使用OneclassSupportVectorLearning實現異常檢測。我在訓練過程中遇到了NullReference錯誤。以下是我在測試中的示例代碼。 欣賞有人能幫助我解決這個問題。In Accord.Net如何使用One-Class SVM進行異常檢測?
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 **-α**。 – jsanalytics
謝謝jstress!我嘗試最新的預版本,現在它可以運行。當它完成學習時,我通過傳回訓練集來運行「k.Decide(輸入)」方法。但是對於整個訓練集來說它只是返回所有「假」(它假設全部是「真」)。我在這裏檢查了代碼,根據在線文檔它應該是有效的。感謝您能分享我更多關於此的提示。 – alinm