Ich möchte über ähnliche Bilder schreiben, aber zuerst aus der Erklärung der K-NN-Methode.
Identifizieren Sie aus k Daten, die sich in der Nähe bestimmter Daten befinden.
Diejenigen mit einer großen Anzahl werden als dieselbe Klasse wie die Datenklasse beurteilt.
ex)
Wenn k = 3 ist, wird es als eine Gruppe von Dreiecken angesehen, da es ein Quadrat und zwei Dreiecke gibt.
Wenn k = 5 ist, gibt es 3 Quadrate und 2 Dreiecke, daher wird es als eine Gruppe von Quadraten betrachtet.

Je nachdem, welches k Sie nehmen, ist die Lösung unterschiedlich, daher müssen Sie ein geeignetes k finden. Verwenden Sie die Kreuzvalidierung, um den Generalisierungsfehler für jedes k zu ermitteln, und legen Sie den kleinsten als optimales k fest. Generalisierungsfehler (= Fehler aus tatsächlichen Ergebnissen basierend auf Testdaten) Das Durchführen all dieser Berechnungen für jedes k würde eine große Verarbeitungszeit erfordern, wenn die Vektorkonvertierung unter Verwendung von Bildern durchgeführt wird. Daher die ungefähre Suche nach dem nächsten Nachbarn.
Auch wenn die nächste Nachbarschaft weit entfernt ist, ist sie erlaubt und adoptiert. d(q,x) <= (1+ε)d(q,x)* Abstand wobei d (q, x) die ungefähre Lösung ist Abstand zum nächsten d (q, x *)
Die ungefähre Lösung wird durch die beste Suche bestimmt Die beste Suche ist ein Suchalgorithmus, der den wünschenswertesten Knoten für die nächste Suche nach bestimmten Regeln auswählt.
 # Versuchen Sie, die Probe zu bewegen
 Verwenden Sie den Iris-Datensatz als Datensatz.
# Versuchen Sie, die Probe zu bewegen
 Verwenden Sie den Iris-Datensatz als Datensatz.
python
pip install annoy scikit-learn
python
from collections import Counter
from sklearn import datasets
from annoy import AnnoyIndex
from sklearn.base import BaseEstimator
from sklearn.base import ClassifierMixin
from sklearn.model_selection import StratifiedKFold
from sklearn.model_selection import cross_validate
from sklearn.utils import check_X_y
from sklearn.utils import check_array
class AnnoyClassifier(BaseEstimator, ClassifierMixin):
    #Dies ist die Leber.
    def __init__(self, n_trees, metric='angular', n_neighbors=1, search_k=-1):
        # k-Anzahl d Bäume
        self.n_trees_ = n_trees
        #Für die Berechnung verwendete Entfernung
        self.metric_ = metric
        #Anzahl der Nachbarn
        self.n_neighbors_ = n_neighbors
        #Für die Genauigkeit verwendete Parameter
        self.search_k_ = search_k
        #Modell-
        self.clf_ = None
        #Fügen Sie ein Klassenetikett für Trainingsdaten hinzu
        self.train_y_ = None
    def fit(self, X, y):
        #Eingabeteil
        check_X_y(X, y)
        #Speichern Sie die Klassenbezeichnung der Trainingsdaten
        self.train_y_ = y
        #Bereiten Sie ein Modell von Annoy vor
        self.clf_ = AnnoyIndex(X.shape[1], metric=self.metric_)
        #Lernen
        for i, x in enumerate(X):
            self.clf_.add_item(i, x)
        # k-d Baumteil
        self.clf_.build(n_trees=self.n_trees_)
        return self
    def predict(self, X):
        check_array(X)
        #Gibt das Ergebnis zurück
        y_pred = [self._predict(x) for x in X]
        return y_pred
    def _predict(self, x):
        #Finde eine Nachbarschaft
        neighbors = self.clf_.get_nns_by_vector(x, self.n_neighbors_, search_k=self.search_k_)
        #Index in Klassenbezeichnung konvertieren
        neighbor_classes = self.train_y_[neighbors]
        #Extrahieren Sie den häufigsten Wert
        counter = Counter(neighbor_classes)
        most_common = counter.most_common(1)
        #Gibt die häufigste Klassenbezeichnung zurück
        return most_common[0][0]
    def get_params(self, deep=True):
        #Klassifikatorparameter
        return {
            'n_trees': self.n_trees_,
            'metric': self.metric_,
            'n_neighbors': self.n_neighbors_,
            'search_k': self.search_k_,
        }
def main():
    #Laden Sie den Iris-Datensatz
    dataset = datasets.load_iris()
    X, y = dataset.data, dataset.target
    #Sorter
    clf = AnnoyClassifier(n_trees=10)
    # 3-fold CV
    skf = StratifiedKFold(n_splits=3, shuffle=True, random_state=42)
    #Messen Sie die Generalisierungsleistung anhand der Genauigkeit als Bewertungsindex
    score = cross_validate(clf, X, y, cv=skf, scoring='accuracy')
    mean_test_score = score.get('test_score').mean()
    print('acc:', mean_test_score)
if __name__ == '__main__':
    main()
Ergebnis
python
acc: 0.98
[Maschinelles Lernen_k Nachbarschaft Methodentheorie] (https://dev.classmethod.jp/machine-learning/2017ad_20171218_knn/#sec4)
Recommended Posts