Encuentre K-vecinos más cercanos en MATLAB

Ammar Ali 20 junio 2023
Encuentre K-vecinos más cercanos en MATLAB

Este tutorial analizará la búsqueda de los k-vecinos más cercanos utilizando la función knnsearch() en MATLAB.

Encuentre K-vecinos más cercanos usando knnsearch() en MATLAB

KNN, también conocido como k-vecinos más cercanos, es un algoritmo de clasificación utilizado para encontrar los k-vecinos más cercanos de un punto en un conjunto de datos. Por ejemplo, si tenemos un conjunto de datos que contiene los datos de pacientes de un hospital y queremos encontrar una persona cuya edad y peso se puedan adivinar.

Podemos pasar la edad y el peso de todos los pacientes presentes en el hospital y nuestra edad y peso adivinados de la persona que queremos encontrar en el algoritmo KNN, y devolverá los datos de los pacientes que son los más cercanos a la persona desconocida. Podemos usar la función knnsearch() de MATLAB para realizar la tarea anterior.

Tenemos que pasar la edad y el peso de los pacientes conocidos como primer argumento dentro de la función knnsearch() y la edad y el peso de una persona desconocida como segundo argumento. La función devolverá el índice o número de fila del conjunto de datos más cercano a nuestra persona desconocida.

Por ejemplo, usemos el conjunto de datos del hospital almacenado en MATLAB y busquemos a una persona desconocida según su edad y peso. Vea el código a continuación.

clc

load hospital;
X_data = [hospital.Age hospital.Weight];
Y_data = [30 162];
Ind = knnsearch(X_data,Y_data);
hospital(Ind,:)

Producción :

ans =

               LastName             Sex     Age    Weight    Smoker    BloodPressure      Trials
    HLE-603    {'HERNANDEZ'}        Male    36     166       false     120          83    {1×2 double}

En el código anterior, el conjunto de datos del hospital contiene el nombre, el sexo, la edad, el peso, la presión arterial y la información sobre el tabaquismo de 100 pacientes. Para ver el contenido del conjunto de datos, podemos abrirlo haciendo doble clic dentro de la ventana del espacio de trabajo.

En este ejemplo, solo usamos los parámetros de edad y peso porque solo conocemos esta información sobre la persona desconocida, pero también podemos usar otros parámetros.

El algoritmo KNN solo devolvió un vecino más cercano, pero también podemos establecer el número de vecinos más cercanos usando el argumento K y definir el número de vecinos más cercanos.

También podemos establecer el método utilizado para encontrar los vecinos más cercanos usando el argumento NSMethod y, después de eso, definir el nombre del método como euclidean, cityblock o chebyshev.

También podemos cambiar el método utilizado para encontrar la distancia entre puntos, que se establece en euclidiana por defecto utilizando el argumento Distancia; después de eso, podemos definir el nombre del método como seuclidiano, coseno o manzana.

Por defecto, el algoritmo KNN usa 50 puntos como nodos hoja, pero también podemos cambiarlo usando el argumento BucketSize y pasar el número de puntos. El algoritmo KNN crea grupos a partir de los datos proporcionados y, si aumentamos el tamaño del depósito, habrá menos grupos con más puntos.

Los índices devueltos por la función knnseach() están ordenados por defecto. Pero, también podemos obtener el orden original de los índices desactivando el proceso de clasificación usando el argumento SortIndices; después de eso, necesitamos pasar false.

Por ejemplo, cambiemos las propiedades discutidas anteriormente y veamos el resultado. Vea el código a continuación.

clc

load hospital;
X_data = [hospital.Age hospital.Weight hospital.Smoker];
Y_data = [30 162 true];
Ind = knnsearch(X_data,Y_data,'K',2,'NSMethod','euclidean','Distance','chebychev','SortIndices',false);
hospital(Ind,:)

Producción :

ans =

               LastName             Sex
    HLE-603    {'HERNANDEZ'}        Male
    VRH-620    {'MITCHELL' }        Male


               Age    Weight    Smoker
    HLE-603    36     166       false
    VRH-620    39     164       true


               BloodPressure
    HLE-603    120          83
    VRH-620    128          92


               Trials
    HLE-603    {1×2 double}
    VRH-620    {1×0 double}

En el código anterior, hemos incluido otro parámetro, Fumador, del conjunto de datos, teniendo en cuenta si sabemos que la persona desconocida es fumadora o no. Podemos ver en la salida que ahora hay dos pacientes que están cerca de los datos de la persona desconocida.

En los ejemplos anteriores, solo verificamos los vecinos más cercanos de una persona, pero también podemos encontrar los vecinos más cercanos de varias personas. Las propiedades anteriores pueden cambiar el resultado según el conjunto de datos.

La función knnsearch() encuentra los k-puntos más cercanos, pero si queremos encontrar todos los puntos más cercanos dentro de una distancia específica al punto dado, podemos usar la función rangesearch() en MATLAB. Consulte este enlace para obtener más detalles sobre la función rangesearch().

El problema con el uso de la función knnsearch() es que tomará algún tiempo en un gran conjunto de datos dependiendo de la máquina donde se ejecuta el código. Pero en el aprendizaje automático, queremos que nuestro código sea realmente rápido, por lo que dividimos el proceso en entrenamiento y prueba.

Entrenamos un modelo en el conjunto de datos dado en el proceso de entrenamiento, lo que lleva algún tiempo. Guardamos el modelo entrenado, y cuando queremos predecir la salida a partir de la entrada, podemos usar el modelo previamente entrenado para predecir el resultado en segundos.

Para entrenar un modelo usando el clasificador KNN, podemos usar la función fitcknn() para entrenar un modelo, y luego podemos usar la función predict() para predecir la salida de una nueva entrada.

Por ejemplo, usemos el conjunto de datos de flores para entrenar un modelo usando el clasificador KNN y luego la función predecir() para predecir la clase de flor. Vea el código a continuación.

clc

load fisheriris
X_data = meas;
Y_data = species;
MyModel = fitcknn(X_data,Y_data,'NumNeighbors',6,'Standardize',1)
X_new = 1;
class_name = predict(MyModel,X_new)

Producción :

MyModel =

  ClassificationKNN
             ResponseName: 'Y'
    CategoricalPredictors: []
               ClassNames: {'setosa'  'versicolor'  'virginica'}
           ScoreTransform: 'none'
          NumObservations: 150
                 Distance: 'euclidean'
             NumNeighbors: 6


  Properties, Methods


class_name =

  1×1 cell array

    {'versicolor'}

Los X_data contienen medidas de pétalos para 150 lirios de flores en el código anterior, y Y_data tiene el iris correspondiente o nombre de clase para los 150 lirios. Como podemos ver en la salida, el modelo incluye tres nombres de clase y 150 observaciones para cada clase, y el método utilizado para encontrar la distancia es euclidiano, y el número de vecinos es 6.

Usamos la función predict() para predecir el nombre de la clase usando la nueva observación, que es 1. También podemos usar múltiples observaciones creando un vector de columna de observaciones.

También podemos cambiar el método usado para encontrar los vecinos más cercanos, el método usado para encontrar la distancia entre puntos y el tamaño del cubo de la misma manera que los cambiamos en el caso de la función knnsearch().

También podemos obtener otros dos resultados de la función predecir(): la puntuación de predicción y el coste esperado del nombre de la clase. También podemos guardar el modelo que hemos entrenado usando el comando guardar y volver a cargarlo en cualquier momento usando el comando cargar en MATLAB.

El comando guardar creará un archivo .mat, que contendrá el modelo que entrenamos dentro del directorio actual de MATLAB, y si queremos volver a cargarlo, el archivo .mat debe estar presente en el directorio actual. utilizado por MATLAB.

La sintaxis básica para los comandos guardar y cargar se encuentra a continuación.

save model_name
load model_name

El primer argumento de entrada de la función fitcknn() es una tabla que contiene las observaciones, y el segundo argumento contiene los nombres de las clases que queremos predecir. Debe ser una matriz categórica, de cadena, lógica, numérica, de celda o de caracteres.

Consulte este enlace para obtener más detalles sobre la función fitcknn().

Autor: Ammar Ali
Ammar Ali avatar Ammar Ali avatar

Hello! I am Ammar Ali, a programmer here to learn from experience, people, and docs, and create interesting and useful programming content. I mostly create content about Python, Matlab, and Microcontrollers like Arduino and PIC.

LinkedIn Facebook

Artículo relacionado - MATLAB Function