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