用PCA对带噪声的手写数字进行降维处理
引入手写数字数据集,代码如下:
from sklearn import datasets
digits = datasets.load_digits()
X = digits.data
y = digits.target
制作一个含噪声的数据集
noisy_digits = X + np.random.normal(0, 4, size=X.shape)
从样本中取出100个digits,称其为example_digits。
初始的时候,在noisy_digits中y=0中取十个,然后进行循环从一到十,每一个都再从noisy_digits中取出y=num的十个,将这些样本和原来的样本垒在一起
example_digits = noisy_digits[y == 0, :][:10]
for num in range(1, 10):
X_num = noisy_digits[y == num, :][:10]
example_digits = np.vstack([example_digits, X_num])
print(example_digits.shape)
得到的结果是:(100,64),代表着example_digits含有100个的元素的,每个元素有64位的数据。
完整代码显示
from sklearn import datasets
import numpy as np
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
digits = datasets.load_digits()
X = digits.data
y = digits.target
noisy_digits = X + np.random.normal(0, 4, size=X.shape)
example_digits = noisy_digits[y == 0, :][:10]
for num in range(1, 10):
X_num = noisy_digits[y == num, :][:10]
example_digits = np.vstack([example_digits, X_num])
print(example_digits.shape) # (100,64)含有100个的元素的,每个元素有64位的数据
def plot_digits(data):
fig, axes = plt.subplots(10, 10, figsize=(10, 10),
subplot_kw={'xticks': [], 'yticks': []},
gridspec_kw=dict(hspace=0.1, wspace=0.1))
for i, ax in enumerate(axes.flat):
ax.imshow(data[i].reshape(8, 8),
cmap='binary', interpolation='nearest',
clim=(0, 16))
plt.show()
plot_digits(example_digits)
# 用PCA进行降维
pca = PCA(0.5)
pca.fit(noisy_digits)
pca.n_components_
components = pca.transform(example_digits)
# 对低维返回高维,再进行绘制
filtered_digits = pca.inverse_transform(components)
plot_digits(filtered_digits)
显示的原始图像如下:
经过PCA降噪处理后的图像显示如下:
参考 https://www.cnblogs.com/jokingremarks/p/14302649.html