svd降维 python案例_菜菜的机器学习sklearn实战-----sklearn中的降维算法PCA和SVD
菜菜的機(jī)器學(xué)習(xí)sklearn實(shí)戰(zhàn)-----sklearn中的降維算法PCA和SVD
概述
從什么叫維度說開來
簡(jiǎn)單講,shape中返回了幾個(gè)數(shù)字就是幾維。
一張表最多就是一維
當(dāng)一個(gè)數(shù)組中存在2張3行4列的表時(shí),shape返回的是(更高維,行,列)
當(dāng)數(shù)組中存在2組2張3行4列的表時(shí),數(shù)據(jù)就是4維,shape返回(2,2,3,4)
數(shù)組中的每一張表,都是一個(gè)特征矩陣或者一個(gè)DataFrame,這些結(jié)構(gòu)永遠(yuǎn)只有一張表,所以一定要有行列,其中行是樣本,列是樣本特征。
針對(duì)每一張表,維度指的是樣本的數(shù)量或者特征的數(shù)量,一般無特別說明,指的都是特征的數(shù)量。
除了索引之外,一個(gè)特征是一維,兩個(gè)特征是二維,n個(gè)特征是n維。
對(duì)于圖像來說,維度就是圖像中的特征向量的數(shù)量(坐標(biāo)軸的 個(gè)數(shù))
降維算法中的“降維”,指的就是降低特征矩陣中特征的數(shù)量
降維的目的:
就是讓算法運(yùn)算更快,效果更好
另外的一個(gè)應(yīng)用就是:數(shù)據(jù)可視化
sklearn中的降維算法
PCA與SVD
我們希望減少特征的數(shù)量,又保留大部分有效信息
在降維中,PCA使用的信息衡量指標(biāo),就是樣本方差,又稱可解釋性方差。方差越大,特征所帶的信息量越多。
降維究竟是如何實(shí)現(xiàn)的
PCA作為矩陣分解算法的核心算法
降維過程中的幾個(gè)重要步驟:
二維特征矩陣
n維特征矩陣
輸入原數(shù)據(jù),結(jié)構(gòu)為(3,2)找出樣本的2個(gè)特征對(duì)應(yīng)的直角坐標(biāo)系,本質(zhì)是找出這2個(gè)特征構(gòu)成的2維平面
輸入原數(shù)據(jù),結(jié)構(gòu)為(m,n)找出原本的n個(gè)特征向量構(gòu)成的n維空間V
決定降維后的特征數(shù)量:1
決定降維后的特征數(shù)量:k
旋轉(zhuǎn),找出一個(gè)新坐標(biāo)系本質(zhì)是找出2個(gè)新的特征向量,以及它們構(gòu)成的新2維平面
決定降維后的特征數(shù)量:k
找出數(shù)據(jù)點(diǎn)在新坐標(biāo)系上,2個(gè)新坐標(biāo)軸上的坐標(biāo)
找出原始數(shù)據(jù)在新特征空間V中的n個(gè)新特征向量上對(duì)應(yīng)的值,“將數(shù)據(jù)映射到新的空間中”
選取第1個(gè)方差最大的特征向量,刪除沒有被選中的特征,成功將2維平面降為1維
選取前K個(gè)信息量最大的特征,刪掉沒有被選中的特征,成功將n維空間V降為k維
找出n個(gè)新特征向量,讓數(shù)據(jù)能夠被壓縮到少數(shù)特征上并且總信息量不損失太多的就是矩陣分解
思考:PCA和特征選擇技術(shù)都是特征工程的一部分,他們有什么不同?
特征選擇具有可解釋性
而PCA,在新的特征矩陣生成之前,我們無法知曉PCA都建立了怎樣的新特征向量,新特征矩陣生成之后也不具有可讀性
因此,PCA一般不適用于探索特征與標(biāo)簽之間關(guān)系的模型(如線性回歸),因?yàn)闊o法解釋的新特征和標(biāo)簽之間的關(guān)系不具有意義。在線性回歸模型中,我們使用特征選擇。
重要參數(shù)n_commpenents
n_components是我們降維后需要的降維,即降維后需要保留的特征數(shù)量。
迷你案例:高維數(shù)據(jù)的可視化
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.decomposition import PCA
iris = load_iris()
y = iris.target
y
X = iris.data
X
#調(diào)用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)
#可視化
#要將三種鳶尾花的數(shù)據(jù)顯示二維平面坐標(biāo)系中,對(duì)應(yīng)的兩種的兩個(gè)坐標(biāo)(兩個(gè)特征向量)應(yīng)該是三種鳶尾花降維后的X1和X2,怎樣才能取出三種鳶尾花下不同的x1和x2
X_dr[y==0,0]#這里是布爾索引----0表示是第0種標(biāo)簽的第1列
#要展示三中分類的分布,需要對(duì)三種鳶尾花分別繪圖
#可以寫成三行代碼,也可以寫成for循環(huán)
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()
探索降維后的數(shù)據(jù)
#屬性explained_variance,查看降維后每個(gè)新特征向量上所帶的信息量大小(可解釋性方差的方法)
pca.explained_variance_
#屬性explained_variance_ratio查看降維后每個(gè)特征向量所占的信息量占原始數(shù)據(jù)總量的百分比
pca.explained_variance_ratio_
pca.explained_variance_ratio_.sum()
選擇最好的n_components:累積可解釋方差貢獻(xiàn)率曲線
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")
plt.show()
最大似然估計(jì)自選超參數(shù)
pca_mle = PCA(n_components="mle")
pca_mle = pca_mle.fit(X)
X_mle = pca_mle.transform(X)
X_mle
#可以發(fā)現(xiàn),mle為我們自動(dòng)選擇了3個(gè)特征
pca_mle.explained_variance_ratio_.sum()
#得到了比設(shè)定2個(gè)特征時(shí)更高的信息含量
按信息量占比選超參數(shù)
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中的SVD
重要參數(shù)svd_solver與random_state
svd_solver的4個(gè)選項(xiàng):
“auto” 通常選用
“full”
“arpack” 適合特征矩陣稀疏
“randomized” 適合特征矩陣巨大,計(jì)算量大
重要屬性components_
重要接口inverse_transform
將歸一化、標(biāo)準(zhǔn)化之后的數(shù)據(jù)變回去
迷你案例:用人臉識(shí)別看PCA降維后的信息保存量
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)
X = faces.data
pca = PCA(150)#實(shí)例化
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":[]})
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")
降維不是你完全可逆的
迷你案例:用PCA做噪音過濾
from sklearn.datasets import load_digits
from sklearn.decomposition import PCA
import matplotlib.pylab 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)
#加入噪聲
rng = np.random.RandomState(42)
noisy = rng.normal(digits.data,2)
plot_digits(noisy)
#過濾噪聲
pca = PCA(0.5,svd_solver="full").fit(noisy)
X_dr = pca.transform(noisy)
X_dr.shape
without_noise = pca.inverse_transform(X_dr)
plot_digits(without_noise)
重要接口,參數(shù)和屬性總結(jié)
案例:PCA對(duì)手寫數(shù)字?jǐn)?shù)據(jù)集的降維
原文鏈接:https://blog.csdn.net/Avery123123/article/details/105162814
總結(jié)
以上是生活随笔為你收集整理的svd降维 python案例_菜菜的机器学习sklearn实战-----sklearn中的降维算法PCA和SVD的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python操作Excel删除一个She
- 下一篇: python多进程加快for循环_pyt