如何在不重写的情况下多次训练KNN(cv::ml::KNearest)?

2024-10-02 10:26:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在构建一个计算机视觉实时应用程序,对于这个项目,我想以一种非常不寻常的方式使用著名的KNN(K-最近邻)算法。 我需要管理传入的数据流(可以描述为带标签的点),因此我的想法是向KNN提供我目前拥有的数据,要求对一些未知点进行分类。当新数据出现时,用这些新数据更新KNN,并重复一次又一次。 一般来说,我会重新训练KNN上百次,每次都会多加几分(少于5分)

我在整个项目中使用Python(3.83.)和OpenCV(4.1.3),将来我需要将所有的东西转换成C++,所以我希望能找到这些技术的解决方案。p>

我在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)


Tags: 数据inselfforlabelslendefel

热门问题