61 lines
No EOL
1.9 KiB
Text
61 lines
No EOL
1.9 KiB
Text
struct Point {
|
|
int x;
|
|
int y
|
|
}
|
|
|
|
struct TrainPoint {
|
|
Point p;
|
|
int cluster_num
|
|
}
|
|
|
|
Point[] train (int iters, int num_clusters, int num_train_pts, Point[] training_pts) {
|
|
var clusters = new Point[num_clusters]{i -> new Point {x=i;y=i}};
|
|
var train_pts = new TrainPoint[num_train_pts]{i -> new TrainPoint {p=training_pts[i]; cluster_num=i}};
|
|
|
|
var x = 1;
|
|
|
|
for (var iter = 0; iter < iters; iter = iter + 1;) {
|
|
for (var p = 0; p < num_train_pts; p = p + 1;) {
|
|
var min_dist = -1;
|
|
var min_dist_cluster = -1;
|
|
|
|
for (var c = 0; c < num_clusters; c = c + 1;) {
|
|
var dist = (clusters[c].x - train_pts[p].p.x) * (clusters[c].x - train_pts[p].p.x) + (clusters[c].y - train_pts[p].p.y) * (clusters[c].y- train_pts[p].p.y);
|
|
if ((min_dist == -1) | (dist < min_dist)) {
|
|
min_dist = dist;
|
|
min_dist_cluster = c;
|
|
}
|
|
}
|
|
train_pts[p].cluster_num = min_dist_cluster;
|
|
}
|
|
}
|
|
|
|
return clusters;
|
|
}
|
|
|
|
int predict_cluster_num (Point p, Point[] clusters, int num_clusters) {
|
|
var min_dist = -1;
|
|
var min_dist_cluster = -1;
|
|
|
|
for (var c = 0; c < num_clusters; c = c + 1;) {
|
|
var dist = (clusters[c].x - p.x) * (clusters[c].x - p.x) + (clusters[c].y - p.y) * (clusters[c].y- p.y);
|
|
if ((min_dist == -1) | (dist < min_dist)) {
|
|
min_dist = dist;
|
|
min_dist_cluster = c;
|
|
}
|
|
}
|
|
|
|
return min_dist_cluster;
|
|
}
|
|
|
|
int program(int argc, string[] args) {
|
|
var num_clusters = 10;
|
|
var num_pts = num_clusters * 2;
|
|
var iters = 10;
|
|
|
|
var train_pts = new Point[num_pts]{i -> new Point {x=-i;y=i * i * i}};
|
|
var clusters = train (iters, num_clusters, num_pts, train_pts);
|
|
|
|
var test_point = new Point{x=0;y=0};
|
|
return predict_cluster_num(test_point, clusters, num_clusters);
|
|
} |