0

这个想法是将整个世界划分为带有网格的区域。网格中的每个正方形都是一个簇。根据用户的纬度和经度,我需要检查用户在这些集群中的位置并将用户放入其中。

我需要实现的是一种对用户位置进行聚类并了解哪些用户彼此最近的方法。

将世界划分为网格的想法只是一种选择。如果这是一个更简单的方法,那么,更好。我知道我可以通过多种方式检查两个给定用户的距离,但这不是我想要的。我需要创建位置集群并将每个用户放在相关集群中。

有谁知道实现上述目标的脚本/api/方式?

非常感谢任何帮助。

谢谢

4

2 回答 2

0

聚类分析是一个复杂的问题,存在许多解决方案,具体取决于您的需求和可用信息。

k -means是一种算法,您可以在其中提供您期望的集群数量作为初始参数,并且该算法将围绕该数字进行集群。它很快,但通常不会导致最佳结果和/或迫使您为k选择一个您无法猜测的数字。

DBSCAN是一种基于两个位置之间的距离和您提供的截止半径创建集群的算法。它比k均值产生更好的结果,但速度也慢得多。

除此之外,还有更多可用的算法,所有算法都针对不同的数据模型或用例进行了调整和优化。我知道在 PHP 中没有任何实现。你真正想要的是一个支持 GIS 的数据库,例如 PostgreSQL + PostGIS。这是一个绝佳的选择。有一个原生的k -means 扩展可用。您可以将它连接到 R中,它有许多用于各种聚类算法的包

如果您的数据集足够大,那是唯一可行的路线,并且肯定会进行一些初步的艰苦战斗。否则,您几乎会被一个简单的舍入坐标到最近整数和计数算法所困,该算法很容易在 PHP 中使用几乎任何数据库实现(但只能让您获得基于方形网格的集群,而不是漂亮的)。

当然,使用简单的工具可以有许多折衷方案来解决这个问题。在数据库中进行简单的基于网格的聚类以缩小数据集的范围,然后使用基于权重的算法在客户端的 PHP 或 Javascript 中进一步聚类那些剩余的标记。或者每天晚上使用任何缓慢的方法预先计算整个事情。但是任何实现都不会像使用体面的 GIS 后端所能实现的那样好。


几年前我曾遇到过类似的问题,认为它不会那么难并最终放弃了它,因为使用我当时可用的工具证明它很难。你的普通 PHP/MySQL 组合几乎没有给你任何东西来充分解决这个问题。一旦您升级到正确的工具,就会突然有更多解决方案可供您使用。就我而言,目前是 PostGIS、R 和GeoServer。由于任何算法要么是 CPU 密集型,要么是内存密集型,或者两者兼而有之,PHP 通常不足以实现它,而且没有原生 GIS 数据类型和函数的数据库会给你的生活带来不必要的困难。

于 2013-07-30T13:16:03.870 回答
-2

我认为您不是在要求 k-means 或 dB 扫描。Mysql 有空间扩展和点数据类型。因此,您可以简单地将用户放在点列中并使用点在矩形内的查询。我还写了一个基于怪物曲线的 quadkey php 集群脚本。它是在 Oracle dB 或其他中经常使用的四叉树。您可以给我写一封电子邮件或从 phpclasses 下载我的课程。包名是希尔伯特曲线。这是 bing 地图平铺http://msdn.microsoft.com/en-us/library/bb259689.aspx的示例。

于 2013-07-30T15:06:22.017 回答