blob: b1a169079faf54661fe4d948889519b0ee3c3943 [file] [log] [blame]
extern crate rusty_machine;
use rusty_machine::learning::svm::SVM;
// Necessary for the training trait.
use rusty_machine::learning::SupModel;
use rusty_machine::learning::toolkit::kernel::HyperTan;
use rusty_machine::linalg::Matrix;
use rusty_machine::linalg::Vector;
// Sign learner:
// * Model input a float number
// * Model output: A float representing the input sign.
// If the input is positive, the output is close to 1.0.
// If the input is negative, the output is close to -1.0.
// * Model generated with the SVM API.
fn main() {
println!("Sign learner sample:");
println!("Training...");
// Training data
let inputs = Matrix::new(11, 1, vec![
-0.1, -2., -9., -101., -666.7,
0., 0.1, 1., 11., 99., 456.7
]);
let targets = Vector::new(vec![
-1., -1., -1., -1., -1.,
1., 1., 1., 1., 1., 1.
]);
// Trainee
let mut svm_mod = SVM::new(HyperTan::new(100., 0.), 0.3);
// Our train function returns a Result<(), E>
svm_mod.train(&inputs, &targets).unwrap();
println!("Evaluation...");
let mut hits = 0;
let mut misses = 0;
// Evaluation
// Note: We could pass all input values at once to the `predict` method!
// Here, we use a loop just to count and print logs.
for n in (-1000..1000).filter(|&x| x % 100 == 0) {
let nf = n as f64;
let input = Matrix::new(1, 1, vec![nf]);
let out = svm_mod.predict(&input).unwrap();
let res = if out[0] * nf > 0. {
hits += 1;
true
} else if nf == 0. {
hits += 1;
true
} else {
misses += 1;
false
};
println!("{} -> {}: {}", Matrix::data(&input)[0], out[0], res);
}
println!("Performance report:");
println!("Hits: {}, Misses: {}", hits, misses);
let hits_f = hits as f64;
let total = (hits + misses) as f64;
println!("Accuracy: {}", (hits_f / total) * 100.);
}