1.相关背景 在许多领域的研究与应用中,一般须要对含有多个变量的数据进行观测,收集大量数据后进行分析寻找规律。多变量大数据集无疑会为研究和应用提供丰富的信息,可是也在必定程度上增长了数据采集的工做量。更重要的是在不少情形下,许多变量之间可能存在相关性,从而增长了问题分析的复杂性。若是分别对每一个指标进行分析,分析每每是孤立的,不能彻底利用数据中的信息,所以盲目减小指标会损失不少有用的信息,从而产生错误的结论。html
所以须要找到一种合理的方法,在减小须要分析的指标同时,尽可能减小原指标包含信息的损失,以达到对所收集数据进行全面分析的目的。因为各变量之间存在必定的相关关系,所以能够考虑将关系紧密的变量变成尽量少的新变量,使这些新变量是两两不相关的,那么就能够用较少的综合指标分别表明存在于各个变量中的各种信息。主成分分析与因子分析就属于这类降维算法。python
主要思想:经过抛弃携带信息量较少的维度对数据进行降维处理,从而加速机器学习进程。算法
降维就是一种对高维度特征数据预处理方法。降维是将高维度的数据保留下最重要的一些特征,去除噪声和不重要的特征,从而实现提高数据处理速度的目的。在实际的生产和应用中,降维在必定的信息损失范围内,能够为咱们节省大量的时间和成本。降维也成为应用很是普遍的数据预处理方法。bash
降维具备以下一些优势:app
3.1 PCA的概念 PCA(Principal Component Analysis),即主成分分析方法,是一种使用最普遍的数据降维算法。PCA的主要思想是将n维特征映射到k维上,这k维是全新的正交特征也被称为主成分,是在原有n维特征的基础上从新构造出来的k维特征。PCA的工做就是从原始的空间中顺序地找一组相互正交的坐标轴,新的坐标轴的选择与数据自己是密切相关的。其中,第一个新坐标轴选择是原始数据中方差最大的方向,第二个新坐标轴选取是与第一个坐标轴正交的平面中使得方差最大的,第三个轴是与第1,2个轴正交的平面中方差最大的。依次类推,能够获得n个这样的坐标轴。经过这种方式得到的新的坐标轴,咱们发现,大部分方差都包含在前面k个坐标轴中,后面的坐标轴所含的方差几乎为0。因而,咱们能够忽略余下的坐标轴,只保留前面k个含有绝大部分方差的坐标轴。事实上,这至关于只保留包含绝大部分方差的维度特征,而忽略包含方差几乎为0的特征维度,实现对数据特征的降维处理。机器学习
思考:咱们如何获得这些包含最大差别性的主成分方向呢?源码分析
答案:事实上,经过计算数据矩阵的协方差矩阵,而后获得协方差矩阵的特征值特征向量,选择特征值最大(即方差最大)的k个特征所对应的特征向量组成的矩阵。这样就能够将数据矩阵转换到新的空间当中,实现数据特征的降维。学习
因为获得协方差矩阵的特征值特征向量有两种方法:特征值分解协方差矩阵、奇异值分解协方差矩阵,因此PCA算法有两种实现方法:基于特征值分解协方差矩阵实现PCA算法、基于SVD分解协方差矩阵实现PCA算法.
3.2 协方差和散度矩阵
样本均值: 大数据
(1) 方差的计算公式是针对一维特征,即针对同一特征不一样样本的取值来进行计算获得;而协方差则必需要求至少知足二维特征;方差是协方差的特殊状况。ui
(2) 方差和协方差的除数是n-1,这是为了获得方差和协方差的无偏估计。
协方差为正时,说明X和Y是正相关关系;协方差为负时,说明X和Y是负相关关系;协方差为0时,说明X和Y是相互独立。Cov(X,X)就是X的方差。当样本是n维数据时,它们的协方差其实是协方差矩阵(对称方阵)。例如,对于3维数据(x,y,z),计算它的协方差就是:
若是一个向量v是矩阵A的特征向量,将必定能够表示成下面的形式:
(2) 特征值分解矩阵
对于矩阵A,有一组特征向量v,将这组向量进行正交化单位化,就能获得一组正交单位向量。特征值分解,就是将矩阵A分解为以下式:
奇异值分解是一个能适用于任意矩阵的一种分解的方法,对于任意矩阵A老是存在一个奇异值分解:
(1) 求的特征值和特征向量,用单位化的特征向量构成 U。
(2) 求的特征值和特征向量,用单位化的特征向量构成 V。
(3) 将或者
的特征值求平方根,而后构成 Σ。
3.5 PCA算法两种实现方法
(1) 基于特征值分解协方差矩阵实现PCA算法
输入:数据集,须要降到k维。
去平均值(即去中心化),即每一位特征减去各自的平均值。、
计算协方差矩阵,注:这里除或不除样本数量n或n-1,其实对求出的特征向量没有影响。
用特征值分解方法求协方差矩阵的特征值与特征向量。
对特征值从大到小排序,选择其中最大的k个。而后将其对应的k个特征向量分别做为行向量组成特征向量矩阵P。
将数据转换到k个特征向量构建的新空间中,即Y=PX。
总结:
1)关于这一部分为何用,这里面含有很复杂的线性代数理论推导,想了解具体细节的能够看下面这篇文章。 CodingLabs - PCA的数学原理
2)关于为何用特征值分解矩阵,是由于是方阵,能很轻松的求出特征值与特征向量。固然,用奇异值分解也能够,是求特征值与特征向量的另外一种方法。
举个例子:
1)由于X矩阵的每行已是零均值,因此不须要去平均值。
2)求协方差矩阵:
求解后的特征值为:
##Python实现PCA
import numpy as np
def pca(X,k):#k is the components you want
#mean of each feature
n_samples, n_features = X.shape
mean=np.array([np.mean(X[:,i]) for i in range(n_features)])
#normalization
norm_X=X-mean
#scatter matrix
scatter_matrix=np.dot(np.transpose(norm_X),norm_X)
#Calculate the eigenvectors and eigenvalues
eig_val, eig_vec = np.linalg.eig(scatter_matrix)
eig_pairs = [(np.abs(eig_val[i]), eig_vec[:,i]) for i in range(n_features)]
# sort eig_vec based on eig_val from highest to lowest
eig_pairs.sort(reverse=True)
# select the top k eig_vec
feature=np.array([ele[1] for ele in eig_pairs[:k]])
#get new data
data=np.dot(norm_X,np.transpose(feature))
return data
X = np.array([[-1, 1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
print(pca(X,1))
复制代码
上面代码实现了对数据X进行特征的降维。结果以下:
##用sklearn的PCA
from sklearn.decomposition import PCA
import numpy as np
X = np.array([[-1, 1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
pca=PCA(n_components=1)pca.fit(X)
print(pca.transform(X))
复制代码
我在这里只介绍最大方差理论:
所以咱们认为,最好的k维特征是将n维样本点转换为k维后,每一维上的样本方差都很大。
好比咱们将下图中的5个点投影到某一维上,这里用一条过原点的直线表示(数据已经中心化)
计算投影的方法见下图:
(1) 主成分分析(PCA)原理详解
http://blog.csdn.net/zhongkelee/article/details/44064401
(2) 机器学习之PCA主成分分析 - steed灬 - 博客园
https://www.cnblogs.com/steed/p/7454329.html
(3) 简单易学的机器学习算法——主成分分析(PCA)
https://blog.csdn.net/google19890102/article/details/27969459
(4) 机器学习实战之PCA - 笨鸟多学 - 博客园
https://www.cnblogs.com/zy230530/p/7074215.html
(5) 机器学习中的数学(5)-强大的矩阵奇异值分解(SVD)及其应用 - LeftNotEasy - 博客园
http://www.cnblogs.com/LeftNotEasy/archive/2011/01/19/svd-and-applications.html
(6) 从PCA和SVD的关系拾遗
https://blog.csdn.net/Dark_Scope/article/details/53150883
(7) CodingLabs - PCA的数学原理
http://blog.codinglabs.org/articles/pca-tutorial.html
(8) PCA(主成分分析)python实现
https://www.jianshu.com/p/4528aaa6dc48
(9) 主成分分析PCA(Principal Component Analysis)在sklearn中的应用及部分源码分析