假设有x和y协调的10,000点。他们中的许多人如下图所示紧密相连:
为了减少数据的大小,我试图从每10个最接近的点中选择一个点。我的意思是将点分为十个部分类别,并从每个类别中选择一个
您建议使用哪种算法或方法?
答案 0 :(得分:0)
如果您不需要每个群集只有10个点,则可以使用类似k-means群集的功能,然后为每个群集选择最接近群集中心的点。您可以将群集k的数量设置为大约N / 10,其中N是您的总点数,这样您每个群集大约可以得到10个点。 k均值聚类通常运行得非常快,并且通常会产生良好的结果,通常是全局最优的,尽管收敛是局部最优的。如果你坚持每个簇只有10个点,那么你可以使用knn算法快速计算每个点的20-30个最近邻点。基于kd-trees,在matlab中的knnsearch中实现。然后选择一个点并用它的9个最近邻居从中创建一个簇。如果您想从最紧密的簇开始,您甚至可以选择具有最近的第9个邻居的点。然后从最近的邻居列表和总点列表中删除10个点并重复。如果你得到一个点的邻近数少于9个,你可以通过重复搜索该查询点来快速获得接下来的20-30个最近邻居,假设你仍然拥有存储在内存中的点的kd树。如果为最近邻居存储反向查找表,则总运行时间应比O(N ^ 2)快得多,对于每个点x存储x在该点的最近邻居列表中的点列表。如果你想总是选择最接近第9个最近邻居的下一个点,并且仍然击败O(N ^ 2),你可以保持你当前的点数存储在最小堆中,并按距离排列到第9个最近邻居,并在删除10个点时更新堆。当然,当距离第9个最近邻居的距离太大时,您需要使用第8个最近邻居,并开始制作9个点的聚类。然后是8点等的集群,直到最后你有一小组异常值,你只需要组成一个点。