3 PCA中的SVD
PCA(2).fit(X).components_
PCA(2).fit(X).components_.shape
from sklearn.datasets import fetch_lfw_people from sklearn.decomposition import PCA import matplotlib.pyplot as plt import numpy as np
faces = fetch_lfw_people(min_faces_per_person=60) faces.images.shape #怎样理解这个数据的维度? faces.data.shape #换成特征矩阵之后,这个矩阵是什么样? X = faces.data
#数据本身是图像,和数据本身只是数字,使用的可视化方法不同 #创建画布和子图对象 fig, axes = plt.subplots(4,5 ,figsize=(8,4) ,subplot_kw = {"xticks":[],"yticks":[]} #不要显示坐标轴 ) fig axes #不难发现,axes中的一个对象对应fig中的一个空格 #我们希望,在每一个子图对象中填充图像(共24张图),因此我们需要写一个在子图对象中遍历的循环 axes.shape #二维结构,可以有两种循环方式,一种是使用索引,循环一次同时生成一列上的三个图 #另一种是把数据拉成一维,循环一次只生成一个图 #在这里,究竟使用哪一种循环方式,是要看我们要画的图的信息,储存在一个怎样的结构里 #我们使用 子图对象.imshow 来将图像填充到空白画布上 #而imshow要求的数据格式必须是一个(m,n)格式的矩阵,即每个数据都是一张单独的图 #因此我们需要遍历的是faces.images,其结构是(1277, 62, 47) #要从一个数据集中取出24个图,明显是一次性的循环切片[i,:,:]来得便利 #因此我们要把axes的结构拉成一维来循环 axes.flat enumerate(axes.flat) #填充图像 for i, ax in enumerate(axes.flat): ax.imshow(faces.images[i,:,:] ,cmap="gray" #选择色彩的模式 ) #https://matplotlib.org/tutorials/colors/colormaps.html
#原本有2900维,我们现在来降到150维 pca = PCA(150).fit(X)
V = pca.components_ V.shape
fig, axes = plt.subplots(3,8,figsize=(8,4),subplot_kw = {"xticks":[],"yticks":[]}) for i, ax in enumerate(axes.flat): ax.imshow(V[i,:].reshape(62,47),cmap="gray")
4 重要接口inverse_transform
from sklearn.datasets import fetch_lfw_people from sklearn.decomposition import PCA import matplotlib.pyplot as plt import numpy as np
faces = fetch_lfw_people(min_faces_per_person=60) faces.images.shape #怎样理解这个数据的维度? faces.data.shape #换成特征矩阵之后,这个矩阵是什么样? X = faces.data
pca = PCA(150) X_dr = pca.fit_transform(X) X_dr.shape
X_inverse = pca.inverse_transform(X_dr)
X_inverse.shape
fig, ax = plt.subplots(2,10,figsize=(10,2.5) ,subplot_kw={"xticks":[],"yticks":[]} ) #和2.3.3节中的案例一样,我们需要对子图对象进行遍历的循环,来将图像填入子图中 #那在这里,我们使用怎样的循环? #现在我们的ax中是2行10列,第一行是原数据,第二行是inverse_transform后返回的数据 #所以我们需要同时循环两份数据,即一次循环画一列上的两张图,而不是把ax拉平 for i in range(10): ax[0,i].imshow(faces.images[i,:,:],cmap="binary_r") ax[1,i].imshow(X_inverse[i].reshape(62,47),cmap="binary_r")

from sklearn.datasets import load_digits from sklearn.decomposition import PCA import matplotlib.pyplot as plt import numpy as np
digits = load_digits()
digits.data.shape
def plot_digits(data): fig, axes = plt.subplots(4,10,figsize=(10,4) ,subplot_kw = {"xticks":[],"yticks":[]} ) for i, ax in enumerate(axes.flat): ax.imshow(data[i].reshape(8,8),cmap="binary") plot_digits(digits.data)
np.random.RandomState(42) #在指定的数据集中,随机抽取服从正态分布的数据 #两个参数,分别是指定的数据集,和抽取出来的正太分布的方差 noisy = np.random.normal(digits.data,2) plot_digits(noisy)
pca = PCA(0.5).fit(noisy) X_dr = pca.transform(noisy) X_dr.shape
without_noise = pca.inverse_transform(X_dr)
plot_digits(without_noise)
