如何在大数据上运行 PCA 和 KNN

数据挖掘 机器学习 Python 计算机视觉
2022-02-12 09:15:55

我使用 python 和手表图像(例如:watch_1watch_2watch_3)。我的目标是随机拍一张手表的照片,然后在我的数据库中找到与其最相似的手表。显然,区分手表的一个主要特征是它们的形状(方形、矩形、圆形、椭圆形),但也有其他特征。

目前,我只是在手表的 rgb 图像上运行 PCA 和 KNN,以找到其中最相似的图像。我的源代码如下:

import cv2
import numpy as np
import os
from glob import glob
from sklearn.decomposition import PCA
from sklearn import neighbors
from sklearn import preprocessing


data = []

# Read images from file
for filename in glob('Watches/*.jpg'):

    img = cv2.imread(filename)
    height, width = img.shape[:2]
    img = np.array(img)

    # Check that all my images are of the same resolution
    if height == 529 and width == 940:

        # Reshape each image so that it is stored in one line
        img = np.concatenate(img, axis=0)
        img = np.concatenate(img, axis=0)
        data.append(img)

# Normalise data
data = np.array(data)
Norm = preprocessing.Normalizer()
Norm.fit(data)
data = Norm.transform(data)

# PCA model
pca = PCA(0.95)
pca.fit(data)
data = pca.transform(data)

# K-Nearest neighbours
knn = neighbors.NearestNeighbors(n_neighbors=4, algorithm='ball_tree', metric='minkowski').fit(data)
distances, indices = knn.kneighbors(data)

print(indices)

但是,当我尝试为超过 1500 个 rgb 图像运行此脚本时,我会MemoryError在 PCA 方法处理数据的位置得到一个。

这对于具有 24GB RAM 和 3.6GHz Intel Core CPU 且没有任何独立 GPU 的 PC 是否正常?

我该如何克服呢?

我应该使用另一种方法,如增量 PCA(或深度学习算法)还是干脆购买离散 GPU?

1个回答

KNN 是基于实例的,因此它将所有训练实例存储在内存中。由于您使用的是图像,因此这将很快增加。无论如何,未转换图像上的 KNN 可能表现不佳,您可以查看滤波器组以将图像转换为词袋表示(更小且更不变)。

但是,如果您的目标是准确度,我建议您跳过所有这些(无论如何都是 2012 年),转而使用深度学习,fi:构建一个自动编码器并确定图像编码表示的相似性(这可以在转而使用 knn btw 完成)。