Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
verilog中的k近邻算法_Verilog_Fpga_Knn_Euclidean Distance_Vlsi - Fatal编程技术网

verilog中的k近邻算法

verilog中的k近邻算法,verilog,fpga,knn,euclidean-distance,vlsi,Verilog,Fpga,Knn,Euclidean Distance,Vlsi,我计划做KNN的verilog实现。但问题是与KNN相关的欧几里德距离测量项,因为它需要减法、平方法和加法。我想,当我用欧几里德距离编码knn时,代码会变得复杂。有没有简单的方法(硬件友好)来寻找距离,这样代码的复杂度以及合成电路的复杂度都会降低。我的想法是将码本存储在内存中,当我们输入时,将生成k个最近邻索引作为输出。查找k个最近邻涉及两部分:1)计算输入向量和每个参考向量之间的距离,2)查找k个最小距离 对于第1部分),可以设计由减法器、乘法器和累加器组成的流水线欧几里德距离函数。与乘法相比

我计划做KNN的verilog实现。但问题是与KNN相关的欧几里德距离测量项,因为它需要减法、平方法和加法。我想,当我用欧几里德距离编码knn时,代码会变得复杂。有没有简单的方法(硬件友好)来寻找距离,这样代码的复杂度以及合成电路的复杂度都会降低。我的想法是将码本存储在内存中,当我们输入时,将生成k个最近邻索引作为输出。

查找k个最近邻涉及两部分:1)计算输入向量和每个参考向量之间的距离,2)查找k个最小距离

对于第1部分),可以设计由减法器、乘法器和累加器组成的流水线欧几里德距离函数。与乘法相比,减法和累加(加法)需要相对较小的时钟周期。根据比特宽度的不同,也可能值得对其进行管道化处理。单周期乘法器需要极高的时钟周期,因此它肯定必须采用流水线

这里我假设你在处理整数;如果您必须使用浮点运算,那么您就不走运了,因为浮点乘法和加法由于分支不同而无法流水线进行

对于第2部分),您必须比较所有距离以找到最小的k。这可以通过几种方式实现;一种可能的方法是使用比较器树来查找单个最小距离。找到后,可以从距离集中删除该距离并重复k次


注意,对于第1部分,您基本上实现了CPU/GPU的功能单元;这几乎肯定会比您的Verilog实现更快。在CPU/GPU上最大的改进是第2部分)找到k最小距离

合成工具能够合成加法、减法、乘法和二次幂运算。所以一个简单的(xx-yy)可能是可合成的。你试过了吗?根据你的确切问题,你也可以考虑其他非欧几里德规范。特别是l1(“出租车”)规范可能适用于某些情况,并且计算更简单,尤其是当数据具有高维度时。然而,我的感觉是,实际算法(特别是按距离排序)在Verilog中要比欧几里德范数的乘积之和更难有效地实现。