Accord.NET #2
نویسنده: محسن نجف زاده
تاریخ: ۱۳۹۴/۰۵/۲۶ ۰:۳۰
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
PM> Install-Package Accord.MachineLearning
PM> Install-Package Accord.Imaging
PM> Install-Package Accord.Neuro
عملکرد SVM یا ماشین بردار پشتیبان به صورت خلاصه به این صورت است که با در نظر گرفتن یک خط یا ابرصفحه جدا کننده فرضی، ماشین یا دسته بندی را ایجاد میکند که از نقاط ابتدایی کلاسهای مختلف که بردار پشتیبان یا SV نام دارند، بیشترین فاصله را دارند و در نهایت دادها را به دو کلاس مجزا تقسیم میکند.
در تصویر بالا مقداری خطا مشاهده میشود که با توجه با خطی بودن جداساز مجبور به پذیرش این خطا هستیم.
در نسخههای جدیدتر این الگوریتم یک Kernel ( از نوع خطی Linear ، چند جملهای Polynomial، گوسین Gaussian و یا ...) برای آن در نظر گرفته شد که عملا نگاشتی را بین خط (نه صرفا فقط خطی) را با آن ابرصفحه جداکننده برقرار کند. در نتیجه دسته بندی با خطای کمتری را خواهیم داشت. (اطلاعات بیشتر در + و همچنین مطالب دکتر سعید شیری درباره SVM در +)
یک مثال مفهومی : هدف اصلی در این مثال شبیه سازی تابع XNOR به Kernel SVM میباشد.
برای شروع کار از فضای نام MachineLearning استفاده میکنیم و بستهی نیوگت مربوطه را فرخوانی میکنیم. پس از اجرا، مشاهده میکنیم که فضای نامهای Accord.Math و Accord.Statistics نیز به پروژه اضافه میشود.
در ابتدا مقادیر ورودی و برچسبها را تعریف میکنیم
// ورودی
double[][] inputs =
{
new double[] { 0, 0 }, // 0 xnor 0: 1 (label +1)
new double[] { 0, 1 }, // 0 xnor 1: 0 (label -1)
new double[] { 1, 0 }, // 1 xnor 0: 0 (label -1)
new double[] { 1, 1 } // 1 xnor 1: 1 (label +1)
};
// خروجی دسته بند ماشین بردار پشتیبان باید -1 یا +1 باشد
int[] labels =
{
// 1, 0, 0, 1
1, -1, -1, 1
}; // ساخت کرنل
IKernel kernel = createKernel();
// ساخت دسته بند به کمک کرنل انتخابی و تنظیم تعداد ویژگیها ورودیها به مقدار 2
KernelSupportVectorMachine machine = new KernelSupportVectorMachine(kernel, 2); private static IKernel createKernel()
{
//var numPolyConstant = 1;
//return new Linear(numPolyConstant);
//var numDegree = 2;
//var numPolyConstant = 1;
//return new Polynomial(numDegree, numPolyConstant);
//var numLaplacianSigma = 1000;
//return new Laplacian(numLaplacianSigma);
//var numSigAlpha = 7;
//var numSigB = 6;
//return new Sigmoid(numSigAlpha, numSigB);
var numSigma = 0.1;
return new Gaussian(numSigma);
} // معرفی دسته بندمان به الگوریتم یادگیری SMO
SequentialMinimalOptimization teacher_smo = new SequentialMinimalOptimization(machine_svm, inputs, labels);
// اجرای الگوریتم یادگیری
double error = teacher_smo.Run();
Console.WriteLine(string.Format("error rate : {0}", error)); // بررسی یکی از ورودیها
var sample = inputs[0];
int decision = System.Math.Sign(machine_svm.Compute(sample));
Console.WriteLine(string.Format("result for sample '0 xnor 0' is : {0}", decision));