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...