- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我在维度 d 中有一组 n 个点,如果需要,我可以为其计算所有成对距离。我需要在此集合中选择 k 个点,以便它们的成对距离之和最大。换句话说,稍微多一些数学术语,我希望 S 中的 p1, ..., pk 使得 sum(i,j < k) dist(pi, pj) 最大。
我知道这个问题与 this one 有关(这与我的基本相同,但 k=2)并且可能到 this one (使用“最远”而不是“最近”)。
我不太确定,但也许所有可能的解决方案的所有点都在凸包中?
任何合理的近似/启发式都可以。
虚拟奖励点 #1 的解决方案适用于从四个点中给出分数的任何函数(其中一个可以是距离平方和的平方根)。
如果解决方案可以在 python + numpy/scipy 中轻松实现,则虚拟奖励点 #2。
最佳答案
您的问题似乎类似于 weighted minimum vertex cover problem (这是 NP 完全)。感谢@Gareth Rees 在下面的评论中澄清了我在理解顶点覆盖与您正在寻找的集合的关系方面是不正确的。但是您仍然可以研究顶点覆盖问题和文献,因为您的问题可能会与它一起讨论,因为它们仍然有一些共同特征。
如果您愿意使用直径而不是总图权重,则可以使用您在问题中链接的最小直径集的方法。如果您当前的距离度量称为 d
(您希望点之间距离最远的那个),那么只需定义 d' = 1/d
并求解最小距离d'
的问题。
某种形式的图形切割算法之间也可能存在关系,比如 normalized cut ,以及您寻找的子集。如果您的距离度量用作图权重或节点之间的亲和性,您可以修改现有的图切割目标函数以匹配您的目标函数(寻找具有最大总和权重的 k 节点组)。
这似乎是一个组合难题。您可能会考虑一些简单的事情,例如模拟退火。 proposal 函数可以随机选择当前在 k
-subset 中的点,并用当前不在 k
-subset 中的点随机替换它。
您需要针对温度项制定良好的冷却计划,并且可能需要根据成本使用再加热。但是这种编程真的很简单。只要 n
相当小,您就可以不断地随机选择 k
-subsets 并退火到总和非常大的 k
-subset距离。
这只会给你一个近似值,但即使是确定性方法也可能会近似解决这个问题。
下面是对模拟退火代码可能是什么的第一次破解。 请注意,我对此不做任何保证。如果计算距离太难或问题实例大小变得太大,这可能是一个低效的解决方案。我正在使用具有固定冷却速率的非常朴素的几何冷却,您可能还想修改一个比随机交换节点更奇特的建议。
all_nodes = np.asarray(...) # Set of nodes
all_dists = np.asarray(...) # Pairwise distances
N = len(all_nodes)
k = 10 # Or however many you want.
def calculate_distance(node_subset, distances):
# A function you write to determine sum of distances
# among a particular subset of nodes.
# Initial random subset of k elements
shuffle = np.random.shuffle(all_nodes)
current_subset = shuffle[0:k]
current_outsiders = shuffle[k:]
# Simulated annealing parameters.
temp = 100.0
cooling_rate = 0.95
num_iters = 10000
# Simulated annealing loop.
for ii in range(num_iters):
proposed_subset = current_subset.copy()
proposed_outsiders = current_outsiders.copy()
index_to_swap = np.random.randint(k)
outsider_to_swap = np.random.randint(N - k)
tmp = current_subset[index_to_swap]
proposed_subset[index_to_swap] = current_outsiders[outsider_to_swap]
proposed_outsiders[outsider_to_swap] = tmp
potential_change = np.exp((-1.0/temp)*
calculate_distance(proposed_subset,all_dists)/
calculate_distance(current_subset, all_dists))
if potential_change > 1 or potential_change >= np.random.rand():
current_subset = proposed_subset
current_outsiders = proposed_outsiders
temp = cooling_rate * temp
关于python - 从给定的 n 个点中选择最远的 k 个点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19120480/
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我们可以说 O(K + (N-K)logK)相当于O(K + N logK)对于 1 < = K <= N ? 最佳答案 简短的回答是它们不等价,这取决于k 的值。如果k等于N,那么第一个复杂度是O(
我有以下解决方案,但我从其他评论者那里听说它是 O(N * K * K),而不是 O(N * K)其中 N 是 K 列表的(最大)长度,K 是列表的数量。例如,给定列表 [1, 2, 3] 和 [4,
我试图理解这些语法结构之间的语义差异。 if ((i% k) == (l % k) == 0) 和 if ((i % k) == 0 && (l % k) == 0) 最佳答案 您的特定表达式((i
我有时会使用一维数组: A = np.array([1, 2, 3, 4]) 或 2D 阵列(使用 scipy.io.wavfile 读取单声道或立体声信号): A = np.array([[1, 2
在文档聚类过程中,作为数据预处理步骤,我首先应用奇异向量分解得到U、S和Vt 然后通过选择适当数量的特征值,我截断了 Vt,这让我从阅读的内容中得到了很好的文档-文档相关性 here .现在我正在对矩
我问的是关于 Top K 算法的问题。我认为 O(n + k log n) 应该更快,因为……例如,如果您尝试插入 k = 300 和 n = 100000000,我们可以看到 O(n + k log
这个问题与另一个问题R:sample()密切相关。 。我想在 R 中找到一种方法来列出 k 个数字的所有排列,总和为 k,其中每个数字都是从 0:k 中选择的。如果k=7,我可以从0,1,...,7中
我目前正在评估基于隐式反馈的推荐系统。我对排名任务的评估指标有点困惑。具体来说,我希望通过精确度和召回率来进行评估。 Precision@k has the advantage of not requ
我在 Python 中工作,需要找到一种算法来生成所有可能的 n 维 k,k,...,k 数组,每个数组都沿轴有一行 1。因此,该函数接受两个数字 - n 和 k,并且应该返回一个数组列表,其中包含沿
我们有 N 对。每对包含两个数字。我们必须找到最大数 K,这样如果我们从给定的 N 对中取 J (1 2,如果我们选择三对 (1,2),我们只有两个不同的数字,即 1 和 2。 从一个开始检查每个可能
鉴于以下问题,我不能完全确定我当前的解决方案: 问题: 给定一个包含 n 元素的最大堆,它存储在数组 A 中,是否可以打印所有最大的 K 元素在 O(K*log(K)) 中? 我的回答: 是的,是的,
我明白了: val vector: RDD[(String, Array[String])] = [("a", {v1,v2,..}),("b", {u1,u2,..})] 想转换成: RDD[(St
我有 X 个正数,索引为 x_i。每个 x_i 需要进入 K 组之一(其中 K 是预先确定的)。令 S_j 为 K_j 中所有 x_i 的总和。我需要分配所有 x_i 以使所有 S_j 的方差最小化。
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能是on-topi
我正在研究寻找原始数的算法,看到下面的语句,我不明白为什么。 while (k*k <= n) 优于 while (k <= Math.sqrt(n)) 是因为函数调用吗?该调用函数使用更多资源。 更
我想找到一种尽可能快的方法来将两个小 bool 矩阵相乘,其中小意味着 8x8、9x9 ... 16x16。这个例程会被大量使用,所以需要非常高效,所以请不要建议直截了当的解决方案应该足够快。 对于
有没有一种惯用的方法来获取 Set和 Function ,并获得 Map实时取景? (即 Map 由 Set 和 Function 组合支持,例如,如果将元素添加到 Set ,则相应的条目也存在于 M
这个问题在这里已经有了答案: Can a local variable's memory be accessed outside its scope? (20 个答案) returning addr
给定一个矩阵:- k = [1 2 3 ; 4 5 6 ; 7 8 NaN]; 如果我想用 0 替换一个数字,比如 2,我可以使用这个:k(k==2) =
我是一名优秀的程序员,十分优秀!