我对最近的邻居算法(用于TSP)的实现有什么问题?
我的任务是实施最近的旅行推销员问题最近的邻居算法.据说该方法应该尝试从每个城市开始,并返回找到的最佳巡回演出.根据自动标记程序,我的实施适用于最基本的情况,但仅适用于所有更高级的情况. 我不明白我在哪里出错,并正在寻求对我的代码进行正确的评论.我渴望找出我出错的地方以及正确的方法是什么. 我的Java代码如下: /* * Returns the shortest tour found by exercising the NN algorithm * from each possible starting city in table. * table[i][j] == table[j][i] gives the cost of travel between City i and City j. */ public static int[] tspnn(double[][] table) { // number of vertices
2 2024-01-23
编程技术问答社区
在KNN算法中需要归一化
为什么在KNN中需要归一化?我知道此过程使所有功能对结果的效果归一范v归一化 .因此,标准化与欧几里得距离有什么区别.毕竟,KNN完全取决于欧几里得距离? 预先感谢! 解决方案 如果您在不同的维度上有不同的可变性,则大多数归一化技术将改变最近的邻居. 想象A =(-5,0),B =(-5,1)和C =(5,1)的数据集.现在考虑一个兴趣点(4.5,0).显然,C是最接近的邻居. 在两个维度中,最小最大归一化为(-1,1)后,您的数据集将变为a =( - 1,-1),b =( - 1,1),c =(1,1).您的兴趣点对应于这个新空间中的(0.9,-1).因此,A现在是最近的邻居. 其他解决方案 我同意dedobed.但是,答案似乎暗示了KNN不建议进行缩放变量.当涉及非常不同数量级的变量时,幅度最高的变量将主导分析.在某些情况下,这可能不是可取的.缩放所有变量将阻止此问题.
0 2024-01-23
编程技术问答社区
寻找二维阵列的邻居
我已经有一个75乘75 col的2D网格,我在用户点击上绘制2种颜色(红色和蓝色)的符号,它可以正常工作,但我遇到了一个主要问题,我想找到那些邻居符号:示例用户单击单元格时,它将打印一个符号(椭圆形),现在我希望单击还会在其邻居中检查单元格是否被占用或空的(如果被占用). 我找到了下面的算法似乎适合需求,但不知道如何适应我的代码: private static int[][] array = new int[3][3]; private static void initialiseArray() { int counter = 1; for (int row = ; row
0 2024-01-23
编程技术问答社区
如何在Matlab中进行高效的K-近邻计算
我正在使用MATLAB中的K-Nearest邻居算法进行数据分析.我的数据由约11795 x 88数据矩阵组成,其中行是观察值,列是变量. 我的任务是为n个选定的测试点找到K-Nearest邻居.目前,我正在使用以下逻辑进行操作: 对于所有测试点 LOOP all the data and find the k-closest neighbors (by euclidean distance) 换句话说,我循环所有n个测试点.对于每个测试点,我通过欧几里得距离搜索K-neart邻居的数据(不包括测试点本身).对于每个测试点,这大约需要K x 11794迭代.因此,整个过程大约需要N x K x 11794迭代.如果n = 10000和k = 7,则大约是8.256亿次迭代. 是否有一种更有效的方法来计算K-Nearthear的邻居?现在,大多数计算都将浪费,因为我的算法仅仅是: 计算到与所有其他点的欧几里得距离,拾取最接近的距离,并从进一步的考虑中
4 2024-01-23
编程技术问答社区
从一个矩阵中找到距离为k的元素
给定一个n*n矩阵和值k,我们如何找到每个元素的所有邻居? 例如:在4*4矩阵中,带有k=2 说矩阵是: [ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16] 这些值是位置的索引,1 are 1,2,3,5,6,9的邻居.值3,6 and 9仅是因为k = 2,如果k = 1. ,则不会在那里. 同样,6的邻居将是1 2 3 5 6 7 8 9 10 11 and 14 您可以帮助我编写C代码以在C ++中实现. 这是冯·诺伊曼(Von Neumann)社区的问题,请某人在C ++中实现它.谢谢 解决方案 这应该为k = 1做好技巧.进行较小的更改以使其适用于所有K int width = 4; int height = 4; int k = 1; int value = 2; bool hasRight = (value % width != 0); bool hasLeft = (value
2 2024-01-23
编程技术问答社区
在O(1)中使用前缀树寻找单个最近的邻居?
我正在阅读一篇论文,他们提到他们能够使用前缀树在O(1)中找到最近的邻居.我将描述一般问题,然后描述经典解决方案,最后在本文中提出的解决方案: 问题:给定位矢量l(所有向量的长度相同)和查询位向量q的列表,我们想找到Q的最近邻居.距离度量是锤距离(多少位不同).幼稚的方法是浏览列表并计算列表中每个向量与Q之间的锤击距离,这将为O(n).但是,鉴于我们将拥有非常昂贵的位矢量的百万,因此我们想减少它. 经典解决方案: 解决此问题的经典解决方案是使用近似来查找最近的邻居以实现O(logn).这样做的方法是首先在词典上对L进行分类,以便相似的位向量将彼此接近.然后给定Q,我们在排序列表上应用二进制搜索以获取Q在排序列表中的位置,并在其上方和列表中的向量(因为它们是分类的相似的)并计算了它们之间的距离,并选择最低锤距的距离.但是,简单地进行一种分类,我们仍然会错过许多类似的向量,因此,为了涵盖尽可能多的向量,我们使用p数量的列表和p数量的jumbling功能.每个混合功能对应于每个列表
2 2024-01-23
编程技术问答社区
K-d树:具有可操作性的伪码的近邻搜索算法
Wikipedia最近邻居(NN)搜索的伪代码对我来说还不够易于处理.实施的帖子很少,但它们似乎是特定于语言的.因此,我发现很难理解NN搜索的工作原理.该图从 https:///wwwww.cs.cmu. edu/〜ckingsf/bioinfo ofere/kdtrees.pdf .而且我试图用特定的情况理解查询点q =(52,52). 假设两个昏暗的是(x,y),而根级分裂为x-dim. 搜索NN: 首先,我从根到一片叶子,就好像我想插入Q一样.这样做,叶子为(55,1).更新A(Global)VAR Current_Best从Infinity到(55-52) 2 +(1-52) 2 =2610. 接下来,我要转到(70,70),并更新Current_best从2610到18 2 +18 2 = 648.由于这给出了更好的距离,我们必须探测它是子树:这是正确的理解吗? 此外,我们看到节点(60,80)没有给出更好的结果(即Current_best没有更新).
0 2024-01-23
编程技术问答社区
如何使用KDTrees实现近邻搜索?
所以,我正在实施 kd-tree 进行最近的邻居搜索.我已经有建筑物的零件工作,但是我认为我完全不了解搜索部分. Wikipedia文章说 关于搜索邻居的树以寻找邻居: : Starting with the root node, the algorithm moves down the tree recursively, in the same way that it would if the search point were being inserted (i.e. it goes right or left depending on whether the point is greater or less than the current node in the split dimension). "比吐口度维度中的当前节点大或更小? 另外,有人可以解释有关超空间和超平面的部分吗?我觉得自己理解了,但是由于我不确定我是否喜欢更多的解释. 谢谢!
2 2024-01-23
编程技术问答社区
为什么我们需要一个粗糙的量化器?
in for for Nighlign Search 第四节,它说他们也将使用粗量化器(我认为这是一个非常较小的产品量化器,较小的W.R.T. k,质心数). 我真的不明白为什么这有助于搜索过程,原因是我认为我不明白他们使用它的方式.任何ides 请? 解决方案 如"非详尽搜索"部分中提到的, 与产品量化器的大约最近的邻居搜索 快速并大大减少了 存储描述符. 尽管如此,搜索是详尽的. 粗量化量用于非偏竭搜索.它首先检索候选人集,然后在候选人集中搜索基于PQ的最近邻居. 因此,IMO的性能在很大程度上取决于粗量化的性能.如果候选人集首先不包含一些真正最近的邻居,我们也无法在随后的PQ步骤中获取它们. 和afaik粗量化的东西是ANN的基本算法之一,不必与PQ一起使用.
2 2024-01-23
编程技术问答社区
k*的繁殖值?
我正在阅读有关产品量化的有关产品量化的文章,摘自 ..所有子定量器的繁殖值都具有相同的有限数k*.在这种情况下,质心数为(k*)^m 其中m是子向量的数量. 但是,我根本没有k*!我的意思是,在向量量化中,我们将每个向量分配给K质心.在农产品量化中,我们将每个子向量分配给K质心. K*是如何发挥作用的? 解决方案 我认为k*是每个子空间中的质心数,而k是整个空间中的质心数. 例如,如果数据为2D,例如(x, y),我们将每个维度视为一个子空间,并且分别用Say k*=3进行KMeans,我们将在每个子空间中获得3个centroids,{x1, x2, x3}和{x1, x2, x3}和{y1, y2, y3}. 然后,将在整个空间中可能有3^2=9 * (x1, y1),(x1, y2),(x1, y2),(x2, y1),(x2, y1) ... 通过这种方式,我们可以使用少量内存获得大量的质心(2^64),因为我们不必存储所有k*^m cent
2 2024-01-23
编程技术问答社区
使用网格划分的二维最近的邻居搜索
i在集合中有相当大的2D点(〜20000),对于X-y平面中的每个点都需要确定最接近的位置. (实际上,这些点是不同类型的,我只想知道哪种类型最接近.X-Y平面是位图,例如640x480.) 来自这个答案对问题"/all-k-nearest-neighbors-in-2d-c"> 2D中的所有K最近的邻居,C ++ "我想到了制作网格的想法.我创建了N*M C ++向量,并将点放入向量,具体取决于其落入哪个bin.想法是,您只需要检查垃圾箱中点的距离,而不是所有点.如果垃圾箱中没有意义,您会以螺旋式的方式继续相邻的垃圾箱. 不幸的是,我只阅读了奥利·查尔斯沃思(Oli Charlesworth)的评论: 不仅是相邻的,不幸的是(考虑到两个单元格中的点 东方可能比直接东北的牢房的点更近, 例如;这个问题在更高的维度下变得更糟. 另外,如果相邻的细胞碰巧少于10 他们的点?实际上,您需要"螺旋出去". 幸运的是,我已经弄清楚了螺旋式代码(一个不错的 c ++版本在这里
0 2024-01-23
编程技术问答社区
高维近邻搜索的最佳数据结构
实际上,我正在研究高维数据(〜50.000-100.000功能),并且必须在其上执行最近的邻居搜索.我知道随着尺寸的增长,KD-Trees的性能较差,而且我也读到,通常,所有空间分配数据结构都倾向于使用高维数据进行详尽的搜索. 此外,还有两个重要事实要考虑(相关性订购): 精度:必须找到最近的邻居(不是近似). 速度:搜索必须尽可能快. (创建数据结构的时间并不重要). 所以,我需要一些有关: 的建议 执行K-NN的数据结构. 如果最好使用ANN(大约最近的邻居)方法,则将其设置为尽可能准确? 解决方案 我可以在高维空间中执行NN搜索吗? no. ,由于维度的诅咒,在较低维度中执行最近邻居搜索的数据结构在高维地点无法表现良好.事实上,查询时间几乎变成了蛮力一体,因此毫无价值. 因此,在高维空间中,应该使用 近似最近的邻居 (ANN)搜索.老实说,这是必须. 哪种数据结构要执行ANN? 我建议LSH或许多RKD树.在我的答案在这
寻找近邻的空间划分算法是如何工作的?
找到最近的邻居,假设我有一组2D点(x和y坐标),并且给我一个点(a,b).该算法如何查找最近的邻居? 解决方案 空间分区实际上是一个密切相关的算法的家族,该算法分区空间可以更轻松地处理点或多边形. 我认为有很多方法可以解决您的问题.我不知道您愿意建立解决方案有多复杂.一种简单的方法可能是建造一棵二进制树将空间切成2.所有点在某些中间平面之间划分.通过递归细分直至用完点来构建树. 搜索最近的邻居将得到优化,因为树的每个遍历都在搜索区域缩小. 在某些文献中,他们称其为 kd tree 其他解决方案 这两个视频应有所帮助: 解释如何建立KD树: http://www.youtube.com/watch?v=t9h2kkj_pl8 解释如何最近执行 邻居搜索: http://www.youtube.com/watch?/li>
2 2024-01-23
编程技术问答社区
用莫顿顺序搜索最近的邻居的好处?
在进行粒子相互作用的仿真时,我偶然发现了morton-order(z-order)的网格索引( Wikipedia链接),该链接被认为提供有效的最近的邻居搜索.我阅读的主要原因是在存储器中几乎是空间关闭单元的顺序排序. 处于第一个实现的中间,我无法围绕如何有效地实现最近邻居的算法,尤其是与基本统一网格相比. 给定一个单元格(x,y),获得8个邻居牢房指数并计算各自的z索引是微不足道的.尽管这为元素提供了恒定的访问时间,但必须在预定义的表中计算或查找z索引(对于每个轴和ORING).这可能如何更有效?是的,以顺序访问数组中的元素是[0] - > a 1 - > a [3] - > a [4] - > ...比在a [1023] - > a [12] - > a [456] - >的顺序中更有效A [56] - > ...? 我期望存在一种更简单的算法,可以在z订购中找到最近的邻居.沿线的东西:找到邻居的第一个牢房,迭代.但这是不正确的,因为这仅在2^4个大小的块中很好地工
4 2024-01-23
编程技术问答社区
如何在weka中用java获得最近的邻居?
我一直在尝试使用与WEKA机器学习库一起使用的IBK最近的邻居算法. 我知道如何对实例进行分类,但是我想实现协作过滤功能,因此我需要实际获取最接近感兴趣对象的实际对象列表. 使用其Java API,我将如何在WEKA中实际上这样做? 解决方案 这个 怎么样 weka.core.neighboursearch.LinearNNSearch knn = new LinearNNSearch( trainingInstances); //do other stuff Instances nearestInstances= knn.kNearestNeighbours(target, 3) 这是 api document "> api document "> api document 参考.
2 2024-01-23
编程技术问答社区
如何在一个有500,000个点的100维空间中找到最近的2个点?
我有一个数据库,在100维空间中有500,000点,我想找到最接近的2点.我该怎么做? 更新:空间是欧几里得,对不起.并感谢您的所有答案.顺便说一句,这不是作业. 解决方案 您可以尝试 ann Library 可靠的结果最多20维. 其他解决方案 算法简介 - o(n*logn)时间中的维空间. You can check it out on google books.实际上,我建议每个人都将其应用于这个问题的方式非常简单,优雅和令人印象深刻. 尽管不能将其直接扩展到您的问题(因为常数7将被2^101 - 1替换),但对于大多数数据集来说,它应该很好.因此,如果您具有合理的随机输入,它将给您O(n*logn*m)复杂性,其中n是点的数量,而m是尺寸的数量. 编辑 这就是假设您有欧几里得空间.即,向量的长度v是sqrt(v0^2 + v1^2 + v2^2 + ...).但是,如果您可以选择度量标准,则可能还有其他选项来优化算法. 其他解决方案
0 2024-01-23
编程技术问答社区
使用欧几里得距离在numpy数组列表中找到一个numpy数组的最近邻居
我有一个n维矢量,我想在使用欧几里得距离的n维矢量列表中找到其k最近的邻居. 我编写了以下代码(k = 10),该代码工作起作用,但运行速度太慢,我想知道是否有一个更最佳的解决方案. def nearest_neighbors(value, array, nbr_neighbors=1): return np.argsort(np.array([np.linalg.norm(value-x) for x in array]))[:nbr_neighbors] 解决方案 使用Scipy's kd-tree . 一个小例子是可在此处提供. 许多人似乎抱怨表现,并推荐 sklearn的实现(尽管(尽管链接使用此其他解决方案 我最终使用了Scipy库(但是NearestNeighbors方法),将计算时间从50小时降低到36分钟.这是我不应该尝试重新进化的那种计算,因为专门的库对此进行了优化得多. NearestNeighbors方法还允许您传递值列
0 2024-01-23
编程技术问答社区
四叉树最近的邻接算法
我已经为n个点实现了一个Quadtree结构,以及一种在给定矩形内返回点数的方法.我似乎找不到一种算法来有效地找到最接近另一个给定点的点.我想念明显的东西吗?我认为递归解决方案是正确的方法吗? 在目标C中工作,但是伪代码可以.此外,我实际上是在存储LAT,长数据,并且点之间的距离沿着大圆圈. 编辑: 这是我的树插入和细分代码 - (BOOL)insert:(id)dataPoint { BOOL pointAdded = false; // If the point lies within the region if(CGRectContainsPoint(self.region, dataPoint.point)) { // If there are less than 4 points then add this point if(self.dataPoints
2 2024-01-23
编程技术问答社区
以最小的欧几里得距离识别点
我有n个维点的集合,我想找到最接近的2.我可以为2维度提出的最好的是: from numpy import * myArr = array( [[1, 2], [3, 4], [5, 6], [7, 8]] ) n = myArr.shape[0] cross = [[sum( ( myArr[i] - myArr[j] ) ** 2 ), i, j] for i in xrange( n ) for j in xrange( n ) if i != j ] print min( cross ) 给出 [8, 0, 1] 但对于大阵列来说太慢了.我可以采用什么样的优化? 相关: 在两个不同的numpy阵列中的点之间的欧几里得距离,不在 中 解决方案 尝试scipy.spatial.
0 2024-01-22
编程技术问答社区