Я пытаюсь вычислить собственные грани для набора изображений, используя python.
Сначала я превращаю каждое изображение в вектор, используя:
list(map(lambda x:x.flatten(), x))
Затем я вычисляю ковариационную матрицу (после удаления среднего из всех данных):
# x is a numpy array
x = x - mean_image
cov_matrix = np.cov(x.T)
Затем я вычисляю собственные значения и собственные числа:
eigen_values, eigen_vecotrs = np.linalg.eig(cov_matrix)
Результаты представляют собой векторы с комплексными числами, поэтому я оставляю только действительную часть, чтобы иметь возможность их показать:
eigen_vectors = np.real(eigen_vectors)
После попытки показать собственные грани ( собственные векторы ), результат даже близко не похож на то, как выглядит собственное лицо:
Мне удалось получить список собственных лиц, используя np.linalg.svd()
, однако мне любопытно, почему мой код не работает и как я могу изменить его, чтобы он работал как положено.
Чтобы исправить np.linalg.eig
, возвращающие комплексные результаты, я уменьшил размер изображений, чтобы он больше не возвращал комплексные числа, однако мои собственные векторы не выглядят как собственное лицо: