7-8 使用PCA降噪
Last updated
Last updated
原始数据:
import numpy as np
import matplotlib.pyplot as plt
X = np.empty((100,2))
X[:,0] = np.random.uniform(0., 100., size=100)
X[:,1] = 0.75 * X[:,0] + 3. + np.random.normal(0, 5, size=100)
plt.scatter(X[:, 0], X[:, 1])
plt.show()
降噪后:
from sklearn.decomposition import PCA
pca = PCA(n_components=1)
pca.fit(X)
X_reduction = pca.transform(X)
X_restore = pca.inverse_transform(X_reduction)
plt.scatter(X_restore[:, 0], X_restore[:, 1])
plt.show()
从图1到图2有信丢失了,丢失的这部分信息中很有可能有很大一部分是噪声 降维的过程中丢失了信息,同时也去除了部分噪音
原始的手写数据:
from sklearn import datasets
digits = datasets.load_digits()
X = digits.data
y = digits.target
example_digits = X[y == 0, :][:10]
for num in range(1, 10):
X_num = X[y==num,:][:10]
example_digits = np.vstack([example_digits, X_num])
对原始的手写数据加噪
example_digits = example_digits + np.random.normal(0, 4, size=X.shape)
显示加噪后的图像:
def plot_digits(data):
#fig, axes = plt.subplots(10, 10, figsize=(10, 10), subplot_kw={'xticks':[], 'yticks':[]},girdspec_kw=dict(hspace=0.1, wspace=0.1))
fig, axes = plt.subplots(10, 10, figsize=(10, 10), subplot_kw={'xticks':[], 'yticks':[]})
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)
对example_digits去噪
pca = PCA(0.5)
pca.fit(noisy_digits) # pca.n_components_ = 12
components = pca.transform(example_digits)
filtered_digits = pca.inverse_transform(components)
去噪后的效果:
plot_digits(filtered_digits)