聚类不同的类
Posted
技术标签:
【中文标题】聚类不同的类【英文标题】:Clustering different class 【发布时间】:2017-06-06 00:04:01 【问题描述】:我想对具有多个类(最多 10 个)的数据集进行聚类。但是这个聚类问题与通常的聚类不同。我需要(如图所示;https://ibb.co/iiNbqv)而不是相同/相似的类。我应该使用哪种方法?你会推荐什么?
问题如下; 我有几个帧/图像(最多 10 个),每帧都有数十万次检测。因此,由于我正在处理的数据是检测的位置(x 和 y 坐标)。我要做的是,在这些帧中以一定的距离阈值重叠了多少检测。约束是,每一个帧的检测不应该在同一个重叠的簇中超过一次,如图所示。所以基本上,我应该从其他帧中找到最近的点检测,并将它们放在同一个集群中。但是一旦我这样做了,集群中的每个点之间的距离都不应该超过远距离阈值
干杯
【问题讨论】:
为什么有些聚类只有两个点,尽管第三类附近有一个点?推动这种集群的基本原理是什么? 实际上,每个类都是不同的图像帧,每个点都是图像中的检测位置。所以当我按顺序做时,结果如图所示。但可以肯定的是,左上角的点应该在紧密的簇中。此外,如果没有来自其他类的附近(高于阈值)点,则可能存在一些具有两个点的集群。 这个还没有明确说明。什么定义了算法的“完整”聚类(可接受的解决方案)?什么定义了最佳解决方案?您为此开发了哪些算法?数据如何表示(程序输入是什么)? 抱歉给您带来不便,我在上面的问题中添加了更多细节。我使用了具有联合概率的树结构。与多假设跟踪类似的方法。它可以很好地找到最近的点,但问题是它没有考虑从第一帧到最后一帧之间的距离。 【参考方案1】:根据您的图像和您绘制的圆圈,这似乎是根据它们之间的距离对不同数据点进行聚类的问题。一个简单的基于欧几里德距离的聚类算法应该可以提供您正在寻找的结果。
这样的事情会根据数据点之间的距离度量对数据点进行聚类。唯一的参数是距离阈值,您应该将其设置为与您的问题一致的值。
#PSEUDO-CODE!
#p is a list of all data points
for i=all points
if( p(i).used == false)
#Create new cluster c
p(i).cluster = c
for n=1:all_Points
if ( p(n).used == false)
if p(n).class not in cluster
d=dist(p(i),p(n))
if d<max
p(n).cluster = c;
p(n).used = true;
这基本上去每个点并找到它们中的哪些靠近它,并将它们分配到同一个集群。这种聚类例程有很多变体,可以实现不同的目标。
例如,您可以比较集群的当前质心而不是初始化集群的点之间的距离,或者比较最后添加到集群的点而不是第一个。取决于什么更适合您的数据性质。
【讨论】:
我认为这还不够:从描述和图中,我推测 OP 有一个额外的限制,即每个类(颜色)中只能包含一个点。跨度> 感谢您的帮助。但是,对不起,我忘了补充一点,每个集群最多只能包含一个不同的类。换句话说,同一个集群中不应该有同一个类。如何优化上面提供的算法? 应该很容易跟踪已经在集群中的当前类,并避免添加来自同一类的点。编辑“代码”以显示条件的样子【参考方案2】:集群在这里对你没有多大帮助,因为它太具有探索性了。
一般来说,您应该考虑优化。特别是,您的问题与 set cover 问题有相似之处。据我所知,您想用三个一组来覆盖所有实例,这样三个元素位于不同的“类”中并且最相似?
根据优化理论的结果,您很可能能够证明这个问题是 NP 难题,因此贪婪逼近算法是更好的处理方法。
【讨论】:
以上是关于聚类不同的类的主要内容,如果未能解决你的问题,请参考以下文章