【问题标题】:How to achieve fast "vector clustering" sort?如何实现快速“向量聚类”排序?
【发布时间】:2022-01-13 08:19:36
【问题描述】:

我有 n 个 c 维向量,它们形成一个形状为 (n, c) 的矩阵 A,我怎样才能执行快速排序,以使欧几里得距离低的向量尽可能接近,并且向量距离越远越好吗? 例如,我有

A = [[0, 3], [0, 0], [0, 1]],

解决办法可以是

A_sorted = [[0, 3], [0, 1], [0, 0]].

说明:因为原A的总加权距离和为3x1+1x1+2x2 = 7,而A_sorted有2x1+1x1+3x2 = 8。 在数学上,目标是最大化总加权距离和。 对于一维情况,这可以通过 Numpy 或 PyTorch 中的 sort() 等一些 API 来实现,我主要关心的是当 c ≥ 2 时是否存在时间复杂度为 O(nlog(n)) 的快速实现? 经过长时间的斗争,我失败了。你能帮我一个忙吗?

【问题讨论】:

  • 首先想到的可能是解决旅行商问题。
  • 另外,如果向量形成一个圆圈,你期望什么输出?
  • 任何满足最佳情况的排列都可以是我想要的。当这些点形成一个圆圈时,我认为可以有很多解决方案,其中任何一个都可以返回给我。另外,我很困惑,如果存在一个快速的 PyTorch 实现来处理一批实例,每个实例由 N 个 C 维点组成,即输入数据的形状为 (B, C, N)? @Stef
  • 您是否尝试应用我链接的类似问题的答案?

标签: python algorithm numpy math pytorch


【解决方案1】:

我相信这就是你想要的:

def d(l):
    return math.sqrt(sum([x**2 for x in l]))

A = [[0, 3], [0, 0], [0, 1]]

dists = [d(el) for el in A]
sorted_vecs = sorted(zip(A, dists), key=lambda x: -x[1])
[x[0] for x in sorted_vecs]

返回

[[0, 3], [0, 1], [0, 0]]

我是O(nlog(n))

【讨论】:

  • 感谢您的帮助。但我认为这个解决方案可能不正确,因为这些点是根据它们与原始点 [0,0] 的 L2 距离进行排序的,这不能保证最优性。事实上,这个问题可能与旅行商问题有关并且非常困难,所以我正在寻求一个较弱的解决方案,它速度快,可以找到可能不是最优但优于随机排列或仅计算其 L2 范数的结果(距离 [ 0,0]) 和排序,至少。 @PermanentPon
  • 请注意,一般在使用summaxanyall时,应避免使用方括号。 sum([x**2 for x in l])sum(x**2 for x in l) 都返回相同的结果,但后者效率更高。
  • @Stef 你指的是列表理解创建一个列表对象但包括sum 在内的一些内置函数接受生成器的事实?那么是的,它会像你建议的那样更快。
  • 有你@BinChen。标题不是很清楚,你的例子很抱歉。我提出的解决方案对您没有多大帮助。您是否检查过针对旅行推销员问题的任何基于优化的解决方案,例如stackoverflow.com/a/44080908/1719231 ?
  • @PermanentPon 是的。根本没有理由在sum 中添加方括号。列表推导将无缘无故地使用额外的内存,并且会使其速度稍慢,并且不会使代码更具可读性(如果有的话,它会增加混乱)。在anyall 的情况下,情况会更糟,列表理解会强制评估所有值,而不是尽快短路。
猜你喜欢
  • 1970-01-01
  • 2018-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-06
  • 1970-01-01
  • 1970-01-01
  • 2013-08-09
相关资源
最近更新 更多