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.); }