Python機器學習:PCA與梯度上升:008使用PCA對資料進行降噪

cn_ Franklin發表於2020-12-08

PCA還可以對資料進行降噪
首先引入相關包

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,10,size=100)
plt.scatter(X[:,0],X[:,1])

在這裡插入圖片描述
降噪去抖動(降維,然後復原)

#降噪,去抖動
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],color = 'r')
plt.scatter(X[:,0],X[:,1])

在這裡插入圖片描述
另外一個例子,手寫識別資料集

#再舉一個例子,手寫識別資料集
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)

必須在外部宣告example_digits

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)

視覺化一下加噪後的資料
視覺化程式碼

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))
plot_digits(example_digits)

在這裡插入圖片描述
PCA處理

pca = PCA(0.7)
pca.fit(noisy_digits)
print(pca.n_components_)
26
components = pca.transform(example_digits)
flitered_digits = pca.inverse_transform(components)
plot_digits(flitered_digits)

在這裡插入圖片描述

相關文章