搜索k个最近的元素[重复]

Posted

技术标签:

【中文标题】搜索k个最近的元素[重复]【英文标题】:Searching the k nearest elements [duplicate] 【发布时间】:2017-11-14 21:51:59 【问题描述】:

我有一堆(或多或少 3500 个)具有 4096 个分量的向量,我需要一种快速的方法来查看,给定另一个具有相同长度的向量的输入,它们是最接近的 N。 我想使用一些matlab函数来做到这一点。这可以满足我的需要吗?

https://uk.mathworks.com/help/stats/classificationknn-class.html

【问题讨论】:

提示:如果您的问题可以用“是”来回答,那么它很可能不适合 stackverflow。请注意,这个问题的答案可能是“否”,但仍然如此。 K-Nearest Neighbors 算法将向量分组到K 集群中。每个集群中心是其集群成员的平均值(重心)。要找到最近的向量,首先要确定最近的聚类中心,然后搜索聚类以找到聚类内最近的向量。 【参考方案1】:

您建议的是一个聚类函数,它应该从所有向量中生成 N 个聚类。不确定这是你想要的。如果你只是想要一堆向量之间的 N 个最小距离,你可以很容易地手动完成。比如:

distances = matrixOfvectors - yourVector; % repmat(your...) if you have older Matlab.
[val, pos] = sort(sum(distances.^2, 2)); % Sum might need 1 instead of 2, depends whether vectors are rows or columns.
minVectors = pos(1:N); % Take indices of N nearest to get which vectors are the closest.

如果 N 很小,比如 3 或更少,避免排序会稍微快一些,只需简单地将每个新向量与第 2 个最大的向量进行比较,然后根据结果与第 1 个或第 3 个向量进行比较。

【讨论】:

不幸的是,这种方法应该很耗时,因为我的 N 是 4096,比较次数约为 3500。所以我需要更快的东西。 我错了,显然在matlab中有这样的脚本:tic; sA = 大小(A); B = 兰德(1, 4096); C = repmat(B, sA(1),1); disAC = A - C; [val, pos] = sort(sum(disAC.^2, 2)); minVectors = pos(1:10); toc 或多或少需要 0.1 秒,这对我的目的来说是可以的。非常感谢!

以上是关于搜索k个最近的元素[重复]的主要内容,如果未能解决你的问题,请参考以下文章

海量数据问题

力扣 练习2(十题)

力扣 练习2(十题)

力扣 练习2(十题)

在C中创建n个项目的k和m个组合的所有可能子集[重复]

可重复选择的组合