Class: Rumale::KernelMachine::KernelSVC
- Inherits:
- 
      Base::Estimator
      
        - Object
- Base::Estimator
- Rumale::KernelMachine::KernelSVC
 
- Includes:
- Base::Classifier
- Defined in:
- rumale-kernel_machine/lib/rumale/kernel_machine/kernel_svc.rb
Overview
Rumale::SVM provides kernel support vector classifier based on LIBSVM. If you prefer execution speed, you should use Rumale::SVM::SVC. github.com/yoshoku/rumale-svm
KernelSVC is a class that implements (Nonlinear) Kernel Support Vector Classifier with stochastic gradient descent (SGD) optimization. For multiclass classification problem, it uses one-vs-the-rest strategy.
Reference
- 
Shalev-Shwartz, S., Singer, Y., Srebro, N., and Cotter, A., “Pegasos: Primal Estimated sub-GrAdient SOlver for SVM,” Mathematical Programming, vol. 127 (1), pp. 3–30, 2011. 
Instance Attribute Summary collapse
- 
  
    
      #classes  ⇒ Numo::Int32 
    
    
  
  
  
  
    
      readonly
    
    
  
  
  
  
  
  
    Return the class labels. 
- 
  
    
      #rng  ⇒ Random 
    
    
  
  
  
  
    
      readonly
    
    
  
  
  
  
  
  
    Return the random generator for performing random sampling. 
- 
  
    
      #weight_vec  ⇒ Numo::DFloat 
    
    
  
  
  
  
    
      readonly
    
    
  
  
  
  
  
  
    Return the weight vector for Kernel SVC. 
Attributes inherited from Base::Estimator
Instance Method Summary collapse
- 
  
    
      #decision_function(x)  ⇒ Numo::DFloat 
    
    
  
  
  
  
  
  
  
  
  
    Calculate confidence scores for samples. 
- 
  
    
      #fit(x, y)  ⇒ KernelSVC 
    
    
  
  
  
  
  
  
  
  
  
    Fit the model with given training data. 
- 
  
    
      #initialize(reg_param: 1.0, max_iter: 1000, probability: false, n_jobs: nil, random_seed: nil)  ⇒ KernelSVC 
    
    
  
  
  
    constructor
  
  
  
  
  
  
  
    Create a new classifier with Kernel Support Vector Machine by the SGD optimization. 
- 
  
    
      #predict(x)  ⇒ Numo::Int32 
    
    
  
  
  
  
  
  
  
  
  
    Predict class labels for samples. 
- 
  
    
      #predict_proba(x)  ⇒ Numo::DFloat 
    
    
  
  
  
  
  
  
  
  
  
    Predict probability for samples. 
Methods included from Base::Classifier
Constructor Details
#initialize(reg_param: 1.0, max_iter: 1000, probability: false, n_jobs: nil, random_seed: nil) ⇒ KernelSVC
Create a new classifier with Kernel Support Vector Machine by the SGD optimization.
| 57 58 59 60 61 62 63 64 65 66 67 | # File 'rumale-kernel_machine/lib/rumale/kernel_machine/kernel_svc.rb', line 57 def initialize(reg_param: 1.0, max_iter: 1000, probability: false, n_jobs: nil, random_seed: nil) super() @params = { reg_param: reg_param, max_iter: max_iter, probability: probability, n_jobs: n_jobs, random_seed: random_seed || srand } @rng = Random.new(@params[:random_seed]) end | 
Instance Attribute Details
#classes ⇒ Numo::Int32 (readonly)
Return the class labels.
| 41 42 43 | # File 'rumale-kernel_machine/lib/rumale/kernel_machine/kernel_svc.rb', line 41 def classes @classes end | 
#rng ⇒ Random (readonly)
Return the random generator for performing random sampling.
| 45 46 47 | # File 'rumale-kernel_machine/lib/rumale/kernel_machine/kernel_svc.rb', line 45 def rng @rng end | 
#weight_vec ⇒ Numo::DFloat (readonly)
Return the weight vector for Kernel SVC.
| 37 38 39 | # File 'rumale-kernel_machine/lib/rumale/kernel_machine/kernel_svc.rb', line 37 def weight_vec @weight_vec end | 
Instance Method Details
#decision_function(x) ⇒ Numo::DFloat
Calculate confidence scores for samples.
| 113 114 115 116 117 | # File 'rumale-kernel_machine/lib/rumale/kernel_machine/kernel_svc.rb', line 113 def decision_function(x) x = ::Rumale::Validation.check_convert_sample_array(x) x.dot(@weight_vec.transpose) end | 
#fit(x, y) ⇒ KernelSVC
Fit the model with given training data.
| 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 | # File 'rumale-kernel_machine/lib/rumale/kernel_machine/kernel_svc.rb', line 75 def fit(x, y) x = ::Rumale::Validation.check_convert_sample_array(x) y = ::Rumale::Validation.check_convert_label_array(y) ::Rumale::Validation.check_sample_size(x, y) @classes = Numo::Int32[*y.to_a.uniq.sort] n_classes = @classes.size n_features = x.shape[1] if n_classes > 2 @weight_vec = Numo::DFloat.zeros(n_classes, n_features) @prob_param = Numo::DFloat.zeros(n_classes, 2) models = if enable_parallel? parallel_map(n_classes) do |n| bin_y = Numo::Int32.cast(y.eq(@classes[n])) * 2 - 1 partial_fit(x, bin_y) end else Array.new(n_classes) do |n| bin_y = Numo::Int32.cast(y.eq(@classes[n])) * 2 - 1 partial_fit(x, bin_y) end end models.each_with_index { |model, n| @weight_vec[n, true], @prob_param[n, true] = model } else negative_label = y.to_a.uniq.min bin_y = Numo::Int32.cast(y.ne(negative_label)) * 2 - 1 @weight_vec, @prob_param = partial_fit(x, bin_y) end self end | 
#predict(x) ⇒ Numo::Int32
Predict class labels for samples.
| 124 125 126 127 128 129 130 131 132 133 134 135 136 137 | # File 'rumale-kernel_machine/lib/rumale/kernel_machine/kernel_svc.rb', line 124 def predict(x) x = ::Rumale::Validation.check_convert_sample_array(x) return Numo::Int32.cast(decision_function(x).ge(0.0)) * 2 - 1 if @classes.size <= 2 n_samples, = x.shape decision_values = decision_function(x) predicted = if enable_parallel? parallel_map(n_samples) { |n| @classes[decision_values[n, true].max_index] } else Array.new(n_samples) { |n| @classes[decision_values[n, true].max_index] } end Numo::Int32.asarray(predicted) end | 
#predict_proba(x) ⇒ Numo::DFloat
Predict probability for samples.
| 144 145 146 147 148 149 150 151 152 153 154 155 156 157 | # File 'rumale-kernel_machine/lib/rumale/kernel_machine/kernel_svc.rb', line 144 def predict_proba(x) x = ::Rumale::Validation.check_convert_sample_array(x) if @classes.size > 2 probs = 1.0 / (Numo::NMath.exp(@prob_param[true, 0] * decision_function(x) + @prob_param[true, 1]) + 1.0) return (probs.transpose / probs.sum(axis: 1)).transpose.dup end n_samples, = x.shape probs = Numo::DFloat.zeros(n_samples, 2) probs[true, 1] = 1.0 / (Numo::NMath.exp(@prob_param[0] * decision_function(x) + @prob_param[1]) + 1.0) probs[true, 0] = 1.0 - probs[true, 1] probs end |