k-NN вычислительная сложность


18

Какова временная сложность алгоритма k -NN с наивным поисковым подходом (без дерева kd или подобных)?

Меня интересует его временная сложность, учитывая также гиперпараметр 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)

Ответы:


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
  • При до K : цикл по всем обучающей выборки наблюдений, выбирая индекс я с наименьшим д я сек т я значение , и для которых ев е л е с т е д я = 0 . Выберите это наблюдение, установив с й л е с т е д я = 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 между выбранным наблюдением обучающего набора и новым наблюдением. Выберите индекс я с наименьшим г значения , при котором с е л е с т е д я = 0 . Выберите это наблюдение, установив с й л е с т е д я = 1 .j=1kdidselectedi=0selectedi=1
  • Вернуть выбранных индексовk

Для каждой итерации на втором шаге мы вычисляем расстояние между новым наблюдением и каждым наблюдением обучающего набора, требуя работы для итерации и, следовательно, O ( n d k ) работы в целом.O(nd)O(ndk)

Разница между этими двумя алгоритмами заключается в том, что первый предварительно вычисляет и сохраняет расстояния (требуя дополнительной памяти), а второй - нет. Однако, учитывая , что мы уже хранить весь набор обучения, требующий вывод ( п d ) память, а также с й л е с т е д вектор, требующий O ( п ) хранением, хранение двух алгоритмов асимптотический одна и та же. В результате, лучшее асимптотическое время выполнения для 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 говорит восстановить Monic

Еще один вопрос: для третьего варианта я считаю, что временная сложность должна быть O (nd + k), поскольку вам все еще нужно вычислить наиболее распространенную метку среди k-ближайших соседей, чтобы выдать прогноз, верно?
Даниэль Лопес

@Daniel Поскольку , O ( n d + k ) совпадает с O ( n d ) . knO(nd+k)O(nd)
josliber

В прошлый раз, когда я беспокою вас: пытаясь определить вычислительную сложность модифицированной версии k -NN, над которой я работаю, я получаю следующее: O (nd + nd / p) Где по определению n , d и p являются целыми числами, большими чем нуль. Могу ли я упростить это до O (nd) ?
Даниэль Лопес

@ Даниель Да, в этом случае работает. O(nd)
josliber
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.