如何提高k近邻分类的Python实现的效率?

2024-10-03 21:30:13 发布

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

我尝试在Python中实现图像的k近邻分类算法,下面是我的代码


    def classifyImage(self, RGBAValsForOneImage, kVal):
            redMaster = RGBAValsForOneImage[0]
            greenMaster = RGBAValsForOneImage[1]
            blueMaster = RGBAValsForOneImage[2]
            alphaMaster = RGBAValsForOneImage[3]
            L2DistanceDictionary = {}
            kLabels = []

        for i in range(self.nImagesTrain):
            print(str("comparing to image nr " + str(i)))
            L2Norm = 0
            # label = self.LabelsTraining[i]

            for j in range(self.nPixel):
                redGreenBlueAlpha = self.RGBAPixelValuesTraining[i, j, :]
                redCompare = redGreenBlueAlpha[0]
                greenCompare = redGreenBlueAlpha[1]
                blueCompare = redGreenBlueAlpha[2]
                alphaCompare = redGreenBlueAlpha[3]
                L2Norm += np.sqrt((redCompare - redMaster) ** 2 + (greenCompare - greenMaster) ** 2 + (blueCompare - blueMaster) ** 2 + (alphaCompare - alphaMaster) ** 2)[0]
            L2Norm *= 100
            L2NormInt = int(L2Norm)

            alreadyThere = L2DistanceDictionary.get(L2NormInt, [])
            alreadyThere.append(i)
            L2DistanceDictionary[L2NormInt] = alreadyThere

        theSortedKeys = sorted(L2DistanceDictionary.keys())
        howManyUntilNow = 0

        for i in range(0, len(L2DistanceDictionary)):
            thekey = theSortedKeys[i]
            thevalue = L2DistanceDictionary[thekey]
            howMany = len(thevalue)
            for z in range(0, howMany):
                if howManyUntilNow < kVal:
                    kLabels.append(self.LabelsTraining[thevalue[z]])
                else:
                    break

        labels_to_count = (label for label in kLabels)
        c = Counter(labels_to_count)
        winLabel, count = c.most_common(1)[0]
        return winLabel

classifyImage函数的基本思想是将需要分类的图像像素的RGBA值与训练数据集中其他图像的RGBA值进行比较,并返回k个最近邻标记中最常见的标记。你知道吗

这段代码的问题是速度非常慢。有什么办法提高效率吗?我几乎从不使用Python编写代码,因此可能有一些简单的方法来改进代码。你知道吗


Tags: to代码in图像selfforrangelabel