【发布时间】:2019-04-15 06:33:22
【问题描述】:
我正在尝试使用 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)
在尝试显示特征脸 (eigenvectors) 后,结果甚至与特征脸的样子相差甚远:
我已经设法使用np.linalg.svd() 获得了一个特征脸列表,但是我很好奇为什么我的代码不起作用以及如何更改它以使其按预期工作。
为了解决 np.linalg.eig 返回复杂结果的问题,我减小了图像的大小,因此它不再返回复数,但我的特征向量仍然看起来不像特征脸:
【问题讨论】:
-
我不确定您要做什么。您是否试图通过保留前 k 个特征向量来获得图像的小等级近似值?
-
我只想显示特征脸以确保它们与特征向量相同,如果不是,我应该找出如何将它们转换为特征脸。维基百科声明它们是相同的,所以我的结果应该是错误的,我正在寻找为什么我的代码不能正常工作。
-
@Ravexina,您能否展示一个包含绘图功能的完整示例代码。同样对于调试,显示代码,您可以在其中展平和重建单个图像和平均图像,以查看至少该部分运行良好。
-
为什么要取转置
x.T的协方差矩阵?很难看出你是如何构造矩阵 x (每一列是一张图片还是每一行?)和平均图像。但是......您的协方差矩阵 k x k 的维度是 k 像素数还是 k 图像数?它应该是 k 像素数。 -
@MartijnWeterings 感谢您抽出宝贵时间,我会尽快添加所需的详细信息,我现在有点忙。
标签: python machine-learning pattern-recognition eigenvector