2016-04-29 111 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