我有一个geography
要聚类的点的 Postgres/PostGIS 数据库;这意味着我想按接近度对它们进行分组和计数。我在kmeans Postgresql extension上取得了第一次成功,但该算法并不是我所需要的最佳算法。我想尝试更多的算法,而 R 似乎是最好的选择。我已经设置了PL/R并且可以从 Postgres 调用 R 函数......
但是现在呢?一个返回标量的简单 R 函数没有问题,但我不确定如何在 PL/R 中处理相同的kmeans解决方案,但单独实现整个聚类算法解决方案。前面链接的kmeans扩展对我来说非常平易近人,查询如下:
SELECT kmeans, count(*)
FROM (
SELECT kmeans(ARRAY[ST_X(geom), ST_Y(geom)], 5) OVER (), geom
FROM points
) AS ksub
GROUP BY kmeans;
因为kmeans()
只返回一个,int
所以这对我来说很容易理解。但我不确定从哪里开始一些更复杂的R 集群解决方案。在 R 中对整个结果集进行后处理会更好SELECT r_cluster((SELECT ...))
吗?我可以使用一个WINDOW
函数吗?在这种情况下,我将从 R 返回什么?如何返回?
我希望看到一个 PL/R 函数声明和调用的实际代码示例,以开始这方面的工作。
-- please fill in the blanks
CREATE OR REPLACE FUNCTION r_cluster()
RETURNS ? AS $$ ? $$ LANGUAGE plr;
SELECT r_cluster(?) OVER (?) FROM points;
经过一些实验,我得到了这个:
此窗口函数为每一行调用一次并返回记录的簇 ID,但它使用 DBSCAN 算法仅计算一次簇并将其存储在全局变量中。它的用法如下:
Et voilà,一个使用 PL/R 的 DBSCAN 集群实现。不确定这是否是最佳实现,但它是一个实现,希望是一些有用的示例代码。