2016-03-23 21 views
0

Ben accord.net kullanıyorum. Aşağıdaki örnek iyi çalışıyor, ama ben çok sınıf sınıflandırıcı yapmak istiyorum. MulticlassSupportVectorMachine() İşlevini kullanmayı denedim, ancak belirli zamanlar için doğru çıktı vermeyen Dinamik zaman atlama sınıfı çekirdeği için 0.6 hatasıyla verileri eğitdi. Dinamik zaman atlama çekirdeğini kullanarak çok sınıflı SVM yapmak istiyorum

// Suppose you have sequences of multivariate observations, and that 
// those sequences could be of arbitrary length. On the other hand, 
// each observation have a fixed, delimited number of dimensions. 

// In this example, we have sequences of 3-dimensional observations. 
// Each sequence can have an arbitrary length, but each observation 
// will always have length 3: 
double[][][] sequences ={ 
    new double[][] // first sequence 
{ 
    new double[] { 1, 1, 1 }, // first observation of the first sequence 
    new double[] { 1, 2, 1 }, // second observation of the first sequence 
    new double[] { 1, 4, 2 }, // third observation of the first sequence 
    new double[] { 2, 2, 2 }, // fourth observation of the first sequence 
}, 

new double[][] // second sequence (note that this sequence has a different length) 
{ 
    new double[] { 1, 1, 1 }, // first observation of the second sequence 
    new double[] { 1, 5, 6 }, // second observation of the second sequence 
    new double[] { 2, 7, 1 }, // third observation of the second sequence 
}, 

new double[][] // third sequence 
{ 
    new double[] { 8, 2, 1 }, // first observation of the third sequence 
}, 

new double[][] // fourth sequence 
{ 
    new double[] { 8, 2, 5 }, // first observation of the fourth sequence 
    new double[] { 1, 5, 4 }, // second observation of the fourth sequence 
} 
}; 
// Now, we will also have different class labels associated which each 
// sequence. We will assign -1 to sequences whose observations start 
// with { 1, 1, 1 } and +1 to those that do not: 

int[] outputs = 
{ 
    -1,-1, // First two sequences are of class -1 (those start with {1,1,1}) 
    1, 1, // Last two sequences are of class +1 (don't start with {1,1,1}) 
}; 

// At this point, we will have to "flat" out the input sequences from    double[][][] 
    // to a double[][] so they can be properly understood by the SVMs. The  problem is 
// that, normally, SVMs usually expect the data to be comprised of fixed-length 
// input vectors and associated class labels. But in this case, we will be feeding 
// them arbitrary-length sequences of input vectors and class labels associated with 
// each sequence, instead of each vector. 

double[][] inputs = new double[sequences.Length][]; 
for (int i = 0; i < sequences.Length; i++) 
inputs[i] = Matrix.Concatenate(sequences[i]); 


// Now we have to setup the Dynamic Time Warping kernel. We will have to 
// inform the length of the fixed-length observations contained in each 
// arbitrary-length sequence: 
// 
DynamicTimeWarping kernel = new DynamicTimeWarping(length: 3); 

// Now we can create the machine. When using variable-length 
//kernels, we will need to pass zero as the input length: 
var svm = new KernelSupportVectorMachine(kernel, inputs: 0); 


// Create the Sequential Minimal Optimization learning algorithm 
var smo = new SequentialMinimalOptimization(svm, inputs, outputs) 
{ 
Complexity = 1.5 
}; 

// And start learning it! 
double error = smo.Run(); // error will be 0.0 


// At this point, we should have obtained an useful machine. Let's 
// see if it can understand a few examples it hasn't seem before: 

double[][] a = 
{ 
new double[] { 1, 1, 1 }, 
new double[] { 7, 2, 5 }, 
new double[] { 2, 5, 1 }, 
}; 

double[][] b = 
{ 
new double[] { 7, 5, 2 }, 
new double[] { 4, 2, 5 }, 
new double[] { 1, 1, 1 }, 
}; 

// Following the aforementioned logic, sequence (a) should be 
// classified as -1, and sequence (b) should be classified as +1. 

int resultA = System.Math.Sign(svm.Compute(Matrix.Concatenate(a))); // -1 
int resultB = System.Math.Sign(svm.Compute(Matrix.Concatenate(b))); // +1 

Birden fazla iki tip girişi için makine trenler MulticlassSupportVectorMachine() ile Çok sınıf SVM sınıflandırıcı uygulanması ve girişin her türü için çıkış etiketler için ihtiyaç. P.S: MulticlassSupportVectorMachine() işlevi Dinamik zaman çözgü çekirdeğini desteklemiyorsa. Daha sonra, Dynamic Time çözgü çekirdeğinin yukarısındaki tek bir Multiclass svm tekniğini nasıl kullanacağımı ve tek bir tekniği kullanarak çok sınıflandırıcı yapmayı söyle. Yardımınız çok takdir edilecektir. Önceden teşekkürler.

cevap

0

Bu kod StackOverflow'daki benim için

var smo = new MulticlassSupportVectorLearning<DynamicTimeWarping, double[][]>() 
      { 
       // Set the parameters of the kernel 
       Kernel = new DynamicTimeWarping(alpha: 1, degree: 1) 
      }; 
      // And use it to learn a machine! 
      var svm = smo.Learn(words, labels); 
      // Create the multi-class learning algorithm for the machine 
      var calibration = new MulticlassSupportVectorLearning<DynamicTimeWarping, double[][]>() 
      { 
       Model = svm, // We will start with an existing machine 

       // Configure the learning algorithm to use SMO to train the 
       // underlying SVMs in each of the binary class subproblems. 
       Learner = (param) => new ProbabilisticOutputCalibration<DynamicTimeWarping, double[][]>() 
       { 
        Model = param.Model // Start with an existing machine 
       } 
      }; 
      // Configure parallel execution options 
      calibration.ParallelOptions.MaxDegreeOfParallelism = 1; 
      // Learn a machine 
      calibration.Learn(words, labels); 
      // Obtain class predictions for each sample 
      int[] predicted = svm.Decide(words); 
      int[] expected = new int[words.Length]; 


      double correct = 0; 
      for (int i = 0; i < words.Length; i++) 
      { 
       expected[i] = labels[i]; 
       predicted[i] = svm.Decide(words[i]); 
       if (svm.Decide(words[i]) == labels[i]) 
       { 
        correct++; 
       } 

      } 
      string Accurecy = "SMO Accurecy = " + (correct/predicted.Length).ToString() + Environment.NewLine; // ori 
+0

Welcome çalışıyor! Bir cevaba yardımcı olduğunuz için teşekkür ederiz, ancak kodunuza bazı açıklamalar eklediyseniz daha da yardımcı olabilirsiniz. – Sentry