试图理解/开始使用MySQL中的k-means聚类算法

试图理解/开始使用MySQL中的k-means聚类算法,mysql,cluster-analysis,k-means,Mysql,Cluster Analysis,K Means,我第一次接触MySQL,一直在玩我在上找到的sql位置聚类算法。我觉得集群很有趣,我正试图弄清楚它是如何工作的,但遇到了一些麻烦 这是我在使用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 do

我第一次接触MySQL,一直在玩我在上找到的sql位置聚类算法。我觉得集群很有趣,我正试图弄清楚它是如何工作的,但遇到了一些麻烦

这是我在使用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 fiddle抱怨的集群

您的SQL语法有错误;查看与您的MySQL服务器版本对应的手册,了解第2行“更新km_数据d集cluster_id=从km_clusters c按POW顺序选择id”附近使用的正确语法

我注意到Till不是粗体的,我想知道这是否是一个适合用于这样的循环的术语:

 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次运行相同的代码块模拟了循环。感谢您的帮助

不要这样做

简单地将数据加载到集群工具包(如sklearn或sklearn)中,在那里进行集群,然后将结果加载回数据库,速度会快很多倍

原因是这些工具只是针对这个用例进行了更好的优化。SQL数据库适用于通用查询,但不适用于优化的学习算法

另一方面,不要在GPS坐标上使用k均值。K-均值是一种方差最小化技术。对于这样的数据,DBSCAN和光学等可以使用哈弗森距离的方法工作得更好。以下是一些例子:

这张照片还显示了这些数据的k-均值结果是多么糟糕,下面是长颈鹿图案的图像:


谢谢你的回复。我会调查的。