之前的例子

原始数据:

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)