日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

svd降维 python案例_菜菜的机器学习sklearn实战-----sklearn中的降维算法PCA和SVD

發(fā)布時(shí)間:2023/12/19 python 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 svd降维 python案例_菜菜的机器学习sklearn实战-----sklearn中的降维算法PCA和SVD 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

菜菜的機(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。