PCA
文章目录
1.为什么要降维
在低维下数据更加容易处理,但是现实情况中数据却往往拥有很多特征,所以会导致很多问题:
- 特征越多,更多参数需要调整,过拟合风险大
- 维度出现虚高问题
- 维度少,训练越快
- 如果想要将数据可视化,必须将维度控制在2/3个维度
综上,所以我们需要降维。
降维方法
-
特征抽取
- 线性降维:PCA,FA,ICA,LDA
- 流形学习:非线性降维
- SVD
-
特征筛选
- 缺失值比率
- 随机森林:返回特征值的重要性
- 反向特征消除:把所有的特征放到一个模型,每次删除使模型改变最小的特征
2.PCA算法(基于特征值分解)
2.1预备知识
- 方差越大,包含信息越多
2.2降维流程
- 整体思路:通过坐标系的变换转换的新的坐标系中去
- 以方差最大的方向为坐标轴
- 步骤
- 第0轴:选择原始数据方差最大的方向
- 第1轴:与第0轴正交且方差次大的方向
- 重复该过程,重复次数=数据维数
- 通过这个过程返现,方差大的在前n个坐标轴,所以保留前n几个轴
2.3 流程图
2.4伪代码表示
#-*- coding=utf-8-*-
#@Time:2020/10/11 17:56
#@Author:张雅瑞
#@File:Demo02
#@Software:PyCharmhhj
import numpy as np
import pandas as pd
import matplotloib.pyplot as plt
def PCA(数据集)
#1.去除平均值
meanvals=计算出的均值
meanremoved=每列-对应列的均值
#2.计算协方:np.cav,np.mat
covmat=计算出协方差矩阵
evals,evecs=计算covmat的特征值特征向量#直接调用相关方法
#3.特征值从大到小排序
eval_sort=特征值从大到小排序
eval_topn=取前N个特征值#可通过切片实现
#4.保留最上面N个向量
evecs_topn=取对应eval_topn的特征向量#通过对应索引寻找
#5.数据转换:取均值后的数据与筛选后的特征向量相乘
新数据集=meanRemoved* evecs_topn#矩阵相乘,而非普通相乘
降维数据集=新数据集*转置后的evecs_topn +对应列的均值
#6.返回对应值
return 新数据集,降维后的数据集
3.PCA算法(基于SVD分解)
-
当样本量很大时往往采用SVD实现PCA算法,因为SVD方法可以不计算特征值
-
假设样本为m*n的矩阵,我们可以通过SVD计算XT*X最大的K个特征值组成的矩阵V
X1=X*V>>>列数从n减到K实现降维
-
在sk—learn自带的算法中会同通过SVD分解实现降维,从而大大提高运算速度
3.1实例讲解
假设现在有一个矩阵,每一行代表一个用户,每列代表一个物品
其中的数字是评价等级1~5 , 0代表没有评价
我们将该矩阵分解:
这里假设我们取2个奇异值,那么便可以近似分解
4.sk—learn中PCA源码解析
4.1参数
- n_components:PCA算法中保留的主成分个数,即保留特征个数
- 可选值
- int:如果n_components=1——将数据降到以为
- string:自动选取特征个数,使得满足所要求的方差百分比
- 未赋值:默认None,特征个数不变,特征数据本身改变
- copy:是否将原始训练数据复制
- true:默认值,复制
- False:不复制
- whiten:是否进行白化,使得每个特征具有相同方差
- True:进行白化
- False:默认值,不进行白化
4.2PCA对象属性
- explained_variance_ratio_:返回所保留各个特征的方差百分比,如果n_components没有赋值,则所有特征都会返回一个数值且解释方差之和等于1。
- n_components_:返回保留的特征的个数
4.3PCA常用方法
- fit(x):用数据x训练PCA模型
- fit_transform(X):用PCA训练PCA模型,同时返回降维后的数据
- inverse_transform(newData):将降维后的数据转换为原始数据,但可能不会完全一样,有些许差别
- transform(X):将X转换为降维后的数据