RosettaCodeData/Task/K-means++-clustering/Racket/k-means++-clustering-2.rkt
Ingy döt Net 6f050a029e update
2013-06-05 21:47:54 +00:00

14 lines
496 B
Racket

;; picks k points from a dataset randomly
(define (random-choice data k)
(for/list ([i (in-range k)])
(list-ref data (random (length data)))))
;; uses k-means++ algorithm
(define (k-means++ data k)
(for/fold ([centroids (random-choice data 1)]) ([i (in-range (- k 1))])
(define weights
(for/list ([x (in-list data)])
(apply min (map (distanse-to x) centroids))))
(define new-centroid
(sample (discrete-dist data weights)))
(cons new-centroid centroids)))