我已成功实现了一种使用Fortune方法生成2维维度Voronoi图的方法.但是现在我正在尝试将它用于一个点的最近邻查询(这不是用于生成图的原始点之一).我一直看到人们说它可以在O(lg n)时间内完成(我相信它们),但我找不到它是如何实际完成的描述.
我熟悉二进制搜索,但我无法找出保证上限的良好标准.我也想过可能它可能与将点插入图表并更新周围的单元格有关,但不能思考(或找到)这样做的好方法.
任何人都可以提醒我,或指向一个描述更全面的地方?
在用于kd树的维基百科条目上,提出了一种用于在kd树上进行最近邻居搜索的算法.我不明白的是步骤3.2的解释.你怎么知道没有一个更接近的点只是因为搜索点的分裂坐标和当前节点之间的差异大于搜索点的分裂坐标与当前最佳点之间的差异?
最近邻搜索NN在2D中使用KD树搜索的动画
最近邻居(NN)算法旨在找到树中最接近给定输入点的点.通过使用树属性快速消除搜索空间的大部分,可以有效地完成此搜索.在kd树中搜索最近邻居的过程如下:
- 从根节点开始,算法以递归方式向下移动树,其方式与插入搜索点时相同(即,它向右或向左移动,具体取决于该点是大于还是小于当前节点.分裂维度).
- 一旦算法到达叶节点,它就将该节点保存为"当前最佳"
- 该算法展开树的递归,在每个节点执行以下步骤:1.如果当前节点比当前节点更接近,则它变为当前最佳节点.2.该算法检查在分裂平面的另一侧是否可能存在比当前最佳点更接近搜索点的任何点.在概念上,这通过使分裂超平面与搜索点周围的超球面相交来完成,该超球面具有等于当前最近距离的半径.由于超平面都是轴对齐的,因此将其实现为简单的比较,以查看搜索点的分割坐标与当前节点之间的差异是否小于从搜索点到当前最佳的距离(总坐标).1.如果超球面穿过平面,则在平面的另一侧可能存在更近的点,因此算法必须从当前节点向下移动树的另一个分支,寻找更近的点,遵循与之相同的递归过程.整个搜索.2.如果超球面不与分裂平面相交,则算法继续向上走树,并且消除该节点另一侧的整个分支.
- 当算法完成根节点的此过程时,搜索完成.
通常,算法使用平方距离进行比较以避免计算平方根.另外,它可以通过在变量中保持平方电流最佳距离来进行比较来节省计算.
是否有人知道在Python中实现的最近邻居算法可以逐步更新?我发现的所有这些,例如这个,似乎都是批处理过程.是否可以实现增量NN算法?
在立方体盒子里,我在R ^ 3中有一个大的收集点.我想为每个点找到k个最近邻居.通常我认为使用类似kd树的东西,但在这种情况下我有周期性的边界条件.据我了解,kd树的工作原理是通过将空间切割成一个较小维度的超平面来划分空间,即在3D中我们将通过绘制2D平面来分割空间.对于任何给定的点,它可以在平面上,在它上面,也可以在它下面.但是,当您使用周期性边界条件分割空间时,可以认为点在两侧!
在R ^ 3中找到并维护具有周期性边界条件的最近邻居列表的最有效方法是什么?
近似是不够的,这些点只能一次移动一个(想想蒙特卡罗而不是N体模拟).
我有一个使用精灵表动画的精灵.他只有16x16,但是我希望能够将它扩展到64x64左右的所有像素优点!

结果很糟糕,当然浏览器反锯齿它.:/
谢谢!
编辑:不需要CSS,这是我的绘图功能.
function drawSprite(offsetx:number,offsety:number,posx:number,posy:number){
ctx.drawImage(img, offsetx*32, offsety*32, 32, 16, posx*32, posy*8, 128, 32);
}
Run Code Online (Sandbox Code Playgroud)
天儿真好
我正在尝试编写一种智能方法来找到沿轮廓点的最近点网格点.
网格是一个2维网格,存储在x和y(它包含网格单元的x和y公里位置).
轮廓是由x和y位置组成的线,不一定是规则间隔的.
如下所示 - 红点是网格,蓝点是轮廓上的点.如何找到最接近每个蓝点的红点的索引?
编辑 - 我应该提到网格是纬度/经度网格,是一个非常接近南极的区域.因此,点(红点)是距离南极的米的位置(使用极坐标立体图).由于网格是地理网格,因此网格间距不相等 - 由于高纬度地区的扭曲,形状单元格略有不同(红点定义了单元格的顶点).结果是我不能只找到x和y矩阵的哪一行/列最接近输入点坐标 - 与常规网格不同meshgrid,行和列中的值会有所不同......
干杯戴夫
所以我有一个已经编写的迭代最近点(ICP)算法,它将模型拟合到点云.对于那些不知道ICP的人来说,快速教程是一个简单的算法,它适合模型的点,最终在模型和点之间提供均匀的变换矩阵.
这是一个快速图片教程.
步骤1.在模型集中找到与数据集最近的点:
第2步:使用一堆有趣的数学(有时基于渐变下降或SVD)将云拉得更近并重复直到形成一个姿势:
![图2] [2]
现在这一点很简单并且有效,我想要帮助的是: 我如何判断我的姿势是否合适?
所以目前我有两个想法,但它们有点像hacky:
ICP算法中有多少个点.也就是说,如果我几乎没有点,我认为姿势会很糟糕:
但如果姿势实际上好呢?它可能是,即使只有几点.我不想拒绝好姿势:

所以我们在这里看到的是,如果低点在正确的位置,它们实际上可以成为一个非常好的位置.
因此,调查的另一个指标是提供的点与使用点的比率.这是一个例子

现在我们排除了距离太远的点,因为它们将是异常值,现在这意味着我们需要一个良好的起始位置让ICP工作,但我对此感到满意.现在在上面的例子中,保证会说NO,这是一个不好的姿势,这是正确的,因为包括点与点的比例是:
2/11 < SOME_THRESHOLD
Run Code Online (Sandbox Code Playgroud)
这很好,但在上面显示的三角形颠倒的情况下会失败.它会说倒三角形是好的,因为所有的点都被ICP使用.
你并不需要是对ICP的专家来回答这个问题,我期待的好点子.利用这些要点的知识,我们如何分类它是否是一个好的姿势解决方案?
同时使用这两种解决方案是一个很好的建议,但如果你问我这是一个非常蹩脚的解决方案,非常愚蠢到只是为了达到它的门槛.
关于如何做到这一点有什么好主意?
PS.如果你想添加一些代码,请继续.我在c ++工作.
PPS.有人帮我标记这个问题,我不确定它应该落在哪里.
假设我们有以下查找表
| 1.23 2.63 4.74 6.43 5.64
-------|--------------------------------------
-------|--------------------------------------
2.56 | 0 0 1 0 1
4.79 | 0 1 1 1 0
6.21 | 1 0 0 0 0
Run Code Online (Sandbox Code Playgroud)
该表包含标签矩阵(仅具有0和1s),x值和y值.如何为这个查找表进行最近邻插值?
例:
Input: (5.1, 4.9)
Output: 1
Input: (3.54, 6.9)
Output: 0
Run Code Online (Sandbox Code Playgroud) 我使用Haskell实现了一个简单的L1距离计算器.由于我对性能感兴趣,因此我使用未装箱的矢量来存储要比较的图像.
calculateL1Distance :: LabeledImage -> LabeledImage -> Int
calculateL1Distance reference test =
let
substractPixels :: Int -> Int -> Int
substractPixels a b = abs $ a - b
diff f = Vec.sum $ Vec.zipWith substractPixels (f reference) (f test)
in
diff pixels
Run Code Online (Sandbox Code Playgroud)
据我所知(我是Haskell的新手),流融合应该使这个代码作为一个简单的循环运行.所以它应该很快.但是,编译时性能结果很低
ghc -O -fforce-recomp -rtsopts -o test .\performance.hs
Run Code Online (Sandbox Code Playgroud)
该计划耗时约60秒:
198,871,911,896 bytes allocated in the heap
1,804,017,536 bytes copied during GC
254,900,000 bytes maximum residency (14 sample(s))
9,020,888 bytes maximum slop
579 MB total memory in use (0 …Run Code Online (Sandbox Code Playgroud) optimization performance haskell nearest-neighbor stream-fusion
我是新来的机器学习,想建立使用一个小样本k-nearest-Neighbor-method与Python的库Scikit。
转换和拟合数据可以很好地工作,但是我无法弄清楚如何绘制一个显示数据点被“邻居”包围的图形。
我正在使用的数据集如下所示:
从我的理解,我得到一个数组,显示euclidean-distances所有数据点,使用kneighbors_graph从Scikit。因此,我的第一个尝试是“简单地”绘制从该方法得到的矩阵。像这样:
def kneighbors_graph(self):
self.X_train = self.X_train.values[:10,] #trimming down the data to only 10 entries
A = neighbors.kneighbors_graph(self.X_train, 9, 'distance')
plt.spy(A)
plt.show()
Run Code Online (Sandbox Code Playgroud)
因此,我试图调整您可以在有关ScikitIris_dataset的每个页面上找到的示例。不幸的是,它仅使用两个功能,因此它并不是我想要的,但我仍然希望至少获得第一个输出:
def plot_classification(self):
h = .02
n_neighbors = 9
self.X = self.X.values[:10, [1,4]] #trim values to 10 entries and only columns 2 and 5 (indices 1, 4)
self.y = self.y[:10, ] #trim outcome column, too
clf = neighbors.KNeighborsClassifier(n_neighbors, …Run Code Online (Sandbox Code Playgroud) nearest-neighbor ×10
python ×3
algorithm ×2
c++ ×1
canvas ×1
haskell ×1
html5 ×1
javascript ×1
kdtree ×1
matlab ×1
numpy ×1
optimization ×1
performance ×1
plot ×1
scikit-learn ×1
scipy ×1
sprite ×1
voronoi ×1