做h5的網(wǎng)站頁面設(shè)計廈門人才網(wǎng)個人會員
文章目錄
- 基本原理
- PCA類
- 圖像降維與恢復(fù)
基本原理
PCA,即主成分分析(Principal components analysis),顧名思義就是把矩陣分解成簡單的組分進行研究,而拆解矩陣的主要工具是線性變換,具體形式則是奇異值分解。
設(shè)有 m m m個 n n n維樣本 X = ( x 1 , x 2 , ? , x m ) X=(x_1, x_2,\cdots,x_m) X=(x1?,x2?,?,xm?),但這 n n n個維度彼此并不完全獨立,所以想試試有沒有辦法將其降低到 k k k維,則PCA的主要流程為
- 先將原始數(shù)據(jù)按列組成 n n n行 m m m列矩陣 X X X,然后對每一行數(shù)據(jù)進行中心化 x i j = x i j ? 1 m ∑ j = 1 m x j x_{ij}=x_{ij}-\frac{1}{m}\sum^m_{j=1}x_j xij?=xij??m1?∑j=1m?xj?,記中心化之后的矩陣為 x ′ x' x′
- 計算樣本協(xié)方差矩陣,由于已經(jīng)中心化,故可表示為 C = 1 m X ′ X ′ T C=\frac{1}{m}X'X'^T C=m1?X′X′T
- 計算協(xié)方差矩陣的特征值和特征向量,一般需要用到奇異值分解
- 對特征向量按照特征值大小進行排序,取前 k k k組特征向量組成矩陣 P P P,則 P X PX PX就是 k k k維的主成分
由于矩陣乘法的幾何意義是坐標(biāo)系的旋轉(zhuǎn)、平移以及縮放,所以從幾何角度理解PCA,就是將坐標(biāo)系旋轉(zhuǎn)到盡量與更多樣本平行,從而達到簡化坐標(biāo)軸的作用。就好比一條空間中的直線,需要用三個維度來表示,但這條直線是一維的,只需旋轉(zhuǎn)、移動坐標(biāo)軸,使得這條直線與 x x x軸重合,就能只用一個坐標(biāo)來表示這條直線。
PCA類
【PCA】類是sklearn.decomposition
中用以實現(xiàn)主成分分析的類,其構(gòu)造函數(shù)為
PCA(n_components=None, *, copy=True, whiten=False, svd_solver='auto', tol=0.0, iterated_power='auto', n_oversamples=10, power_iteration_normalizer='auto', random_state=None)
各參數(shù)含義如下
n_components
組分個數(shù),默認為樣本數(shù)和特征數(shù)中較小的那個;如果輸入為小數(shù),則表示百分之幾copy
為False
時,將覆蓋原始數(shù)據(jù)。whitenbool
為True
時, 對組分矢量進行如下操作:先乘以樣本的方根,然后除以奇異值svd_solver
奇異值求解器,可選'auto', 'full', 'arpack', 'randomized'
tol
容忍度random_state
用于設(shè)置隨機數(shù)種子power_iteration_normalizer
設(shè)置SVD分解方案,可選"LU", "QR", "auto", "none
四種。當(dāng)svd_solver
設(shè)為arpack
時不可用。
奇異值求解器共有4個選擇, 其中full
將調(diào)用scipy.linalg.svd
,計算稠密矩陣比較快;arpack
將調(diào)用scipy.sparse.linalg.svds
,更擅長計算稀疏矩陣。二者的具體區(qū)別可見scipy奇異值分解💎稀疏矩陣SVD
圖像降維與恢復(fù)
下面用scipy中經(jīng)典的樓梯圖像來測試一下主成分分析。
import numpy as np
import matplotlib.pyplot as plt
from sklearn import decompositionfrom scipy.misc import ascent
img = ascent()sh = img.shape
ns = [256, 128, 64, 32, 16, 5]imgs = [img]
for i in ns[1:]:pca = decomposition.PCA(i)# 彩色圖像需要先轉(zhuǎn)化為矩陣再進行PCAimNew = pca.fit_transform(img.reshape(sh[0], -1))im = pca.inverse_transform(imNew)imgs.append(im.reshape(sh))fig = plt.figure()
for i, im in enumerate(imgs):ax = fig.add_subplot(231+i)ax.imshow(im)plt.title(str(ns[i]))plt.axis('off')plt.show()
【fit_transform】對圖像進行降維,保留相應(yīng)組分并輸出
【inverse_transofrm】對圖像進行恢復(fù),最終得到的效果如下,隨著組分的逐漸降低,圖像也越來越模糊。