之前的例子

原始数据:

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)