Complejidad computacional k-NN

18

¿Cuál es la complejidad temporal del algoritmo k -NN con un enfoque de búsqueda ingenuo (sin árbol kd o similares)?

Estoy interesado en su complejidad temporal considerando también el hiperparámetro k . He encontrado respuestas contradictorias:

  1. O (nd + kn), donde n es la cardinalidad del conjunto de entrenamiento yd la dimensión de cada muestra. [1]

  2. O (ndk), donde nuevamente n es la cardinalidad del conjunto de entrenamiento yd la dimensión de cada muestra. [2]

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

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

Daniel López
fuente

Respuestas:

20

Suponiendo que es fijo (como lo hacen las dos conferencias vinculadas), sus elecciones algorítmicas determinarán si su cálculo toma tiempo de ejecución O ( n d + k n ) u tiempo de ejecución O ( n d k ) .kO(nd+kn)O(ndk)

Primero, consideremos un algoritmo de tiempo de ejecución :O(nd+kn)

  • Inicialice para todas las observaciones i en el conjunto de entrenamientoselectedi=0i
  • Para cada observación del conjunto de entrenamiento , calcule d i s t i , la distancia desde la nueva observación hasta la observación del conjunto de entrenamiento iidistii
  • Para a k : recorrer todas las observaciones del conjunto de entrenamiento, seleccionando el índice i con el valor d i s t i más pequeño y para el cual s e l e c t e d i = 0 . Seleccione esta observación configurando s e l e c t e d i = 1 .j=1kidistiselectedi=0selectedi=1
  • Devuelve los índices seleccionadosk

Cada cálculo de distancia requiere tiempo de ejecución , por lo que el segundo paso requiere tiempo de ejecución O ( n d ) . Para cada iteración en el tercer paso, realizamos el trabajo O ( n ) recorriendo las observaciones del conjunto de entrenamiento, por lo que el paso general requiere el trabajo O ( n k ) . Los pasos primero y cuarto solo requieren trabajo O ( n ) , por lo que obtenemos un tiempo de ejecución O ( n d + k n ) .O(d)O(nd)O(n)O(nk)O(n)O(nd+kn)

Ahora, consideremos un algoritmo de tiempo de ejecución :O(ndk)

  • Inicialice para todas las observaciones i en el conjunto de entrenamientoselectedi=0i
  • Para a k : recorra todas las observaciones del conjunto de entrenamiento y calcule la distancia d entre la observación del conjunto de entrenamiento seleccionado y la nueva observación. Seleccione el índice i con el valor d más pequeño para el cual s e l e c t e d i = 0 . Seleccione esta observación configurando s e l e c t e d i = 1 .j=1kdidselectedi=0selectedi=1
  • Devuelve los índices seleccionadosk

Para cada iteración en el segundo paso, calculamos la distancia entre la nueva observación y cada observación del conjunto de entrenamiento, lo que requiere trabajar para una iteración y, por lo tanto, O ( n d k ) trabajar en general.O(nd)O(ndk)

La diferencia entre los dos algoritmos es que el primero calcula previamente y almacena las distancias (que requieren memoria adicional), mientras que el segundo no. Sin embargo, dado que ya almacenamos todo el conjunto de entrenamiento, que requiere memoria O ( n d ) , así como el vector s e l e c t e d , que requiere almacenamiento O ( n ) , el almacenamiento de los dos algoritmos es asintóticamente el mismo. Como resultado, el mejor tiempo de ejecución asintótico para k > 1 hace que el primer algoritmo sea más atractivo.O(n)O(nd)selectedO(n)k>1

Vale la pena señalar que es posible obtener un tiempo de ejecución utilizando una mejora algorítmica:O(nd)

  • Para cada observación del conjunto de entrenamiento , calcule d i s t i , la distancia desde la nueva observación hasta la observación del conjunto de entrenamiento iidistii
  • Ejecute el algoritmo de selección rápida para calcular la distancia más pequeña en tiempo de ejecución O ( n )kthO(n)
  • Devuelve todos los índices no mayores que la distancia calculada más pequeñakth

Este enfoque aprovecha el hecho de que existen enfoques eficientes para encontrar el valor más pequeño de en una matriz sin clasificar.kth

josliber
fuente
1
Gran respuesta y especialmente me gustan los consejos sobre el uso de quickselect.
usεr11852 dice Reinstate Monic
Una pregunta más: para la tercera opción, creo que la complejidad del tiempo debería ser O (nd + k), ya que todavía tienes que calcular la etiqueta más común entre los vecinos k más cercanos para emitir una predicción, ¿verdad?
Daniel López
@Daniel Dado que , O ( n d + k ) es lo mismo que O ( n d ) . knO(nd+k)O(nd)
josliber
La última vez que te molesté: tratando de determinar la complejidad computacional de una versión modificada de k -NN en la que estoy trabajando, obtengo lo siguiente: O (nd + nd / p) Donde, por definición , n , d y p son enteros mayores que cero. ¿Puedo simplificar eso a O (nd) ?
Daniel López
O(nd)