主成分分析步骤_数据分析|主成分分析

0fb0eb2e9f1d20a70a3c302397a92475.png

OX01 什么是主成分分析

20个变量试图理解其中之间的关系:

=190种可能;

PCA就是用来简化多变量复杂关系的常用方法;比如,20个相关(冗余)的变量,经过PCA后,就转化成了5个线性无关的成分变量,并尽可能多的保住原始信息;

PCA就是将原有的特征进行重组,得到新的特征。

PCA的主要思想是 将n维特征映射到k维上,这k维是 全新的正交特征也被称为主成分,是在 原有n维特征的基础上重新构造出来的k维特征。

PCA作用: 降维,去除噪声,加快计算。

如第一主成分为:

a1bd5428e4d4b2be95169d8469add81f.png

它是k个观测变量的加权组合,对初始变量集的方差解释性大。

OX02 如何做主成分分析

主成分分析的数理基础:(构造两两指标间的相关系数矩阵,借助拉格朗日方程求出特征值与特征向量)---一行一观测,一列一指标

参考附录1

主成分分析的步骤

“矩阵论”:

1采用标准化的方法对实际值进行无量纲化处理(有必要做)

2计算无量纲数据的协差阵/相关系数矩阵(标准化之后)

3计算相关系数矩阵的特征值并按大小排序

4根据累计贡献率,确定特征值个数;

5根据特征值对应的特征向量确定权重(特征向量即权重)

6PCA评价(可选项,pca还可以做评价)

标准化方法:z-score 标准化
协方差,有单位,不方便进行比较;相关系数无单位,我们经常说的衡量两个变量之间相关性用的是皮尔逊相关系数。
相关系数与相关系数矩阵:有一个p*n维矩阵,任意两个变量之间可以计算一个相关系数,那么最终形成
*
阶相关系数方阵,我们就可以争对此方阵求特征值与特征向量。

得到特征向量(主成分)后,可以用来做线性回归(主成分之间线性无关)

“代数论”:

求主成分同样转化成了最优化问题,我们的目标是:选择出来的主成分尽可能的涵盖原始数据信息,那么就应该选择方差作为衡量指标,方差越大,含有信息越多。

一般我们会使用方差(Variance)来定义样本之间的间距

对于如何找到一个轴,使得样本空间的所有点映射到这个轴的方差最大。就转化成了数学问题.

984a3eef34923280471ec9187f1bad18.png

f0224ec14e54a6b77229fb899c007810.png
图片来自 数据科学家联盟

其过程分为两步:

  • 样本归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()

9d10c957c6c8493c702c3845a6507a3a.png
将样本进行均值归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()

9968d572393de5ac2e8391d7308da3d2.png

接下来就是对目标(方差)函数和梯度(导数)函数的定义。

首先定义目标函数:

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
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值