这一节,我们来讨论一个数据预处理的技术PCA,PCA全称:Principal Components Analysis(主成分分析)。举个例子:假如我现在负责汽车零件的生产工艺,我抽取了某一天的生产工艺数据做分析,假设这一天生产了1000件产品,那我就有了1000个样本数据。同时对于每件产品,都会记录其生产过程中压力、温度、湿度、速度等工艺参数,假设有20个工艺参数将会对产品质量产生影响。现在我就拿到了一个1000*20的数据集,当我同时观察这20个因素对产品质量的影响,我很难发现其中的规律。我们也知道在这20个影响因素中,只有那么3-4个影响因素(主成分)是起决定性作用的,所以我们就需要找出这最重要的3-4个影响因素。这个过程就是将一个20维的数据集转换为一个3维或者4维数据集,这个过程我们就称为PCA降维。在降维之前,我们每个特征都具有其物理含义,都是可解释的,降维后,我们的数据则无法解释其具体含义。
PCA.png
核心思想:沿着数据差异最大的方向构建新的坐标系,将原有的数据映射到新的坐标系上。数据差异最大的方向即方差最大的方向。
1.1PCA降维说明
PCA降维就是将一组多特征的数据压缩为一组特征少的数据,如将一组100维的数据,压缩为一组2维的数据。用线性代数来解释PCA降维就是,有一组数据[5000,60](5000个样本,60个特征)压缩为一组[5000,3]的数据,那么我们就需要找到一组[60,3]的特征向量矩阵,从而从运算上实现[5000,60]*[60,3] = [5000,3](这一步是矩阵的内积运算)。
从几何学的角度来讲,就是将一组在空间上高维度的数据转换为一组低维度的数据,任何一组数据都是可以在空间(坐标系)当中表示,数据维度的转换过程就是将数据从现有的坐标系映射到新的坐标系当中。
如下图所示,有一个向量(3,2),它是由得出来的,所以我们就称(1,0),(0,1)为一组基坐标。如果我们的基坐标不是(1,0),(0,1),那么这个向量的表示也就不是(3,2)了。
如下图所示,我们建立一组新的基坐标(√2/2,√2/2),(-√2/2,√2/2),所以向量(3,2)映射到新的坐标系中的结果就是(3,2)乘以新的基坐标。
我们可以看到基是正交(垂直)的,这样原有的数据映射到新坐标系的两个轴上是线性无关的。在机器学习算法中,我们希望使用的特征,它们都是线性无关的。如果它们存在相关性,那么这些特征即使数量再多,也没有太大的意义了。这个例子我们是以二维数据为例,如果要将高维数据,降到一个五维数据,那么就需要建立一个五轴(五维)正交坐标系,将原始数据映射到新坐标系上就可以了。
坐标系变换.png
基变换的线性代数表达形式如下:
基变换.png
1.2基坐标的选择
选择投影后数据最分散的方向(也就是数据方差最大的方向)作为第一个基,然后选择方差次大的作为第二个基,但同时需满足与第一个基正交。重复前面的步骤,如果你需要将数据降到K维,就选择K个正交基,构建一个K维正交坐标系。
方差:表示的数据离散程度
协方差:表示两个特征之间的相关性,下方公式是假设a,b特征的均值都为0。前面在选择基坐标的时候,我们希望所选择的基坐标是正交的,就可以用协方差来计算,,表示a,b是正交的。
1.3优化目标
将一组N维向量,降低到K维(0<K<N),选择一个K维正交基,使得原有的数据映射到这组基上后,两两特征间的协方差为0,单个特征的方差最大。
协方差矩阵:假设a,b的均值都为0,得到如下公式。以后在使用PCA时,第一步去均值。
由上式可以看出协方差矩阵对角线上元素为各个特征的方差,其他元素为两特征之间协方差。我们希望通过基坐标变换以后,元素之间的协方差为0,元素自身的方差最大。
我们的协方差矩阵为实对称矩阵,一定可以找到n个单位正交向量,使得协方差矩阵转换为对角矩阵:
实对称矩阵.png
λ1,λ2,λ3......λn就是所得到的特征值,按照特征值的大小,对相应的特征向量进行排序,选取前K维特征向量组成特征矩阵与原始的矩阵相乘就可得到降维后的数据。
2.PCA实现步骤:
1.去除平均值
2.计算协方差矩阵。
3.计算协方差矩阵的特征值和特征向量
4.将特征值从大到小进行排序,保留最前面的K个特征向量
5.将数据转换到上述K个特征向量构建的新的空间中
3.PCA降维的代码实现
PCA过程使用的库为Python的Numpy库,这个演示我们以Boston房价数据集为例,该数据集有13个特征,我们的目标是将它降低到3个特征。
import numpy as np
import pandas as pd
from sklearn import datasets
from sklearn.preprocessing import StandardScaler
bp = datasets.load_boston()
X = bp.data
X = np.array(X)
print(X.shape)
[506,13]#506个样本,13个特征
#数据标准化,去均值
X_std = StandardScaler().fit_transform(X)
#构造协方差矩阵
Cov_mat = np.cov(X_std.T)
#使用Numpy包的linalg.eig模块求解特征值,特征向量
eig_vals,eig_vects = np.linalg.eig(Cov_mat)
#将特征值与特征向量组合成元组,并按照特征值进行排序
eig_pairs = [((np.abs(eig_vals[i])),eig_vects[:,i]) for i in range(len(eig_vects))]
eig_pairs.sort(key = lambda x:x[0],reverse = True)
#选取前三个特征向量构成特征矩阵
matrix_w = np.hstack((eig_pairs[0][1].reshape(13,1),
eig_pairs[1][1].reshape(13,1),eig_pairs[2][1].reshape(13,1)))
#将原始数据映射到新的特征矩阵空间中
new_data = X.dot(matrix_w)
new_data[:10]
array([[-38.89018107, -32.93532391, 51.87396066],
[-33.02343232, -54.79866941, 71.20799688],
[-26.53873512, -48.76840918, 67.85363879],
[-12.75698667, -47.78351826, 72.33882223],
[-15.65240562, -50.77871883, 73.70920814],
[-17.71686561, -51.4336294 , 73.35783472],
[-51.22331968, -29.63835929, 51.11003359],
[-62.1527616 , -38.52240664, 53.72636333],
[-68.87661773, -36.34017288, 53.90249412],
[-60.21849172, -32.80458593, 50.06565433]])
#新数据集new_data的三个特征是不可解释的,具体的实际含义我们都不知道,但机器可以识别。
4.总结
降维技术使得数据变得更易使用,并且能够去除数据中的噪音,使得其他机器学习任务更加精确。降维技术往往作为预处理步骤,在数据应用到其他算法之前清洗数据。
PCA优点:降低数据复杂性,识别最重要的N个特征。
缺点:不一定需要,且可能损失有用的信息。
网友评论