我第一次撿起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