data_list = [] for i inrange(num): img_path = os.path.join(test_dir, str(i % 10), '%d.png' % (i)) img = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE) if img isnotNone: data_list.append(img.reshape(-1))
return np.array(data_list).astype(np.uint8)
defpca(X, ratio=0.99, **kwargs): """ pca降维 :param X: 大小为NxM,其中M是个数,N是维度,每个字段已是零均值 :param ratio: 表示投影均方误差和方差比值,默认为0.99,保持99%的方差 :param kwargs: 字典参数,如果指定了k值,则直接计算 :return: 降维后数据 """ N, M = X.shape[:2] C = X.dot(X.T) / M u, s, v = np.linalg.svd(C) # u, s, v = linalg.svd(C)
k = 1 if'k'in kwargs: k = kwargs['k'] else: while k < N: s_k = np.sum(s[:k]) s_N = np.sum(s) if (s_k * 1.0 / s_N) >= ratio: break k += 1 p = u.transpose()[:k] y = p.dot(X)
return y, p
defmake_image(data_array, N, W, H, is_gray=False): if is_gray: img = np.zeros((N * H, N * W)) else: img = np.zeros((N * H, N * W, 3)) for i inrange(N): for j inrange(N): if is_gray: img[i * H:(i + 1) * H, j * W:(j + 1) * W] = data_array[i * N + j].reshape(H, W) else: img[i * H:(i + 1) * H, j * W:(j + 1) * W, :] = data_array[i * N + j].reshape(H, W, 3) return img.astype(np.uint8)
if __name__ == '__main__': mnist_path = '/home/zj/data/decompress_mnist/' cifar_path = '/home/zj/data/decompress_cifar_10/' N = 7 W = 32 H = 32 isGray = False
# data_array = load_mnist_data(N * N, mnist_path) data_array = load_cifar_data(N * N, cifar_path) img1 = make_image(data_array, N, W, H, is_gray=isGray)
if N == 1: mu = 0 else: mu = np.mean(data_array, axis=0, keepdims=True) data_array = data_array - mu
print(data_array.shape) start = time.time() y, p = pca(data_array.T, ratio=0.99) end = time.time() print('pca need time: %f' % (end - start)) print(y.shape) X_reduced = (p.T.dot(y)).T X_reduced += mu
img2 = make_image(X_reduced, N, W, H, is_gray=isGray)
plt.figure(1) if isGray: plt.imshow(img1, cmap='gray') else: plt.imshow(img1) plt.axis('off')
plt.figure(2) if isGray: plt.imshow(img2, cmap='gray') else: plt.imshow(img2) plt.axis('off')
Gitalk 加载中 ...