PCA降维算法
Posted reaptomorrow-flydream
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PCA降维算法相关的知识,希望对你有一定的参考价值。
PCA主成分分析算法,是一种线性降维,将高维坐标系映射到低维坐标系中。
如何选择低维坐标系呢?
通过协方差矩阵的特征值和特征向量,特征向量代表坐标系,特征值代表映射到新坐标的长度。
算法步骤:
输入:样本集D={x1,x2,...,xm};
低维空间维数k
第一步:将样本集中心化。每一列的特征值减去当前列的均值
第二步:求协方差矩阵的特征值和特征向量
协方差矩阵:矩阵×矩阵的转置;
方法:np.dot(x, np.transpot(x))
特征值和特征向量:协方差矩阵特征分解。
方法一:np.linalg.eig(),返回:特征值,一维数组,没有排序;特征向量,二维数组,列表示特征向量
方法二:np.linalg.svd(),返回:酉矩阵;奇异值,从大到小排序;酉矩阵
第三步:选取前k个特征值,对应的特征向量
新样本集:对应的特征向量×中心化数据
输出:降维后样本集。
k选择问题:
方差贡献率:特征值与所有特征值总和的比值
累计贡献率:前k个特征值和与所有特征值总和的比值
一般根据累计贡献率选取k值。
代码如下:
1 import numpy as np 2 3 4 def feature_Normalize(x): 5 """ 6 归一化数据 7 (每个数据-当前列的均值)/当前列的标准差 8 :param x: 样本集 9 :return: 归一化后样本集,均值,标准差 10 """ 11 m, n = x.shape 12 mean = np.zeros((1, n)) 13 std = np.zeros((1, n)) 14 # 计算各列均值 15 mean = np.mean(x, axis=0) 16 # 计算各列标准差 17 std = np.std(x, axis=0) 18 # 对每个特征值归一化 19 for i in range(n): 20 x[:, i] = (x[:, i] - mean[i]) / std[i] 21 return x, mean, std 22 23 24 def cal_eigenvalue(nor_x): 25 """ 26 求样本协方差矩阵的特征值和特征向量 27 :param nor_x: 归一化后的样本集 28 :return: 特征值,特征向量,排序索引号 29 """ 30 m, n = nor_x.shape 31 # 协方差矩阵 32 sigma = np.dot(np.transpose(nor_x), nor_x)/(m - 1) 33 # 求协方差矩阵的特征值和特征向量,eig_vec[:,i]是对应于eig_val[i]的特征向量 34 eig_val, eig_vec = np.linalg.eig(sigma) 35 index = eig_val.argsort() 36 return eig_val, eig_vec, index 37 38 39 def pca(x, k): 40 """ 41 提取前k个主成分 42 :param x: 样本集 43 :param k: 前k个特征值 44 :return: 返回降维后样本,累计贡献度,主成分索引 45 """ 46 # 归一化 47 nor_x, mean, std = feature_Normalize(x) 48 # 求特征值和特征向量 49 eig_val, eig_vec, index = cal_eigenvalue(nor_x) 50 eig_index = index[:-(k+1):-1] 51 # 累计贡献度 52 sum_con = sum(eig_val[eig_index])/sum(eig_val) 53 # 前k个特征值对应的特征向量 54 k_eig_vec = eig_vec[:, eig_index] 55 lowDData = np.dot(nor_x, k_eig_vec) 56 return lowDData, sum_con, eig_index
以上是关于PCA降维算法的主要内容,如果未能解决你的问题,请参考以下文章