Как обучить KNN (cv :: ml :: KNearest) более одного раза без переопределения? - PullRequest
2 голосов
/ 05 августа 2020

Я создаю приложение для компьютерного зрения в реальном времени, и для этого проекта я хочу использовать хорошо известный алгоритм KNN (K-Nearest Neighbours) довольно необычным способом. Мне нужно управлять входящим потоком данных (который можно описать как точки с метками), поэтому моя идея состоит в том, чтобы передать в KNN данные, которые у меня есть на данный момент, запросить классификацию некоторых неизвестных точек. И когда появятся новые данные, обновите KNN этими новыми данными и повторите снова и снова. В общем, я буду повторно тренировать KNN сотни раз, каждый раз на несколько (менее 5) баллов больше.

Я использую python (3.8.3) с OpenCV (4.1.3 ) для всего проекта, и в будущем мне нужно будет преобразовать все в C ++, поэтому я надеюсь найти решение с этими технологиями.

У меня проблемы с cv::ml::KNearest, который позволяет Мне нужно обучить модель, но каждое обучение полностью игнорирует предыдущее обучение и забывает данные, поэтому я не могу «обновить KNN». Как я могу это решить?

  1. В OpenCV (2.4) был параметр, который я ищу, использовался для обновления модели: updateBase но в версии 4 он, кажется, исчез.
  2. Эффективно ли хранить в коде за пределами всех точек, а затем постоянно кормить KNN целыми точками обучения?
  3. Я написал свою собственную версию KNN, чтобы прояснить, какова моя цель . Конечно, не оптимизирована, особенно функция classify, если нет решения двух предыдущих вопросов, как вы предлагаете улучшить эту реализацию?
class MyKNN:
    def __init__(self):
        self.knnPoints = []
        self.knnLabels = []

    def train(self, points, labels) -> None:
        if len(points) != len(labels):
            print("Error: len(points) != len(labels)")
        else:
            [ self.knnPoints.append(el) for el in points ]
            [ self.knnLabels.append(el) for el in labels ]

    def classify(self, query, k: int=5) -> "label":
        distances = []
        for point in self.knnPoints:
            dist = spatial.distance.sqeuclidean(query, point)
            distances.append(dist)

        topK = heapq.nsmallest(k, zip(distances, self.knnLabels, self.knnPoints))
        for (i, (score, label, point)) in enumerate(topK):
            print("The {} match has score {:.3f} and label {}".format(i+1, score, str(label)))
        print("")
        return(topK)

...