示例#1
0
文件: test_pca.py 项目: nielsrolf/pca
 def test_invariance_to_many_transforms(self):
     X = self.data(500)
     pca = PCA(X)
     x = pca.transform(X, ndims=2)  # error introduced here
     self.assertTrue(
         np.allclose(np.cov(x.T), np.eye(2), atol=1e-4, rtol=1e-2))
     X1 = pca.inverse_transform(x)
     x1 = pca.transform(X1, ndims=2)
     X2 = pca.inverse_transform(x1)
     self.assertTrue(np.allclose(X1, X2))
示例#2
0
文件: test_pca.py 项目: nielsrolf/pca
 def test_transform_inverse_transform(self):
     X = self.data(500)
     pca = PCA(X)
     x = pca.transform(X, ndims=3)
     self.assertTrue(
         np.allclose(np.cov(x.T), np.eye(3), atol=1e-4, rtol=1e-2))
     X_ = pca.inverse_transform(x)
     self.assertTrue(np.allclose(X, X_))
class EigenFaceRecognizer:
    pca = None
    labels = None
    trained_imgs = None
    i_to_label = defaultdict(int)

    def __init__(self):
        self.pca = PCA()
        self.labels = []

    def train(self, mat, label):
        tmp = []
        for i in range(len(label)):
            self.i_to_label[i] = label[i]
            if i != 0 and label[i] != label[i - 1]:
                self.labels.append(tmp)
                tmp = []
            tmp.append((i, label[i]))
        self.labels.append(tmp)

        to_fit = []
        for i in range(len(mat)):
            to_fit.append(np.ndarray.flatten(mat[i]))
        self.trained_imgs = self.pca.fit_transform(to_fit)

    def predict(self, img):
        input_img = img
        tmp_img = np.ndarray.flatten(img)
        tmp_img = np.array([tmp_img])
        tmp_img = self.pca.transform(tmp_img)
        min_mean = 1e100
        min_lable = 0

        re_imgs = self.pca.inverse_transform(self.trained_imgs)
        re_imgs = re_imgs.astype(np.uint8)
        sum = 0
        size = 0
        for i in range(len(self.trained_imgs)):
            if i != 0 and self.i_to_label[i] != self.i_to_label[i - 1]:
                mean = sum / size
                if mean < min_mean:
                    min_mean = mean
                    min_lable = self.i_to_label[i - 1]
                sum = 0
                size = 0
            trained_img = self.trained_imgs[i]
            distance = self.dis(tmp_img, trained_img)
            size += 1
            sum += distance
            #print(self.i_to_label[i], distance)
        mean = sum / size
        if mean < min_mean:
            min_mean = mean
            min_lable = self.i_to_label[len(self.trained_imgs) - 1]

        for i in self.i_to_label:
            if self.i_to_label[i] == min_lable:
                result_img = np.reshape(re_imgs[i], (100, 100))
                tmp = np.concatenate((input_img, result_img))
                break
        sum = 0
        size = 0
        return [min_lable, min_mean]

    def dis(self, a, b):
        return np.linalg.norm(a - b)