2016-04-29 112 views
1

我第一次撿起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次來模擬循環。任何幫助表示讚賞!

回答

0

不要這樣做。

這將是很多很多倍的速度簡單地將數據加載到一個羣集工具包等ELKI或sklearn,那裏聚集,然後回到加載結果到數據庫。

原因是這些工具只是更好地針對此用例進行了優化。 SQL數據庫適用於通用查詢,但不適用於優化的學習算法。

在旁註中,不要在GPS座標上使用k-means。 K均值是方差最小化技術。對於這樣的數據,諸如DBSCAN和OPTICS等可以使用Haversine距離的方法效果會更好。下面是一些例子:

https://doublebyteblog.wordpress.com/2016/02/20/spatial-data-mining/

這其中也示出了這樣的數據k均值結果如何蹩腳是(下稱「長頸鹿」圖案化圖像在底部):

http://www.vitavonni.de/blog/201410/2014102301-clustering-23-mio-tweet-locations.html

+0

感謝響應。我會研究這一點。 – Dant3737