1.1 主要用途:
1、壓縮文件
2、可視化數(shù)據(jù)
3、簡(jiǎn)化特征值個(gè)數(shù),便于算法實(shí)現(xiàn)
?PCA:是特征降維的最常用手段。PCA能從冗余特征中提取主要成分,在不太損失質(zhì)量情況下,提升訓(xùn)練速度
1.2 PCA與線性回歸區(qū)別

圖片.png
左圖是線性回歸,右圖是PCA,其中藍(lán)色線段是叫做投影誤差,
PCA就是要找到一條線,確保各個(gè)特征的投影誤差足夠小,來(lái)保存原特征具有信息。
1.3 PCA概念
假設(shè)要從n維度下降k維度,首先我們需要k個(gè)n維向量,構(gòu)成一個(gè)k維空間,然后將特征投影到這個(gè)空間,使得各個(gè)特征的投影誤差足夠小。
1.4 算法步驟
1、首先特征標(biāo)準(zhǔn)化
2、計(jì)算協(xié)方差矩陣:
協(xié)方差矩陣是計(jì)算不同維度之間的協(xié)方差,而不是不同樣本之間的
X矩陣表示不同個(gè)維度數(shù)值都減去對(duì)應(yīng)維度的均值,然后轉(zhuǎn)置相乘。
一般計(jì)算表示是:
3、通過(guò)奇異值分解(SVD),求取的特征向量
4、從U中取出前K個(gè)左奇異向量,構(gòu)成一個(gè)約減矩陣
計(jì)算新的特征向量:
5、特征還原
PCA只保留了特征的主成分,是一種有損壓縮方式,新特征向量為:
那么,還原后特征為:
2 PAC實(shí)現(xiàn)
2.1 利用PAC把2D轉(zhuǎn)化1D
import numpy as np
import matplotlib.pyplot as plt
from scipy.io import loadmat
import math
def show1():
mat=loadmat('DATA\ex7data1.mat')
X=mat['X']
return X
def featureNormalize(X):
means=X.mean(axis=0)
stds=X.std(axis=0,ddof=1) #N-1
X_norm=(X-means)/stds
return X_norm,means,stds
#每一行為一條數(shù)據(jù),對(duì)特征列壓縮
def pca(X):
#矩陣法求協(xié)方差矩陣
sigma=(X.T@X)/len(X)
#通過(guò)奇異值分解(SVD)算法,求協(xié)方差的特征向量
U,S,V=np.linalg.svd(sigma)
return U,S,V
X=show1()
x_norm,means,stds=featureNormalize(X)
U,S,V=pca(x_norm)
#計(jì)算特征壓縮
def projectData(X,U,K):
Z=X@U[:,:K] #
return Z
Z=projectData(x_norm,U,1)#1壓縮成1維
print(X.shape,Z.shape,U.shape) #(50,2)(50,1)(2,2)
# 恢復(fù)特征
def recoverData(Z,U,K):
X_rec=Z@U[:,:K].T
return X_rec
x_rec=recoverData(Z,U,1)
#可視化過(guò)程
plt.figure(figsize=(7,5))
plt.axis("equal")
plot=plt.scatter(x_norm[:,0],x_norm[:,1],s=30,edgecolors='b',
label='Original Data Points')
plot=plt.scatter(x_rec[:,0],x_rec[:,1],s=30,edgecolors='r',
label='PCA Reduced Data Points')
plt.title('Example Dataset Reduced Dimension Points Shown')
plt.xlabel('x1 [Feature Normalized]')
plt.ylabel('x2 [Feature Normalized]')
plt.grid()
for x in range(x_norm.shape[0]):
plt.plot([x_norm[x,0],x_rec[x,0]],[x_norm[x,1],x_rec[x,1]],'k--')
plt.legend()
plt.show()

圖片.png
2.2 應(yīng)用在人臉上運(yùn)行PCA
#應(yīng)用在人臉上運(yùn)行PCA
def data():
mat=loadmat('DATA/ex7faces.mat')
X=mat['X']
return X
X=data()
#可視化數(shù)據(jù)
def displayData(X, row, col):
fig, axs = plt.subplots(row, col, figsize=(8, 8))
for r in range(row):
for c in range(col):
axs[r][c].imshow(X[r * col + c].reshape(32, 32).T, cmap='Greys_r')
axs[r][c].set_xticks([])
axs[r][c].set_yticks([])
plt.show()
displayData(X, 10, 10)
##使用PCA在頭像上
x_norm,means,stds=featureNormalize(X)
U,S,V=pca(x_norm)
# displayData(U[:,:36].T,6,6)
#PCA還原
z=projectData(x_norm,U,K=36)
x_rec=recoverData(z,U,K=36)
displayData(x_rec,10,10)

原圖.png

處理后圖.png
轉(zhuǎn)載參考鏈接