Eu tenho um banco de dados Postgres/PostGIS de geography
pontos que estou tentando agrupar; o que significa que quero agrupá-los e contá-los por proximidade. Tive primeiro sucesso com a extensão kmeans Postgresql , mas o algoritmo não é ideal para o que eu preciso. Quero experimentar mais algoritmos e R parece ser a melhor escolha para isso. Eu configurei PL/R e posso chamar funções R do Postgres...
Mas e agora? Uma função R simples que retorna um escalar não é problema, mas não tenho certeza de como abordar a mesma solução kmeans em PL/R, mas implementando sozinha uma solução de algoritmo de agrupamento inteira. A extensão kmeans acima vinculada é muito acessível para mim, com uma consulta como:
SELECT kmeans, count(*)
FROM (
SELECT kmeans(ARRAY[ST_X(geom), ST_Y(geom)], 5) OVER (), geom
FROM points
) AS ksub
GROUP BY kmeans;
Como kmeans()
só retorna um único int
, isso é muito compreensível para mim. Mas não sei por onde começar com algumas das soluções de cluster R mais complexas . Seria melhor pós-processar todo o conjunto de resultados em R, como SELECT r_cluster((SELECT ...))
? Posso usar uma WINDOW
função, nesse caso o que eu retornaria do R e como?
Eu gostaria de ver um exemplo de código real de uma declaração e invocação de função PL/R para começar.
-- please fill in the blanks
CREATE OR REPLACE FUNCTION r_cluster()
RETURNS ? AS $$ ? $$ LANGUAGE plr;
SELECT r_cluster(?) OVER (?) FROM points;
Depois de algumas experiências, cheguei a isso:
Essa função de janela é chamada uma vez para cada linha e retorna o ID do cluster do registro, mas calcula o cluster apenas uma vez usando o algoritmo DBSCAN e o armazena em uma variável global. É usado como:
Et voilà, uma implementação de agrupamento DBSCAN usando PL/R. Não tenho certeza se esta é a implementação ideal, mas é uma implementação e, com sorte, algum código de amostra útil.