scikit-learn:降維算法PCA和SVD

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

class sklearn.decomposition.PCA (
					n_components=None, 
					copy=True, 
					whiten=False, 
					svd_solver=’auto’,
					tol=0.0,
					iterated_power=’auto’,
					random_state=None
			 )

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

#1. 調用庫和模塊
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.decomposition import PCA

#2. 提取數據集
iris = load_iris()
y = iris.target
X = iris.data
#作爲數組,X是幾維?
X.shape
#作爲數據表或特徵矩陣,X是幾維?
import pandas as pd
pd.DataFrame(X)

#3. 建模
#調用PCA
pca = PCA(n_components=2) #實例化
pca = pca.fit(X) #擬合模型
X_dr = pca.transform(X) #獲取新矩陣
X_dr

#也可以fit_transform一步到位
#X_dr = PCA(2).fit_transform(X)



#4. 可視化
#要將三種鳶尾花的數據分佈顯示在二維平面座標系中,對應的兩個座標(兩個特徵向量)
#應該是三種鳶尾花降維後的
#x1和x2,怎樣才能取出三種鳶尾花下不同的x1和x2呢?
X_dr[y == 0, 0] #這裏是布爾索引,看出來了麼?
#要展示三中分類的分佈,需要對三種鳶尾花分別繪圖
#可以寫成三行代碼,也可以寫成for循環
"""
plt.figure()
plt.scatter(X_dr[y==0, 0], X_dr[y==0, 1], c="red", label=iris.target_names[0])
plt.scatter(X_dr[y==1, 0], X_dr[y==1, 1], c="black", label=iris.target_names[1])
plt.scatter(X_dr[y==2, 0], X_dr[y==2, 1], c="orange", label=iris.target_names[2])
plt.legend()
plt.title('PCA of IRIS dataset')
plt.show()
"""
colors = ['red', 'black', 'orange']
iris.target_names
plt.figure()
for i in [0, 1, 2]:
	plt.scatter(X_dr[y == i, 0]
				,X_dr[y == i, 1]
				,alpha=.7
				,c=colors[i]
				,label=iris.target_names[i]
	)
plt.legend()
plt.title('PCA of IRIS dataset')
plt.show()

屬性explained_variance_,查看降維後每個新特徵向量上所帶的信息量大小(可解釋性方差的大小)

#6. 探索降維後的數據

屬性explained_variance_ratio,查看降維後每個新特徵向量所佔的信息量佔原始數據總信息量的百分比
#又叫做可解釋方差貢獻率

#屬性explained_variance_ratio,查看降維後每個新特徵向量所佔的信息量佔原始數據總
#信息量的百分比
#又叫做可解釋方差貢獻率

pca.explained_variance_ratio_

#大部分信息都被有效地集中在了第一個特徵上
pca.explained_variance_ratio_.sum()

在這裏插入圖片描述

import numpy as np
pca_line = PCA().fit(X)
plt.plot([1,2,3,4],np.cumsum(pca_line.explained_variance_ratio_))
plt.xticks([1,2,3,4]) #這是爲了限制座標軸顯示爲整數
plt.xlabel("number of components after dimension reduction")
plt.ylabel("cumulative explained variance ratio")
plt.show()

在這裏插入圖片描述
在這裏插入圖片描述

pca_f = PCA(n_components=0.97,svd_solver="full")
pca_f = pca_f.fit(X)
X_f = pca_f.transform(X)
pca_f.explained_variance_ratio_

在這裏插入圖片描述
在這裏插入圖片描述

PCA(2).fit(X).components_
PCA(2).fit(X).components_.shape

在這裏插入圖片描述
在這裏插入圖片描述

#1. 導入需要的庫和模塊
from sklearn.datasets import fetch_lfw_people
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
import numpy as np

#2. 實例化數據集,探索數據
faces = fetch_lfw_people(min_faces_per_person=60)
faces.images.shape
#怎樣理解這個數據的維度?
faces.data.shape
#換成特徵矩陣之後,這個矩陣是什麼樣?
X = faces.data


#3. 看看圖像什麼樣?將原特徵矩陣進行可視化
#數據本身是圖像,和數據本身只是數字,使用的可視化方法不同
#創建畫布和子圖對象
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" #選擇色彩的模式
			)

#4. 建模降維,提取新特徵空間矩陣
#原本有2900維,我們現在來降到150維
pca = PCA(150).fit(X)
V = pca.components_
V.shape

#5. 將新特徵空間矩陣可視化
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"

在這裏插入圖片描述
在這裏插入圖片描述

1. 導入需要的庫和模塊
from sklearn.datasets import fetch_lfw_people
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
import numpy as np

2. 導入數據,探索數據
faces = fetch_lfw_people(min_faces_per_person=60)
faces.images.shape
#怎樣理解這個數據的維度?
faces.data.shape
#換成特徵矩陣之後,這個矩陣是什麼樣?
X = faces.data

3. 建模降維,獲取降維後的特徵矩陣X_dr
pca = PCA(150)
X_dr = pca.fit_transform(X)
X_dr.shape

4. 將降維後矩陣用inverse_transform返回原空間
X_inverse = pca.inverse_transform(X_dr)
X_inverse.shape


5. 將特徵矩陣X和X_inverse可視化
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(face.image[i,:,:],cmap="binary_r")
	ax[1,i].imshow(X_inverse[i].reshape(62,47),cmap="binary_r")

在這裏插入圖片描述
在這裏插入圖片描述

#1. 導入所需要的庫和模塊
from sklearn.datasets import load_digits
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
import numpy as np

#2. 導入數據,探索數據
digits = load_digits()
digits.data.shape

#3. 定義畫圖函數
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)

#4. 爲數據加上噪音
np.random.RandomState(42)
#在指定的數據集中,隨機抽取服從正態分佈的數據
#兩個參數,分別是指定的數據集,和抽取出來的正太分佈的方差
noisy = np.random.normal(digits.data,2)
plot_digits(noisy)

#5. 降維
pca = PCA(0.5).fit(noisy)
X_dr = pca.transform(noisy)
X_dr.shape


#6. 逆轉降維結果,實現降噪
without_noise = pca.inverse_transform(X_dr)
plot_digits(without_noise)

在這裏插入圖片描述
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章