pca降維演算法

2021-09-26 08:14:54 字數 1992 閱讀 7654

pca主成分分析演算法,是一種線性降維,將高維座標系對映到低維座標系中。

如何選擇低維座標系呢?

通過協方差矩陣的特徵值和特徵向量,特徵向量代表座標系,特徵值代表對映到新座標的長度。

演算法步驟:

輸入:樣本集d=;

低維空間維數k

第一步:將樣本集中心化。每一列的特徵值減去當前列的均值

第二步:求協方差矩陣的特徵值和特徵向量

協方差矩陣:矩陣×矩陣的轉置;

方法:np.dot(x, np.transpot(x))

特徵值和特徵向量:協方差矩陣特徵分解。

方法一:np.linalg.eig(),返回:特徵值,一維陣列,沒有排序;特徵向量,二維陣列,列表示特徵向量

方法二:np.linalg.svd(),返回:酉矩陣;奇異值,從大到小排序;酉矩陣

第三步:選取前k個特徵值,對應的特徵向量

新樣本集:對應的特徵向量×中心化資料

輸出:降維後樣本集。

k選擇問題:

方差貢獻率:特徵值與所有特徵值總和的比值

累計貢獻率:前k個特徵值和與所有特徵值總和的比值

一般根據累計貢獻率選取k值。

**如下:

import numpy as np

def feature_normalize(x):

"""歸一化資料

(每個資料-當前列的均值)/當前列的標準差

:param x: 樣本集

:return: 歸一化後樣本集,均值,標準差

"""m, n = x.shape

mean = np.zeros((1, n))

std = np.zeros((1, n))

# 計算各列均值

mean = np.mean(x, axis=0)

# 計算各列標準差

std = np.std(x, axis=0)

# 對每個特徵值歸一化

for i in range(n):

x[:, i] = (x[:, i] - mean[i]) / std[i]

return x, mean, std

def cal_eigenvalue(nor_x):

"""求樣本協方差矩陣的特徵值和特徵向量

:param nor_x: 歸一化後的樣本集

:return: 特徵值,特徵向量,排序索引號

"""m, n = nor_x.shape

# 協方差矩陣

sigma = np.dot(np.transpose(nor_x), nor_x)/(m - 1)

# 求協方差矩陣的特徵值和特徵向量,eig_vec[:,i]是對應於eig_val[i]的特徵向量

eig_val, eig_vec = np.linalg.eig(sigma)

index = eig_val.argsort()

return eig_val, eig_vec, index

def pca(x, k):

"""提取前k個主成分

:param x: 樣本集

:param k: 前k個特徵值

:return: 返回降維後樣本,累計貢獻度,主成分索引

"""# 歸一化

nor_x, mean, std = feature_normalize(x)

# 求特徵值和特徵向量

eig_val, eig_vec, index = cal_eigenvalue(nor_x)

eig_index = index[:-(k+1):-1]

# 累計貢獻度

sum_con = sum(eig_val[eig_index])/sum(eig_val)

# 前k個特徵值對應的特徵向量

k_eig_vec = eig_vec[:, eig_index]

lowddata = np.dot(nor_x, k_eig_vec)

return lowddata, sum_con, eig_index

PCA降維演算法

文章由兩部分構成,第一部分主要講解pca演算法的步驟,第二部分講解pca演算法的原理。那麼首先進入第一部分 pca演算法的步驟 樣本矩陣x的構成 假設待觀察變數有m個,其實相當於乙個資料在m維各維度上的座標,我們的目標是在保證比較資料之間相似性不失真的前提下,將描述資料的維度盡量減小至l維 l樣本矩...

PCA降維原理

在之前的介紹中,一幅影象只能表示乙個物件。那麼對於w x h的灰度影象,只能表示為w x h位的向量,那麼乙個有100 100的影象就需要10000維的向量空間。對於一幅人臉而言,是否所有維的資料都是有用的呢?在矩陣論當中我們知道,矩陣可以近似的表示為乙個特徵值與特徵向量的乘積。根據這個原理,如果我...

資料降維 PCA

模型原型 class sklearn.decomposition.pca n components none,copy true,whiten false 引數 copy 如果為false,則直接使用原始資料來訓練,結果會覆蓋原始資料所在的陣列 whiten 如果為true,則會將特徵向量除以n s...