我第一次捡起MySQL,并一直在使用我在http://jonisalonen.com/2012/k-means-clustering-in-mysql/找到的sql位置聚类算法。我发现聚类很有趣,并试图弄清楚这是如何工作的,但遇到了一些麻烦。试图理解/得到在MySQL中使用k均值聚类算法
这是我键入的代码(我一直在使用sqlfiddle.com)
create table km_data (id int primary key, cluster_id int,
lat double, lng double);
create table km_clusters (id int auto_increment primary key,
lat double, lng double
);
INSERT INTO km_data
VALUES(1,0,88.3324,56.343);
INSERT INTO km_data
VALUES(2,0,88.3324,56.342);
INSERT INTO km_data
VALUES(3,0,83.234,54.234);
INSERT INTO km_data
VALUES(4,0,88.33,57.234);
INSERT INTO km_data
VALUES(5,0,88.234,86.654);
INSERT INTO km_data
VALUES(6,0,78.673,56.854);
INSERT INTO km_data
VALUES(7,0,83.136,46.958);
INSERT INTO km_clusters (lat, lng) SELECT lat, lng FROM km_data LIMIT 10;
UPDATE km_data d SET cluster_id =
(SELECT id FROM km_clusters c ORDER BY POW(d.lat-c.lat,2)+POW(d.lng-c.lng,2) ASC LIMIT 1);
UPDATE km_clusters C, (SELECT cluster_id, AVG(lat) AS lat, AVG(lng) AS lng
FROM km_data GROUP BY cluster_id) D SET C.lat=D.lat, C.lng=D.lng WHERE C.id=D.cluster_id;
编译没有问题,但是当我把在更新部件成环路的网站有它,所以它不断更新集群SQL小提琴抱怨,
“您的SQL语法错误;查看与您的MySQL服务器版本相对应的手册,以便在'UPDATE km_data d SET cluster_id =(SELECT id FROM km_clusters c ORDER BY POW('at line 2“
我注意到,“直到”不加粗,并想知道如果这是不恰当的词来使用的循环是这样的:
BEGIN
UPDATE km_data d SET cluster_id =
(SELECT id FROM km_clusters c ORDER BY POW(d.lat-c.lat,2)+POW(d.lng-c.lng,2) ASC LIMIT 1);
UPDATE km_clusters C, (SELECT cluster_id, AVG(lat) AS lat, AVG(lng) AS lng
FROM km_data GROUP BY cluster_id) D SET C.lat=D.lat, C.lng=D.lng WHERE C.id=D.cluster_id;
UNTIL ROW_COUNT() = 0
END REPEAT;
而且,这种算法似乎是它可能只对大量数据运行良好(不是我拥有的那对夫妇),这是否正确?唯一一次我在同一个群集中获得了两个数据,它们具有相同的确切位置。也许这是一个错误,因为我没有得到循环来正常工作,虽然我已经通过运行同一代码块连续10次来模拟循环。任何帮助表示赞赏!
感谢响应。我会研究这一点。 – Dant3737