OX01 什么是主成分分析
20个变量试图理解其中之间的关系:
PCA就是用来简化多变量复杂关系的常用方法;比如,20个相关(冗余)的变量,经过PCA后,就转化成了5个线性无关的成分变量,并尽可能多的保住原始信息;
PCA就是将原有的特征进行重组,得到新的特征。
PCA的主要思想是 将n维特征映射到k维上,这k维是 全新的正交特征也被称为主成分,是在 原有n维特征的基础上重新构造出来的k维特征。
PCA作用: 降维,去除噪声,加快计算。
如第一主成分为:
它是k个观测变量的加权组合,对初始变量集的方差解释性大。
OX02 如何做主成分分析
主成分分析的数理基础:(构造两两指标间的相关系数矩阵,借助拉格朗日方程求出特征值与特征向量)---一行一观测,一列一指标
参考附录1
主成分分析的步骤
“矩阵论”:
1采用标准化的方法对实际值进行无量纲化处理(有必要做)
2计算无量纲数据的协差阵/相关系数矩阵(标准化之后)
3计算相关系数矩阵的特征值并按大小排序
4根据累计贡献率,确定特征值个数;
5根据特征值对应的特征向量确定权重(特征向量即权重)
6PCA评价(可选项,pca还可以做评价)
标准化方法:z-score 标准化
协方差,有单位,不方便进行比较;相关系数无单位,我们经常说的衡量两个变量之间相关性用的是皮尔逊相关系数。
相关系数与相关系数矩阵:有一个p*n维矩阵,任意两个变量之间可以计算一个相关系数,那么最终形成*阶相关系数方阵,我们就可以争对此方阵求特征值与特征向量。
得到特征向量(主成分)后,可以用来做线性回归(主成分之间线性无关)
“代数论”:
求主成分同样转化成了最优化问题,我们的目标是:选择出来的主成分尽可能的涵盖原始数据信息,那么就应该选择方差作为衡量指标,方差越大,含有信息越多。
一般我们会使用方差(Variance)来定义样本之间的间距
对于如何找到一个轴,使得样本空间的所有点映射到这个轴的方差最大。就转化成了数学问题.
其过程分为两步:
- 样本归0
- 找到样本点映射后方差最大的单位向量w
OX03 如何求w
3.1 代数论
有了目标函数(方差),求得w的梯度(一行一样本,一列一特征:对所有特征求偏导可得梯度向量),应用梯度上升法就可以很快找到目标函数的最大值。
参考附录2
3.1.1 求第一主成分
下面我们以二维数据为例,将其映射到一维,即求出一系列样本点的第一主成分。
#构建二维数据集
import numpy as np
import matplotlib.pyplot as plt
X = np.empty([100,2])
X[:,0] = np.random.uniform(0., 100., size=100)
X[:,1] = 0.75 * X[:,0] + 3. + np.random.normal(0., 10., size=100)
plt.scatter(X[:,0],X[:,1])
plt.show()
将样本进行均值归0(demean),即所有样本将去样本的均值。样本的分布没有改变,只是将坐标轴进行了移动。
def demean(X):
# axis=0按列计算均值,即每个属性的均值,1则是计算行的均值
return (X - np.mean(X, axis=0))
X_demean = demean(X)
# 注意看数据分布没变,但是坐标已经以原点为中心了
plt.scatter(X_demean[:, 0], X_demean[:, 1])
plt.show()
接下来就是对目标(方差)函数和梯度(导数)函数的定义。
首先定义目标函数:
def f(w,X):
return np.sum((X.dot(w)**2))/len(X)
然后根据梯度公式求梯度w:
def df_math(w,X):
return X.T.dot(X.dot(w))*2./len(X)
求梯度时常需要验证:
# 验证梯度求解是否正确,使用梯度调试方法:
def df_debug(w, X, epsilon=0.0001):
# 先创建一个与参数组等长的向量
res = np.empty(len(w))
# 对于每个梯度&#x