verilog中的k-最近邻算法

时间:2014-01-30 17:19:43

标签: verilog fpga knn euclidean-distance vlsi

我打算做KNN的verilog实现。但问题是与KNN相关的欧氏距离测量项,因为它需要减法,平方,加法。我认为,当我用欧氏距离编码时,代码将变得复杂。有任何简单的方法(硬件友好)来找到距离,因此代码的复杂性和因此合成电路的复杂性将降低。我的想法是将代码簿存储在内存中,当我们提供输入时,将生成k个最近邻居索引作为输出。

1 个答案:

答案 0 :(得分:1)

找到k-最近邻居包括两部分:1)计算输入向量与每个参考向量之间的距离和2)找出k个最小距离。

对于第1部分,您可以设计一个由减法器,乘法器和累加器组成的流水线欧几里德距离函数。减法和累加(加法)相对于乘法需要相对较小的时钟周期。根据位宽,也可能值得管道。单周期乘法器需要一个非常高的时钟周期,所以它肯定必须是流水线的。

在这里,我假设你正在使用整数;如果你必须使用浮点运算,那么你运气不好,因为浮点乘法和加法由于它们的分支分歧而无法流水线化。

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

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