2013-05-24 43 views
5

Ai đó có thể chỉ cho tôi cách sử dụng phân loại SVM nhiều lớp trong Encog 3.1?Phân loại SVM nhiều lớp trong Encog

Tôi đã sử dụng mạng nơron của họ với một số thành công, nhưng không thể tìm ra cách thiết lập SVM nhiều lớp.

Các tài liệu có điều này để nói:.

"Đây là một mạng được hỗ trợ bởi một hoặc nhiều Vector Machines Hỗ trợ (SVM) Nó được thiết kế để hoạt động rất giống với một mạng lưới thần kinh Encog, và phần lớn là hoán đổi cho nhau với một mạng nơron Encog ..... Phân loại được sử dụng khi bạn muốn SVM nhóm dữ liệu đầu vào thành một hoặc nhiều lớp Hỗ trợ Vector Machines thường có một đầu ra duy nhất.Các mạng nơron có thể có nhiều nơron đầu ra. vấn đề này, lớp này sẽ tạo nhiều SVM nếu có nhiều hơn một đầu ra được chỉ định "

Tuy nhiên, tôi không thể xem cách chỉ định nhiều hơn một đầu ra, trên thực tế là thuộc tính đầu ra chỉ đơn giản là trả 1:

/// <value>For a SVM, the output count is always one.</value> 
    public int OutputCount 
    { 
     get { return 1; } 
    } 

Answers trong Java hoặc C# được rất nhiều đánh giá cao

EDIT vẫn không thể làm việc này ra. Thực sự thích sử dụng Encog, nhưng diễn đàn hỗ trợ hoàn toàn chỉ với Jeff Heaton (tác giả của dự án) khi anh ấy có cơ hội, vì vậy tôi liên kết mã dự án và thêm tiền thưởng với hy vọng ai đó có thể thấy rõ ràng những gì tôi đang thiếu.

Dự án: http://heatonresearch.com/

Lớp SupportVectorMachine trên google mã: https://code.google.com/p/encog-cs/source/browse/trunk/encog-core/encog-core-cs/ML/SVM/SupportVectorMachine.cs

Trả lời

4

Xin lỗi vì phản hồi chậm. Tôi đã quyết định đặt Câu hỏi thường gặp này cho Encog. Bạn có thể xem Câu hỏi thường gặp & ở đây. http://www.heatonresearch.com/faq/5/2

Về cơ bản, mã hóa hỗ trợ SVM nhiều lớp. Bạn không cần nhiều đầu ra giống như bạn làm một mạng thần kinh. Bạn chỉ cần đào tạo nó với một đầu ra duy nhất và đầu ra đó là số lớp, tức là 0.0, 1.0, 2.0, v.v. tùy thuộc vào số lượng lớp bạn có.

Điều này áp dụng cho cả phiên bản Java và C# của Encog. Tôi đã làm ví dụ trong C#.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using Encog.ML.SVM; 
using Encog.ML.Data; 
using Encog.ML.Data.Basic; 
using Encog.ML.Train; 
using Encog.ML.SVM.Training; 

namespace MultiClassSVM 
{ 
    class Program 
    { 
     /// 
     /// Input for function, normalized to 0 to 1. 
     /// 
     public static double[][] ClassificationInput = { 
      new[] {0.0, 0.0}, 
      new[] {0.1, 0.0}, 
      new[] {0.2, 0.0}, 
      new[] {0.3, 0.0}, 
      new[] {0.4, 0.5}, 
      new[] {0.5, 0.5}, 
      new[] {0.6, 0.5}, 
      new[] {0.7, 0.5}, 
      new[] {0.8, 0.5}, 
      new[] {0.9, 0.5} 
      }; 

     /// 
     /// Ideal output, these are class numbers, a total of four classes here (0,1,2,3). 
     /// DO NOT USE FRACTIONAL CLASSES (i.e. there is no class 1.5) 
     /// 
     public static double[][] ClassificationIdeal = { 
      new[] {0.0}, 
      new[] {0.0}, 
      new[] {0.0}, 
      new[] {0.0}, 
      new[] {1.0}, 
      new[] {1.0}, 
      new[] {2.0}, 
      new[] {2.0}, 
      new[] {3.0}, 
      new[] {3.0} 
     }; 

     static void Main(string[] args) 
     { 
      // create a neural network, without using a factory 
      var svm = new SupportVectorMachine(2, false); // 2 input, & false for classification 

      // create training data 
      IMLDataSet trainingSet = new BasicMLDataSet(ClassificationInput, ClassificationIdeal); 

      // train the SVM 
      IMLTrain train = new SVMSearchTrain(svm, trainingSet); 

      int epoch = 1; 

      do 
      { 
       train.Iteration(); 
       Console.WriteLine(@"Epoch #" + epoch + @" Error:" + train.Error); 
       epoch++; 
      } while (train.Error > 0.01); 

      // test the SVM 
      Console.WriteLine(@"SVM Results:"); 
      foreach (IMLDataPair pair in trainingSet) 
      { 
       IMLData output = svm.Compute(pair.Input); 
       Console.WriteLine(pair.Input[0] 
            + @", actual=" + output[0] + @",ideal=" + pair.Ideal[0]); 
      } 

      Console.WriteLine("Done"); 
     } 
    } 
}
+0

Tuyệt vời, cảm ơn vì đã trả lời, không biết tại sao tôi không nghĩ đến việc thử điều đó. Tìm Encog rất hữu ích thực sự. – Steve

+0

Bạn không chỉ sử dụng hồi quy để phân loại? http://stackoverflow.com/questions/9160669/why-is-it-not-to-approach-classification-through-regression –

+0

Đồng ý, thật tệ khi sử dụng hồi quy để phân loại, nhưng đó không phải là trường hợp ở đây. Trong Encog, SVM được chỉ định là hồi quy hoặc phân loại trong hàm tạo. Đây là hai thiết lập rất khác nhau cho SVM. Lưu ý hàm tạo có một giá trị sai, có nghĩa là nó là phân loại. Vì vậy, do đó giá trị của 1.0, 2.0 vv là số lớp. Nó luôn luôn sử dụng một đầu vào dấu chấm động để nhất quán. – JeffHeaton

1

Bạn không thể có nhiều lớp SVM. SVM chỉ có thể phân loại thành hai lớp. Có tất nhiên các phương pháp làm thế nào để sử dụng chúng để phân loại nhiều lớp. Họ là một vs-một và một-vs-tất cả.

Trong một cuộc trò chuyện bạn huấn luyện (k * (k-1))/2 SVM cho mỗi cặp lớp. Sau đó, bạn cho phép họ bỏ phiếu và lớp có nhiều phiếu nhất thắng.

Trong một-vs-tất cả bạn chỉ có SVM và cho mỗi lớp bạn đào tạo một SVM đối với phần còn lại của các lớp và một lần nữa bạn cho phép họ bỏ phiếu và chọn người chiến thắng.

Tôi không biết liệu có hỗ trợ cho một-vs-một và một-vs-tất cả trong Encog, bạn có thể viết nó cho mình trong trường hợp xấu nhất. Tuy nhiên, tôi chắc chắn rằng bạn đang nhìn vào một phần sai của codebase. Nó có lẽ sẽ không được trong việc thực hiện SVM.

+0

Cảm ơn câu trả lời của bạn, tôi có thể kết thúc việc thực hiện của riêng tôi hoặc quay lại sử dụng Accord NET, nhưng chắc chắn phải có hỗ trợ cho điều này được tích hợp vào Encog.Các tài liệu hướng dẫn tôi nhấn mạnh chắc chắn gợi ý vào nó. – Steve

Các vấn đề liên quan