diff --git a/Cargo.toml b/Cargo.toml index 17c5fd0..3ca39d7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,6 +4,7 @@ version = "0.1.0" authors = ["Thomas Forgione "] [dependencies] +rand = "*" [[bin]] name = "example" diff --git a/plot/centers.dat b/plot/centers.dat new file mode 100644 index 0000000..9e62446 --- /dev/null +++ b/plot/centers.dat @@ -0,0 +1,3 @@ +7.362969772457262 2.2292211784138405 blue +7.561872618222036 3.4619500908356526 red +3.9379822748704396 0.35795551057766106 green diff --git a/plot/dat.dat b/plot/dat.dat new file mode 100644 index 0000000..31dc24a --- /dev/null +++ b/plot/dat.dat @@ -0,0 +1,300 @@ +3.1722920796470753 -0.733279293053285 blue +3.167068508218321 0.10323154299065418 blue +3.103950084700323 0.23930517934518614 blue +3.3798146480806963 -0.1827565585954446 blue +2.978283637278063 0.06453933903045073 blue +3.6356181662397535 -0.4044583199837899 blue +2.95372747507819 0.374453759303532 blue +3.3920150133049254 -0.4190603852985506 blue +3.6094600800276067 -0.2144185251138886 red +2.7739400381261774 0.712059481698815 red +3.846841411138542 -0.4888722200579573 red +3.6637633637955247 -0.20523517320505846 red +3.502927671921002 -0.01739950379852473 red +3.570670098713616 -0.04271440668919613 red +4.258771306128453 -0.7638447827738868 red +3.9409335680538744 -0.34461733565342756 red +3.172851060943594 0.5155595500900624 red +3.3660242079847826 0.3176395813234718 red +3.882627446966355 -0.3755163859233328 red +3.258525363706499 0.4069846744870096 red +3.495556786207888 0.3994046031736014 red +3.507425251682668 0.37043602544443244 red +3.927449678905854 -0.12931373550029374 red +3.9401081984845097 -0.21366400121478335 red +3.998440026339032 -0.232044527944281 red +3.485801013529333 0.25181078736199886 red +3.817636850420355 -0.12783722608293957 red +3.480959460450858 0.3356245969338822 red +3.733075996312495 0.019096925850280277 red +4.146995700224781 -0.04460715552241867 red +3.579793889310732 0.5229615388110218 red +3.6484363281436494 0.6045383904999224 red +3.4003348878727695 0.79816498433734 red +3.8439726772185896 0.2756903935248908 red +2.8383760073987534 1.3882253053077225 red +3.592774371838402 0.6789321749560016 red +3.7674662297399286 0.2921517888999538 red +4.115608810992105 -0.07025695746073285 red +3.528690841064493 0.516424034979121 red +3.217234748563143 0.9442394356410887 red +4.131774238527101 -0.04224023552247741 red +3.561080757822947 0.4818635464029179 red +4.2408854028156755 -0.2450782482196694 red +3.6730022742656243 0.29741785124017694 red +4.034026334642208 0.1488231988663128 red +4.119128183686852 -0.1580794094811806 red +3.9753355044557983 0.39627299770817237 red +3.6732827650690103 0.8059859451506826 red +4.488509416398572 -0.1462499511423424 red +4.32661224091649 0.07139296218783381 red +3.613505127994868 0.8377964314698141 red +3.87153299037606 0.5812571966391673 red +3.9902303145964706 0.5859036858002181 red +4.362303526272025 -0.042013012245863846 red +4.134369220146103 0.03349891857151277 red +4.177740948577232 0.12358770141391692 red +3.9540793283557014 0.3356584069120508 red +4.401108898000167 -0.003114398045010347 red +3.498514749532378 0.8800866500487596 red +4.41301152664003 -0.027628861527589144 red +4.215618119197788 0.3840095817249771 red +3.5482423999839146 0.7632539555148093 red +3.6246636191468666 0.7301238699155173 red +4.130094170140202 0.3078994155838442 red +4.034092528846325 0.3317083678197986 red +3.8796159868011064 0.3997569887460371 red +4.219000990049526 0.26810755366819106 red +4.247938088992708 0.39267087884272767 red +3.8030383348439853 0.5663640405892496 red +4.015106218988656 0.2762165711361133 red +3.6998523298348918 1.073558644892152 red +4.756491100686767 -0.20007878482051766 red +4.57835590857826 0.5851382590935945 red +3.941012536283112 1.135248406562449 red +4.283375404221392 0.698265954177747 red +5.196520463690655 0.8269139783274901 red +4.587045998171549 0.9493130438890539 red +4.277924679227115 0.5999740967807994 red +4.79655404175757 -0.03468448586681655 red +4.350986448867171 0.3460195729412589 red +4.3535938869662685 0.42185514891968456 red +4.516734825818239 0.6399861627972976 red +4.577579986201398 0.2693246854906323 red +4.047085482678346 0.9438333498946828 red +4.530054468395934 0.8253339759171412 red +4.62730518036874 0.39979489250253814 red +4.333874585129452 0.4127800284367539 red +4.61684222466966 0.5302988833055177 red +4.725281756162216 0.5076632573165651 red +4.450184320080639 1.4068875202461746 red +4.58559612719457 0.42148197697475753 red +4.517186886807359 1.1835934496680203 red +4.28283274886123 0.8329269399680973 red +4.224190877954441 0.5405588945003291 red +3.7912279751660867 1.2939721795466221 red +3.9822079025333577 1.0351892011246622 red +4.199080672684683 0.5206542057383026 red +4.329610262190835 0.32290838658859233 red +4.3612270824589405 1.0268438488576352 red +4.520204476958637 1.4227425201993709 red +7.722136516021652 1.9470066555970975 red +7.4916746875072855 2.1180961930221773 red +6.504637622726477 2.61151640305994 red +7.177999201946461 2.6255334521727467 red +7.26910394349391 2.234788707898471 red +6.117168606550697 1.866392307558659 red +7.623229088939814 1.792731727437522 red +7.807723494032717 1.84200160683787 red +6.706556568713833 2.2612285132853485 red +6.967195552131049 2.501871065272528 red +7.175843899364814 0.8574262374353125 red +6.8750422920422904 1.2371567676668918 red +7.619809736193145 1.3103889429511164 red +5.953387500844007 2.755233188216527 red +7.723489084817691 1.9463428958783504 red +6.644063412274511 2.5586672455593362 red +7.733605889106188 2.079736410311278 red +7.510572393106473 2.2061220380991124 red +6.856216013634419 2.6544853108123023 red +6.6930033087268885 2.245099227226044 red +7.247942190451006 2.1627019434042754 red +7.741449214385919 2.182334922711081 red +6.746942537637999 1.9959361510642295 red +7.649143630640873 2.22441486698875 red +6.9358767615672035 1.485569780201074 red +7.113591869260028 2.2928004264536828 red +7.427120398051516 2.383864858715106 red +7.349659579825405 2.0949180923760453 red +6.395333641483336 1.7743677054052447 red +6.466838685136713 1.939393843109669 red +7.253548883412662 2.1030668375095667 red +8.07939042280926 2.04729205871798 red +7.548984251183588 1.5499638356328398 red +6.1032067830466215 2.838456614189033 red +7.098490045615251 1.8897716920941956 red +7.59862527364878 2.3456095485144837 red +7.6801188008605985 2.344753403464505 red +7.49670020820185 1.726529815379416 red +7.146293141419195 1.252784057975802 red +7.321579062344307 2.5070505017099913 red +6.798977581928631 2.8315301607072727 red +7.5570303896807625 1.5791506580459989 red +7.272672897968238 1.9990630354210432 red +7.515475563843841 1.762927204669434 red +7.824459641746373 2.1013238310168627 red +7.532377761687111 2.0904990744009906 red +6.4714917643178085 2.782633453745481 red +7.493513215157782 2.1060717676124643 red +7.130875386373429 2.561241884726998 red +7.1965107684319065 2.090188844246861 red +7.7937385851348395 2.257283846237026 red +7.641528665375075 1.4752990325524786 red +7.195530312258788 2.086730017606406 red +7.520649659019042 2.0002708025432363 red +7.902751665079369 2.2023323361646625 red +8.120404543041419 2.0665508009908136 red +6.415331460879512 1.68412961311886 red +7.364998983795844 1.4399331873149213 red +8.14234624185481 2.0750561226272866 red +7.1704254033423585 2.181982728843698 red +7.402057697660059 1.533038191027845 red +7.664029025362594 1.7820627943094123 red +7.669404374935257 1.8538765822930114 red +7.371627210148008 1.558805724375508 red +7.0511942299360495 2.3419639393047356 red +7.329465356185301 2.177923167701359 red +7.771413252571511 2.11242037492263 red +7.663725996090565 1.7126632923352003 red +7.397374912219294 2.399953582766828 red +7.399196915900515 1.5693121453666254 red +7.147337668439287 2.108371971884583 red +7.20952148595069 1.2275066517040163 red +7.500514079976969 2.2498592424305035 red +7.56327947368118 1.212640674473267 red +6.850697308173663 2.489187247297768 red +6.818838516960285 2.265360970377559 red +6.909640919530763 2.4401077434705067 red +6.654089805070571 2.8505331135797998 red +8.000114875345277 2.119595362298255 red +6.960334760381899 2.70748387546396 red +7.838299264896003 2.715157569111897 red +7.633463429101306 2.47314113739334 red +7.416688794086579 2.889935392036926 red +7.805609921172734 2.5989409709922384 red +7.539781828336027 2.9330292220419616 red +7.597116683779243 3.2260333749067014 red +8.466410885039707 2.7377320271447263 red +7.133556641250677 2.9471790306833077 red +7.769517340230654 2.7763025185765584 red +7.337931150414927 2.5522719526839173 red +7.74023489812714 3.065068199792865 red +7.683759543909188 2.364155681212309 red +7.571610243520974 2.4839540444329544 red +7.095520936370959 2.92914400483635 red +8.041128388484529 2.7894817375794916 red +7.144407268059606 2.9691452384737635 red +8.505593495433358 2.1466363274907447 red +8.632508392616 2.22257963053884 red +7.911123376257175 2.5213466516039627 red +7.6940185408964545 3.352293659663364 red +7.991456661120536 2.589987966181656 red +8.087698508849215 2.556181174894577 red +7.718150718475244 2.8094487856195003 red +7.47315392406206 3.4782308361876915 red +8.012813012736501 3.122791194321132 red +8.174108122697525 3.429234781425609 red +7.766161280844902 3.7561802057042244 red +7.263545882712765 3.860939909657454 red +8.096615450151507 3.445162969565429 red +6.80705612289653 3.695299133705912 red +7.787262071030116 3.0400121637120074 red +7.921825185220113 4.11562189496709 red +7.352488965852293 3.0962605817874653 red +8.130241325680757 3.12580170376337 red +7.23034764678279 3.647675952767801 red +6.767616299967328 4.5653279969715985 red +7.7395783849343465 3.869413921383619 red +8.158085116611321 2.971554554199345 red +8.07002060099343 2.821712503112572 red +7.062756873013518 3.589476422002454 red +7.677978837449784 3.223400111739516 red +7.494413355292032 3.257440270821772 red +8.288820117028758 3.292305271320214 red +7.649362000563177 4.271160426138838 red +7.616020117241795 3.95881434948141 red +7.195507257591824 3.9428433603688404 red +7.245687352457268 2.9363826343846484 red +7.588216917623389 3.3532148773495645 red +7.126858553632669 2.9739175202264714 red +7.983026848285219 3.824046212867809 red +7.475292436908247 3.323994322421076 red +7.936496484568236 3.4794162984228825 red +6.76205135484123 3.5843519824089682 red +7.426875937925392 4.038873122243772 red +8.21951306389346 3.6399123259998225 red +7.324026068271806 3.061370274841475 red +8.569032256116909 3.3329612438310345 red +7.318164533243619 3.069397489626727 red +6.958855114032112 3.280972206830141 red +8.692122242415982 3.6918095437918073 red +7.2383605768073185 4.266375385002773 red +7.370919915669186 3.7015685565455962 red +8.150362283646688 3.329309338393711 red +7.479996619904384 3.0546845699004916 red +7.906092072147054 3.876850938641441 red +7.180680249472975 3.9577888988740364 red +7.322190245719994 3.2826421528571625 red +7.255438971347838 3.513450999321192 red +8.317600496173556 4.034622634968662 red +7.88276796985749 2.7966518004810754 red +8.103899733693975 4.001561001136776 red +6.954538631721563 2.976496115773739 red +7.240396443716532 3.2846074175197377 red +7.5850349627285185 2.8942969475507017 red +7.287112882089894 3.216029227750091 red +7.623359140518172 2.9593967166439348 red +7.713574159860361 3.4895881829426822 red +7.025980576805368 3.6433631066041405 red +7.444754728796709 3.483957785955234 red +6.838126438683099 3.3484180783059685 red +7.263944759925077 2.9654682573147193 red +7.6315888677034645 3.2466591797995314 red +6.826319178392804 4.484284866115551 red +7.360383098198501 3.7990932090392033 red +8.094085099203799 3.836014940244799 red +7.321057251480907 3.174050781865412 red +7.549705399139268 2.5146338343626593 red +7.1448124339102765 3.9680523242145584 red +7.734875951386552 3.2714316107507564 red +9.675705035077282 3.1167373037722834 red +7.444144597466469 3.089028651011974 red +6.783074702273208 3.211128587952996 red +7.47683218710337 2.518766753491712 red +7.163021503821117 3.252526493441669 red +7.980469959385454 4.158922284653899 red +8.52415725815523 3.11232846252088 red +7.697640498922979 4.2285295178410545 red +7.979057752484617 3.772083324553033 red +7.129657086439503 4.270166790068663 red +7.751753583966503 3.793402426923823 red +7.962022594729247 3.557862833899373 red +7.860303846423593 3.179038118142694 red +7.594168785731357 3.6788496848681413 red +9.124385644351904 2.468503337895192 red +7.713454204203212 2.9490935786628114 red +6.978844559548216 3.0178337639638806 red +6.906575699777272 3.3487729496964964 red +7.581454792889804 4.080280777611024 red +7.769797486055793 3.568644324142498 red +7.514981043050376 3.1549995905568915 red +8.076143978924529 3.470220123136699 red +7.29875139666393 3.3347908360349003 red +8.625871616822147 3.10608064651563 red +7.017251111494703 3.781879721569966 red +7.228136277849404 2.9054637393699094 red +7.270449993677676 3.01328472629758 red +7.3710753704641245 3.5688528791612377 red +7.933270825676227 3.5624377469972264 red +7.471503469540416 3.202424426475704 red +6.741829988777134 3.7063692230617864 red diff --git a/plot/diagram.png b/plot/diagram.png new file mode 100644 index 0000000..0b334d1 Binary files /dev/null and b/plot/diagram.png differ diff --git a/plot/plot.gpi b/plot/plot.gpi new file mode 100644 index 0000000..2b39561 --- /dev/null +++ b/plot/plot.gpi @@ -0,0 +1,11 @@ +set terminal png size 1280,720 enhanced font "Sans,15" +set output "diagram.png" +set pointsize 3 +set xrange [0:10] +set yrange [0:10] +plot "< awk '{if($3 == \"red\") print}' dat.dat" u 1:2 t "red" pt 4, \ + "< awk '{if($3 == \"green\") print}' dat.dat" u 1:2 t "green" pt 4, \ + "< awk '{if($3 == \"blue\") print}' dat.dat" u 1:2 t "blue" pt 4, \ + "< awk '{if($3 == \"red\") print}' centers.dat" u 1:2 t "red" pt 7, \ + "< awk '{if($3 == \"green\") print}' centers.dat" u 1:2 t "green" pt 7, \ + "< awk '{if($3 == \"blue\") print}' centers.dat" u 1:2 t "blue" pt 7 diff --git a/plot/regen.sh b/plot/regen.sh new file mode 100755 index 0000000..1636408 --- /dev/null +++ b/plot/regen.sh @@ -0,0 +1,5 @@ +#!/usr/bin/env bash +cd .. +cargo run --release --bin example +cd plot +gnuplot plot.gpi diff --git a/src/example.rs b/src/example.rs index 6620720..a2ad4c4 100644 --- a/src/example.rs +++ b/src/example.rs @@ -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 { pub x: T, pub y: T, @@ -54,29 +57,52 @@ impl Clusterable for Vector2 { 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::>(), 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(); + } }