在 Python 中计算位置数据的 K-means 聚类
Posted
技术标签:
【中文标题】在 Python 中计算位置数据的 K-means 聚类【英文标题】:Computing K-means clustering on Location data in Python 【发布时间】:2014-03-15 04:57:12 【问题描述】:我有一个用户数据集和他们的音乐播放,每个播放都有位置数据。对于每个用户,我想将他们的播放进行聚类,以查看他们是否在给定位置播放音乐。
我计划使用 sci-kit learn k-means 包,但我如何让它与位置数据一起使用,而不是它的默认欧几里得距离?
它的一个例子真的会帮助我!
【问题讨论】:
【参考方案1】:不要将 k-means 用于欧几里得距离以外的任何值。
K-means 不设计为与其他距离度量一起使用(有关曼哈顿距离,请参阅 k-medians,k-medoids aka. PAM 用于任意其他距离函数)。
k-means 的概念是方差最小化。而方差本质上与平方欧几里得距离相同,但与其他距离不相同。
您考虑过 DBSCAN 吗? sklearn 应该有 DBSCAN,现在应该有索引支持以使其更快。
【讨论】:
是的,它是一个项目,所以我打算从使用 k-means 开始,然后使用更准确的 DBSCAN。也许我会跳过k-means。谢谢! DBSCAN 与 k-means 不是准确性问题。它们按照不同的原则进行聚类,因此结果并不是“更好”,而通常只是一些非常不同的东西。 k-means 最小化方差。 DBSCAN 发现密度连通分量。 是的,对不起。代表我选词不当。它更适合我的集群密度和形状。【参考方案2】:数据是否已经在向量空间中,例如gps坐标?如果是这样,您可以直接聚集在它上面,lat 和 lon 与 x 和 y 足够接近,所以它应该无关紧要。如果不是,则必须应用预处理将其转换为向量空间格式(例如,将位置查找到坐标的表)。欧几里得距离是处理向量空间数据的不错选择。
要回答他们是否在给定位置播放音乐的问题,您首先要根据他们的位置数据拟合您的 kmeans 模型,然后使用 cluster_centers_ 属性找到他们的集群的“位置”。然后您检查这些集群中心中的任何一个是否足够靠近您要检查的位置。这可以使用 scipy.spatial.distance 中距离函数的阈值来完成。
提供完整示例有点困难,因为我没有数据集,但如果您想要的话,我可以提供一个给定任意 x 和 y 坐标的示例。
另请注意,KMeans 可能并不理想,因为您必须手动设置可能因人而异的集群数量“k”,或者在 KMeans 周围使用更多包装代码来确定“k”。还有其他的聚类模型可以自动确定聚类的数量,比如meanshift,在这种情况下可能更理想,也可以告诉你聚类中心。
【讨论】:
以上是关于在 Python 中计算位置数据的 K-means 聚类的主要内容,如果未能解决你的问题,请参考以下文章