主成分分析——PCA

        主成分分析是一种降维算法,它能将多个指标转换为少数几个主成分,这些主成分是原始变量的线性组合,且彼此之间互不相关,其能反映出原始数据的大部分信息。
        一般来说,当研究的问题涉及到多变量且变量之间存在很强的相关性时,我们可考虑使用主成分分析的方法来对数据进行简化。

目录

前言

一、PCA

1,PCA的思想

2,算法流程:

1,我们首先对其进行标准化处理:

2,计算标准化样本得协方差矩阵

3,计算R的特征值和特征向量

4,计算主成分贡献率以及累计贡献率

5,写出主成分

6,根据系数分析主成分代表的意义

3,演示一波

二、题目知识点复习

1,eg1

2,eg2

3,eg3

4,eg4 

三,sklearn的PCA使用


前言

        在实际问题研究中,多变量问题是经常会遇到的。变量太多,无疑会增加分析问题的难度与复杂性,而且在许多实际问题中,多个变量之间是具有一定的相关关系的。
        因此,人们会很自然地想到,能否在相关分析的基础上, 用较少 的新变量代替原来较多的旧变量,而且使这些较少的新变量尽可能多地 保留原来变量所反映的信息?
        事实上,这种想法是可以实现的,主成分分析方法就是综合处理这种问题的一种强有力的工具。 主成分分析是把原来多个变量划为少数几个综合指标的一种统计 分析方法。
        从数学角度来看,这是一种 降维 处理技术。

一、PCA

1,PCA的思想

假设有n个样本,p个指标,则可构成大小为n\times p的样本矩阵x:

x=\left[\begin{array}{cccc} x_{11} & x_{12} & \cdots & x_{1 p} \\ x_{21} & x_{22} & \cdots & x_{2 p} \\ \vdots & \vdots & \ddots & \vdots \\ x_{n 1} & x_{n 2} & \cdots & x_{n p} \end{array}\right]=\left(x_{1}, x_{2}, \cdots, x_{p}\right)

假设我们想找到新的一组变量z_1,z_2,\cdots,z_m(m\leq p),且他们满足:

\left\{\begin{array}{l} z_{1}=l_{11} x_{1}+l_{12} x_{2}+\cdots+l_{1 p} x_{p} \\ z_{2}=l_{21} x_{1}+l_{22} x_{2}+\cdots+l_{2 p} x_{p} \\ \quad \vdots \\ z_{m}=l_{m 1} x_{1}+l_{m 2} x_{2}+\cdots+l_{m p} x_{p} \end{array}\right.

系数l_{ij}的确定原则:

1)z_iz_j (i\neq j;i,j=1,2,\cdots,m)相互无关;

2)z_1x_1,x_2,\cdots,x_p的一切线性组合中方差最大者;

3)z_2是与z_1不相关的x_1,x_2,\cdots,x_p的所有线性组合中方差最大者;

4)依次推断,z_m是与z_1,z_2,\cdots,z_{m-1}不相关的x_1,x_2,\cdots,x_p的所有线性组合中方差最大者

5)新变量指标z_1,z_2,\cdots,z_m,分别称为原变量指标x_1,x_2,\cdots,x_p的第一,第二,\cdots  ,第m主成分

2,算法流程:

假设有n个样本,p个指标,则可构成大小为n\times p的样本矩阵x:

x=\left[\begin{array}{cccc} x_{11} & x_{12} & \cdots & x_{1 p} \\ x_{21} & x_{22} & \cdots & x_{2 p} \\ \vdots & \vdots & \ddots & \vdots \\ x_{n 1} & x_{n 2} & \cdots & x_{n p} \end{array}\right]=\left(x_{1}, x_{2}, \cdots, x_{p}\right)

1,我们首先对其进行标准化处理:

按列计算均值\overline{x_{j}}=\frac{1}{n} \sum_{i=1}^{n} x_{i j}和标准差S_{j}=\sqrt{\frac{\sum_{i=1}^{n}\left(x_{i j}-\overline{x_{j}}\right)^{2}}{n-1}},计算得标准化数据X_{i j}=\frac{x_{i j}-\overline{x_{j}}}{S_{j}},原始样本矩阵经过标准化变为:

                                     X=\left[\begin{array}{llll} X_{11} & X_{12} & \cdots & X_{1 p} \\ X_{21} & X_{22} & \cdots & X_{2 p} \\ \vdots & \vdots & \ddots & \vdots \\ X_{n 1} & X_{n 2} & \cdots & X_{n p} \end{array}\right]=\left(X_{1}, X_{2}, \cdots, X_{p}\right)

2,计算标准化样本得协方差矩阵

                                     R=\left[\begin{array}{cccc} r_{11} & r_{12} & \cdots & r_{1 p} \\ r_{21} & r_{22} & \cdots & r_{2 p} \\ \vdots & \vdots & \ddots & \vdots \\ r_{p 1} & r_{p 2} & \cdots & r_{p p} \end{array}\right]

其中r_{i j}=\frac{1}{n-1} \sum_{k=1}^{n}\left(X_{k i}-\overline{X_{i}}\right)\left(X_{k j}-\overline{X_{j}}\right)=\frac{1}{n-1} \sum_{k=1}^{n} X_{k i} X_{k j}

上面两步等同于算皮尔曼相关系数矩阵)

3,计算R的特征值和特征向量

特征值:\lambda _1\geq \lambda _2\geq \cdots \geq\lambda _p\geq0       (R是半正定矩阵,且t r(R)=\sum_{k=1}^{p} \lambda_{k}=p

特征向量:a_{1}=\left[\begin{array}{c} a_{11} \\ a_{21} \\ \vdots \\ a_{p 1} \end{array}\right], a_{2}=\left[\begin{array}{c} a_{12} \\ a_{22} \\ \vdots \\ a_{p 2} \end{array}\right], \cdots, a_{p}=\left[\begin{array}{c} a_{1 p} \\ a_{2 p} \\ \vdots \\ a_{p p} \end{array}\right]

4,计算主成分贡献率以及累计贡献率

贡献率:\frac{\lambda_{i}}{\sum_{k=1}^{p} \lambda_{k}}(i=1,2, \cdots, p)

累计贡献率:\frac{\sum_{k=1}^{i} \lambda_{\mathrm{k}}}{\sum_{k=1}^{p} \lambda_{k}}(i=1,2, \cdots, p)

5,写出主成分

一般取累计贡献率超过80%的特征值所对应的第一、第二、\cdots ,第m(m\leqslant p)个主成分。第 i 个主成分:F_{i}=a_{1 i} X_{1}+a_{2 i} X_{2}+\cdots+a_{p i} X_{p} \quad(i=1,2, \cdots, m)

6,根据系数分析主成分代表的意义

对于某个主成分而言,指标前面的系数越大,代表该指标对于该主成分的影响越大。

3,演示一波

利用 鸢尾花数据

from sklearn.decomposition import PCA
from sklearn.datasets import load_iris

iris = load_iris()
X = iris.data
y = iris.target
n = X.shape[0]
print(n)

 1,标准化——去除量纲影响

from sklearn.preprocessing import StandardScaler

std = StandardScaler()

X = std.fit_transform(X)

 2,计算协方差

X_bar = X.mean(axis=0)#均值
Xp = X - X_bar
Cov = Xp.T.dot(Xp)/n

 

 (这个矩阵就是皮尔逊相关矩阵其实)

主成分分析——PCA_第1张图片

3,计算特征值与特征向量

a, b = np.linalg.eig(Cov) #特征值赋值给a,对应特征向量赋值给b

 主成分分析——PCA_第2张图片

 4,贡献率与累计贡献率

#贡献率
contributes = a/a.sum()
#累计贡献率
contributes_rate = contributes.copy()
for i in range(1, len(contributes)):
    contributes_rate[i] += contributes_rate[i-1]

 5,取出最大的k个特征向量

selected = b[:, :k]
new_X = X.dot(selected)

二、题目知识点复习

1,eg1

主成分分析——PCA_第3张图片

记住为什么求协方差,求协方差就是为了求指标与指标之间的相关性,如热力图

主成分分析——PCA_第4张图片

都是两两指标的比较。所以协方差矩阵大小一定是(指标*指标) 的

这里每个样本都是k维,那么就是样本指标大小为k,那就是k*k

选D

2,eg2

主成分分析——PCA_第5张图片

 r_{i j}=\frac{1}{n-1} \sum_{k=1}^{n}\left(X_{k i}-\overline{X_{i}}\right)\left(X_{k j}-\overline{X_{j}}\right)

求协方差要先求样本均值,然后再根据公式进行矩阵乘法 

选B

3,eg3

主成分分析——PCA_第6张图片 不管是matlab还python都是eig 

选D

4,eg4 

主成分分析——PCA_第7张图片

 

主成分分析——PCA_第8张图片

只要\lambda_1, \lambda_3, \lambda_4就可达到累计贡献率90%

选ACD

三,sklearn的PCA使用

按建模理论来说,PCA一定要先标准化再调用PCA,这里我用了通道法进行封装两个模型

from sklearn.decomposition import PCA
from sklearn.datasets import load_iris
from sklearn.pipeline import Pipeline
iris = load_iris()
n_components = 2 # 将减少后的维度设置为2
model = Pipeline([
    ('ss', StandardScaler()),
    ('md', PCA(n_components=n_components)),
])
model = model.fit(iris.data)
new_data = model.transform(iris.data)  # 变换后的数据


你可能感兴趣的:(数学建模,python,pandas)