k-NN计算复杂度


18

采用朴素搜索方法(无kd树或类似树)的k -NN算法的时间复杂度是多少?

我也考虑到超参数k对其时间复杂度感兴趣。我发现矛盾的答案:

  1. O(nd + kn),其中n是训练集的基数,d是每个样本的维数。[1]

  2. O(ndk),这里n又是训练集的基数,d是每个样本的维数。[2]

[1] http://www.csd.uwo.ca/courses/CS9840a/Lecture2_knn.pdf(第18/20页)

[2] http://www.cs.haifa.ac.il/~rita/ml_course/lectures/KNN.pdf(第18/31页)

Answers:


20

假设是固定的(就像两个链接的讲座一样),那么您的算法选择将确定您的计算需要O n d + k n 运行时还是O n d k 运行时。kO(nd+kn)O(ndk)

首先,让我们考虑一个运行时算法:O(nd+kn)

  • 初始化的所有观测值在训练组中selectedi=0i
  • 对于每个训练集观测值,计算d i s t i,即从新观测值到训练集观测值i的距离idistii
  • 对于ķ:循环遍历所有训练组观察,选择索引具有最小d 小号值和其š é Ê Ç Ë d = 0。通过设置选择该观察小号Ë Ê Ç Ë d = 1j=1kidistiselectedi=0selectedi=1
  • 返回选定的索引k

每个距离计算都需要运行时,因此第二步需要O n d 运行时。对于第三步中的每个迭代,我们通过遍历训练集观察值来执行O n 工作,因此该步骤总体上需要O n k 工作。第一步和第四步只需要O n 工作,因此我们得到O n d + k n 运行时。O(d)O(nd)O(n)O(nk)O(n)O(nd+kn)

现在,让我们考虑一个运行时算法:O(ndk)

  • 初始化的所有观测值在训练组中selectedi=0i
  • 对于k:遍历所有训练集观测值,并计算所选训练集观测值与新观测值之间的距离d。选择索引具有最小d值,对于这个小号Ë Ê Ç Ë d = 0。通过设置选择该观察小号Ë Ê Ç Ë d = 1j=1kdidselectedi=0selectedi=1
  • 返回选定的索引k

对于第二步中的每个迭代,我们计算新观测值与每个训练集观测值之间的距离,需要进行迭代,因此总体上需要O n d k )进行工作。O(nd)O(ndk)

两种算法之间的区别在于,第一种算法预先计算并存储距离(需要额外的内存),而第二种算法则不需要。然而,因为我们已经存储整个训练集,要求ø ñ d 存储器,以及所述小号ë Ê Ç ë d矢量,要求Ô Ñ 存储,两种算法的存储是渐近的相同。结果,k > 1的更好渐近运行时间使第一种算法更具吸引力。O(n)O(nd)selectedO(n)k>1

值得注意的是,可以使用算法改进来获得运行时:O(nd)

  • 对于每个训练集观测值,计算d i s t i,即从新观测值到训练集观测值i的距离idistii
  • 运行快速选择算法以计算O n 运行时的最小距离kthO(n)
  • 返回不大于计算的最小距离的所有索引kth

该方法利用以下事实:存在有效的方法以在未排序的数组中找到最小值。kth


1
很好的答案,我特别喜欢使用quickselect
usεr11852恢复单胞菌说,

另一个问题:对于第三个选项,我认为时间复杂度应为O(nd + k),因为您仍必须计算k个最近邻居中最常见的标签才能发出预测,对不对?
DanielLópez'16

@Daniel由于ø Ñ d + ķ 是一样的ø ñ d knO(nd+k)O(nd)
josliber

上次我打扰您:尝试确定我正在处理的k -NN 的修改版本的计算复杂度,得到以下结果: O(nd + nd / p) 其中,ndp定义为大于零。我可以简化为O(nd)吗?
丹尼尔·洛佩斯

@Daniel是的,在这种情况下,有效。O(nd)
josliber
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.