Finden Sie K-nächste Nachbarn in MATLAB

Ammar Ali 20 Juni 2023
Finden Sie K-nächste Nachbarn in MATLAB

Dieses Tutorial behandelt das Finden der k-nächsten Nachbarn mit der Funktion knnsearch() in MATLAB.

Finde K-nächste Nachbarn mit knnsearch() in MATLAB

KNN, auch bekannt als k-nächste Nachbarn, ist ein Klassifizierungsalgorithmus, der verwendet wird, um die k-nächsten Nachbarn eines Punkts in einem Datensatz zu finden. Zum Beispiel, wenn wir einen Datensatz haben, der die Daten von Krankenhauspatienten enthält, und wir eine Person finden möchten, deren Alter und Gewicht erraten werden kann.

Wir können das Alter und Gewicht aller im Krankenhaus anwesenden Patienten und unser geschätztes Alter und Gewicht der Person, die wir finden möchten, an den KNN-Algorithmus übergeben, und er gibt die Patientendaten zurück, die der unbekannten Person am nächsten kommen. Wir können die Funktion knnsearch() von MATLAB verwenden, um die obige Aufgabe zu erledigen.

Wir müssen das Alter und Gewicht bekannter Patienten als erstes Argument innerhalb der Funktion knnsearch() übergeben und das Alter und Gewicht einer unbekannten Person als zweites Argument. Die Funktion gibt den Index oder die Zeilennummer aus dem Datensatz zurück, der unserer unbekannten Person am nächsten liegt.

Lassen Sie uns zum Beispiel den in MATLAB gespeicherten Krankenhausdatensatz verwenden und anhand seines Alters und Gewichts nach einer unbekannten Person suchen. Siehe Code unten.

clc

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

Ausgang:

ans =

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

Im obigen Code enthält der Krankenhausdatensatz den Namen, das Geschlecht, das Alter, das Gewicht, den Blutdruck und die Raucherinformationen von 100 Patienten. Um den Inhalt des Datensatzes anzuzeigen, können wir ihn öffnen, indem wir ihn im Arbeitsbereichsfenster doppelklicken.

In diesem Beispiel haben wir nur die Parameter Alter und Gewicht verwendet, weil wir diese Informationen nur über die unbekannte Person kennen, aber wir können auch andere Parameter verwenden.

Der KNN-Algorithmus hat nur einen nächsten Nachbarn zurückgegeben, aber wir können die Anzahl der nächsten Nachbarn auch mit dem Argument K festlegen und die Anzahl der nächsten Nachbarn definieren.

Wir können auch die Methode festlegen, die verwendet wird, um die nächsten Nachbarn zu finden, indem wir das Argument NSMethod verwenden und danach den Methodennamen wie euklidisch, Stadtblock oder Tschebyschew definieren.

Wir können auch die Methode ändern, die verwendet wird, um den Abstand zwischen Punkten zu finden, der standardmäßig auf euklidisch eingestellt ist, indem das Argument Entfernung verwendet wird; Danach können wir den Namen der Methode wie seuclidean, cosine oder cityblock definieren.

Standardmäßig verwendet der KNN-Algorithmus 50 Punkte als Blattknoten, aber wir können dies auch mit dem Argument BucketSize ändern und die Anzahl der Punkte übergeben. Der KNN-Algorithmus erstellt Cluster aus den gegebenen Daten, und wenn wir die Bucket-Größe erhöhen, gibt es weniger Cluster mit mehr Punkten.

Die von der Funktion knnsearch() zurückgegebenen Indizes sind standardmäßig sortiert. Aber wir können auch die ursprüngliche Reihenfolge der Indizes erhalten, indem wir den Sortierprozess mit dem Argument SortIndices ausschalten; danach müssen wir false übergeben.

Lassen Sie uns beispielsweise die oben besprochenen Eigenschaften ändern und das Ergebnis anzeigen. Siehe Code unten.

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,:)

Ausgang:

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}

In den obigen Code haben wir einen weiteren Parameter, Smoker, aus dem Datensatz aufgenommen, um zu prüfen, ob wir wissen, dass die unbekannte Person ein Raucher ist oder nicht. Wir können in der Ausgabe sehen, dass es jetzt zwei Patienten gibt, die den Daten der unbekannten Person nahe kommen.

In den obigen Beispielen haben wir nur die nächsten Nachbarn einer Person überprüft, aber wir können auch die nächsten Nachbarn mehrerer Personen finden. Die oben genannten Eigenschaften können das Ergebnis je nach Datensatz ändern.

Die Funktion knnsearch() findet die k-nächsten Punkte, aber wenn wir alle nächsten Punkte innerhalb einer bestimmten Entfernung zum angegebenen Punkt finden möchten, können wir die Funktion rangesearch() in MATLAB verwenden. Überprüfen Sie diesen Link für weitere Details über die Funktion rangesearch().

Das Problem bei der Verwendung der Funktion knnsearch() besteht darin, dass dies bei einem großen Datensatz je nach Maschine, auf der der Code ausgeführt wird, einige Zeit in Anspruch nimmt. Aber beim maschinellen Lernen wollen wir, dass unser Code wirklich schnell ist, also teilen wir den Prozess in Training und Test auf.

Im Trainingsprozess trainieren wir ein Modell auf dem gegebenen Datensatz, was einige Zeit in Anspruch nimmt. Wir speichern das trainierte Modell, und wenn wir die Ausgabe von der Eingabe vorhersagen möchten, können wir das vorab trainierte Modell verwenden, um das Ergebnis in Sekunden vorherzusagen.

Um ein Modell mit dem KNN-Klassifikator zu trainieren, können wir die Funktion fitcknn() verwenden, um ein Modell zu trainieren, und dann können wir die Funktion predict() verwenden, um die Ausgabe für neue Eingaben vorherzusagen.

Lassen Sie uns beispielsweise den Blumen-Datensatz verwenden, um ein Modell mit dem KNN-Klassifikator zu trainieren, und dann die Funktion predict(), um die Blumenklasse vorherzusagen. Siehe Code unten.

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)

Ausgang:

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'}

Die X_data enthält Blütenblattmessungen für 150 Iris von Blumen im obigen Code, und Y_data hat den entsprechenden Iris- oder Klassennamen für die 150 Iris. Wie wir in der Ausgabe sehen können, enthält das Modell drei Klassennamen und 150 Beobachtungen für jede Klasse, und die zum Ermitteln der Entfernung verwendete Methode ist euklidisch, und die Anzahl der Nachbarn beträgt 6.

Wir haben die Funktion predict() verwendet, um den Klassennamen anhand der neuen Beobachtung, die 1 ist, vorherzusagen. Wir können auch mehrere Beobachtungen verwenden, indem wir einen Spaltenvektor von Beobachtungen erstellen.

Wir können auch die Methode zum Finden der nächsten Nachbarn, die Methode zum Finden des Abstands zwischen Punkten und die Bucket-Größe auf die gleiche Weise ändern, wie wir sie im Fall der Funktion knnsearch() geändert haben.

Wir können auch zwei andere Ausgaben von der Funktion predict() erhalten: die Vorhersagepunktzahl und die erwarteten Kosten des Klassennamens. Wir können das trainierte Modell auch mit dem save-Befehl speichern und jederzeit mit dem load-Befehl in MATLAB wieder laden.

Der Speicherbefehl erstellt eine .mat-Datei, die das Modell enthält, das wir im aktuellen Verzeichnis von MATLAB trainiert haben, und wenn wir es zurückladen möchten, sollte die .mat-Datei im aktuellen Verzeichnis vorhanden sein von MATLAB verwendet.

Die grundlegende Syntax für die Befehle Speichern und Laden ist unten aufgeführt.

save model_name
load model_name

Das erste Eingabeargument der Funktion fitcknn() ist eine Tabelle mit den Beobachtungen, und das zweite Argument enthält die Klassennamen, die wir vorhersagen möchten. Es sollte ein kategorisches, Zeichenfolgen-, logisches, numerisches, Zellen- oder Zeichenarray sein.

Überprüfen Sie diesen Link für weitere Details über die Funktion 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

Verwandter Artikel - MATLAB Function