import cv2
from matplotlib import pyplot as plt
import numpy as np
def PCA(X, k):
n, m = X.shape
# 中心化
X_mean = np.mean(X, axis=0)
X_centered = X - X_mean
# 计算协方差矩阵
S = np.dot(X_centered, X_centered.T)
# 计算S的特征值和特征向量
eigVals, eigVectors = np.linalg.eig(S)
# 按照特征值从大到小排序,取前k个
index = np.argsort(-eigVals)
index = index[:k]
savedVectors = eigVectors[:, index]
savedVals = eigVals[index]
# 降维后的数据
Z = savedVectors.T.dot(X_centered)
# 重建后的数据
X_rebulid =savedVectors.dot(Z) + X_mean
return Z, X_rebulid
if __name__ == '__main__':
img = cv2.imread('dog.jpg', flags=cv2.IMREAD_GRAYSCALE)
plt.figure()
for i, k in enumerate([5, 25, 50, 100, 200]):
plt.subplot(1, 5, i+1)
plt.axis('off')
plt.title('k={}'.format(k))
img_lowd, img_rebulid = PCA(img, k)
plt.imshow(img_rebulid, cmap='gray')
plt.show()
【无标题】
最新推荐文章于 2024-07-29 14:37:54 发布