python - 具有新旧点的连续循环上的 2D 点识别/匹配
问题描述
我正在做一个飞镖项目。我正在用激光扫描仪检测飞镖。使用 K-Means 我能够检测到飞镖簇。我从玩家开始轮到他的点开始扫描。这意味着我的第一个飞镖的扫描点最多,而最后一个飞镖的扫描点最少。用振动传感器检测飞镖命中。我在循环上运行 K-Means,因此我计算的飞镖点随着时间的推移变得更加准确,因此每次运行都有更多的扫描点。
现在我想将我的集群中心分配给飞镖编号。我尝试从上次运行中照顾集群中心,以便每次都有相同的集群中心订单,但没有一种智能的方式为新飞镖生成中心我经常遇到 K-Means 将现有集群减半的问题,因为大。
我正在寻找一种允许我将中心分配给 id (0, 1, ...) 的算法。如果有一个新的集群,它会获得一个新的 id。我想在运行 K-Means 之后运行这个算法,所以它只适用于集群中心。我想我可以简单地计算新旧点之间的距离并以这种方式识别它们。剩下的一个是新的镖点。
如果有帮助,我也愿意从 K-Means 切换到另一个聚类算法。
我希望你能理解我面临的问题。谢谢您的意见。
解决方案
如果我的问题是正确的,您需要将一组集群中心分配给另一组并仅使用中心的位置。这个问题称为最小权重匹配或线性和分配问题。首先,需要计算成本矩阵,即两组聚类中心之间的距离矩阵。然后你使用这个矩阵来找到总距离最小的分配。Scipy 库具有解决此类问题的功能:
from scipy.spatial import distance
from scipy.optimize import linear_sum_assignment
dists = distance.cdist(centers1, centers2, 'euclidean')
indices1, indices2 = linear_sum_assignment(dists)
剩余的索引是新的集群。
推荐阅读
- python - 内连接只是逐行执行合并?
- java - 在 extJS 中捕获 div 元素的屏幕截图
- html - HTML5 嵌入元素类型
- doxygen - C中缺少一些调用图
- php - docker-php-ext-install - 尽管安装了扩展,但仍然找不到源
- spring-boot - Spring Boot:如何设置和读取 cookie
- excel - 将大量单元格从一个工作簿移动到另一个工作簿
- powerbi - 此 Power BI 宣传材料中使用了哪些可视化效果?
- sql-server - 使用 SQL 解析 XML
- swift - 如何在 ios 图表中快速设置字符串和 Y 轴数字