假设是固定的(就像两个链接的讲座一样),那么您的算法选择将确定您的计算需要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 我 = 1。j=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 我 = 1。j=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
quickselect
。