机器学习——PCA 主成分分析(pca主成分分析原理)
PCA
Created: Apr 26, 2020 4:40 PM
PCA 简介
PCA是一种降维算法
属性:
- - 在数据集中保留了最多的信息,同时将数据转换到较低维的子空间
- - 主要的成分彼此正交(方差最大)
- - 有损数据压缩,特征提取和数据可视化等应用程序。
- - 是一种无监督的学习
为什么要降维?
- - 数据可视化
数据可视化中很难看到高维数据,所以你可以通过降维到低维空间,更好的绘制图像。
- - 数据压缩
删除多余和嘈杂的数据,减少内存和硬盘存储,减少输入,可以加快算法的学习速度。
PCA标准
- 投影数据的方差最大化:选择一条线,使数据分布最均匀
- 或最小化投影误差:线性投影应使平均投影成本最小化,平均投影成本定义为数据点与其投影之间的均方距离
最大化投影方差
在信号领域,我们认为信号具有较大的方差,噪声具有较小的方差,信号与噪声的比称为信噪比,信噪比越大意味着数据的质量越好,由此我们不难引出,PCA的目标即最大化投影方差,也就是让数据在主轴上的投影方差最大。
- 给定一个矩阵X,例如
选择k<m个正交基进行降维的同时又尽量保留原始信息,即X变换到这组基后,使得行向量间的协方差为0,而每个行向量的方差尽可能大。
- 协方差矩阵(对称半正定)为
其实是希望你找到一个垂直的新的坐标系, 然后投影过去, 这里有两个问题。 第一问题: 找这个坐标系的标准或者目标是什么? 第二个问题, 为什么要垂直的, 如果不是垂直的呢?
第一问题就是特征值和特征向量,就是投影后方差最大, 协方差最小。
第二个问题?PCA和ICA区别
于是我们发现,x 投影后的方差就是协方差矩阵的特征值。我们要找到最大方差也就是协方差矩阵最大的特征值,最佳投影方向就是最大特征值所对应的特征向量,次佳就是第二大特征值对应的特征向量,以此类推。
举例:
计算Cx特征值为: lamda1 = 2, lamda2 = 2/5,特征值特征向量为
可验证A = (U)TCxU
降维
最小化回归误差
最大投影方差求解的是一条直线使得样本点投影到该直线上的方差最大,我们就可以联想到线性回归,也是求解一条直线。
PCA算法
- - 数据预处理,均值归一化
从每个数据维度中减去平均值。 这将产生一个平均值为零的数据集,减去均值将简化方程,从而简化方差和协方差的计算。 方差和协方差值不受平均值影响
- - 计算协方差矩阵
- - 计算特征向量和特征值
- - 选择前K个主要成分
1、按特征值从高到低对特征向量进行排序
2、选择解释最多方差(例如方差的95%)的前k个特征向量
- 生成新的数据集
选择了要保留在数据中的主成分(特征向量)并形成基本向量,就可以将数据点投影到由前k个主成分定义的超平面(子空间)上。
sklearn PCA
使用PCA分析汽车数据
import pandas as pd
import numpy as np
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import confusion_matrix, accuracy_score
from helper_functions import do_pca, scree_plot, plot_components, pca_results
from IPython import display
import test_code2 as t
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
df = pd.read_csv('./data/cars.csv')
df.head()
df.describe()
数据集中总共有387两,总共有18个特征。
将数据集缩小到3维
pca, X_pca = do_pca(3, df)
pca_results(df, pca)
第一个成分对与以下项目相关的项目具有积极的权重:是油耗gas mileage MPG
第一个成分所解释的可变性为:0.4352
第二部分的最大权重与什么有关:sports cars,
由前三个组成部分解释的总和”:0.7053
计算要保留多少分量才能解释原始数据中至少85%的特征
#Code to find number of components providing more than
# 85% of variance explained
for comp in range(3, df.shape[1]):
pca, X_pca = do_pca(comp, df)
comp_check = pca_results(df, pca)
if comp_check['Explained Variance'].sum() > 0.85:
break
num_comps = comp_check.shape[0]
print("Using {} components, we can explain {}% of the variability in the original data.".format(comp_check.shape[0],comp_check['Explained Variance'].sum()))
Using 6 components, we can explain 0.8682000000000001% of the variability in the original data.
PCA用来干嘛?
- - PCA用于微阵列数据。
- - PCA用于异常检测。
- - 时间序列数据的PCA。
参考:[
https://zhuanlan.zhihu.com/p/77151308](
https://zhuanlan.zhihu.com/p/77151308)
[https://www.zhihu.com/question/30094611/answer/275172932](https://www.zhihu.com/question/30094611/answer/275172932)