This commit is contained in:
Thomas Forgione
2018-02-16 18:24:29 +01:00
parent 14455d3693
commit 2d0ec8ceae
7 changed files with 363 additions and 17 deletions

View File

@@ -1,10 +1,13 @@
extern crate rand;
extern crate generic_kmeans;
use std::fmt::{Display, Formatter, Result};
use std::fs::File;
use rand::distributions::Range;
use rand::distributions::normal::Normal;
use generic_kmeans::{kmeans, Clusterable};
#[derive(PartialEq, Clone)]
#[derive(PartialEq, Copy, Clone)]
struct Vector2<T> {
pub x: T,
pub y: T,
@@ -54,29 +57,52 @@ impl Clusterable for Vector2<f64> {
fn main() {
let elements = vec![
Vector2::new(8.0, 3.0),
Vector2::new(9.0, 3.0),
Vector2::new(9.0, 2.0),
Vector2::new(1.0, 8.0),
Vector2::new(2.0, 9.0),
Vector2::new(3.0, 8.0),
use rand::distributions::IndependentSample;
let colors = vec![
"blue",
"red",
"green",
];
let initial = vec![
Vector2::new(1.0, 10.0),
Vector2::new(10.0, 0.0),
];
let range = Range::new(0.0, 10.0);
let mut rng = rand::thread_rng();
let cluster_number = 3;
let (clusters, nb_iterations) = kmeans(initial, elements, 1000).ok().unwrap();
let mut centers = vec![];
for _ in 0..cluster_number {
let center = Vector2::new(range.ind_sample(&mut rng), range.ind_sample(&mut rng));
centers.push((center, Normal::new(center.x, 0.5), Normal::new(center.y, 0.5)));
}
let mut elements = vec![];
for &mut (_, x_rng, y_rng) in centers.iter_mut() {
for _ in 0..100 {
elements.push(Vector2::new(x_rng.ind_sample(&mut rng), y_rng.ind_sample(&mut rng)));
}
}
let (clusters, nb_iterations) = kmeans(
centers.iter().map(|x| x.clone().0).collect::<Vec<_>>(), elements, 100000).ok().unwrap();
println!("{}", nb_iterations);
for (index, cluster) in clusters.iter().enumerate() {
println!("CLUSTER {}", index);
let mut output = File::create("plot/dat.dat").unwrap();
for (cluster, color) in clusters.iter().zip(&colors) {
for element in cluster {
println!("\t{}", element);
use std::io::Write;
writeln!(output, "{} {} {}", element.x, element.y, color).unwrap();
}
}
let mut center_file = File::create("plot/centers.dat").unwrap();
for (&(center, _, _), color) in centers.iter().zip(&colors) {
use std::io::Write;
writeln!(center_file, "{} {} {}", center.x, center.y, color).unwrap();
}
}