主成分分析(PCA)步骤及代码

主成成分分析


前言

  主成分分析(Principal Component Analysis,PCA), 简称PCA,是一种统计方法。过正交变换将一组可能存在相关性的变量转换为一组线性不相关的变量,转换后的这组变量叫主成分。主成分分析是我们在数学建模的过程中最为常见的线性降维方式,在比赛中常常会用在数据指标过多的处理,把高维度数据处理成低维度数据,方便后续建模。说人话就是将多个数据指标降维到较少的数据指标。


一、主成分分析的步骤

对n个样本,p个指标组成的Xnp的样本矩阵

1、对指标中心化

中心化也就是把数据的均值变为零
x i j = x i j − 1 n ∑ j = 1 n x i j (1) x_{ij}=x_{ij}-\frac{1}{n}\sum_{j=1}^n x_{ij} \tag{1} xij=xijn1j=1nxij(1)
数据是正态分布也可以是标准化过程。
x i j = X − X ‾ σ (2) x_{ij}= \frac{X-\overline{X}}{\sigma} \tag{2} xij=σXX(2)

2、计算协方差矩阵C

C = 1 n X ′ T X ′ (3) C= \frac{1}{n}X'^{T}X' \tag{3} C=n1XTX(3) C i j = c o v ( x i , x j ) = E ( ( x i − μ i ) ( x j − μ j ) ) (4) C_{ij}= cov(x_{i},x_{j})=E((x_{i}-\mu_{i})(x_{j}-\mu_{j})) \tag{4} Cij=cov(xi,xj)=E((xiμi)(xjμj))(4)
其中x为指标列,μ为指标均值

3、计算协方差矩阵的特征值和特征向量

C a = λ a (5) Ca=\lambda a \tag{5} Ca=λa(5)
λ为C的特征值,a为C的对应于特征值λ的特征向量,具体推导不会的可以参考线性代数。

4、计算主成分贡献率和累计贡献率

将特征值由大到小排列,对应的特征向量按行排列成矩阵a
P i = λ i ∑ λ i (6) P_{i}=\frac {\lambda_{i}}{\sum \lambda_{i}}\tag{6} Pi=λiλi(6)
P i ′ = ∑ k = 1 i P k (7) P'_{i}=\sum_{k=1}^i P_{k}\tag{7} Pi=k=1iPk(7)
Pi为贡献率,P’i为累计贡献率,我们将Pi视为信息的保留部分百分比

5、写出主成分

一般取累计贡献率P’i超过80%的特征值对应的m个主成分
Y = a X (8) Y=aX\tag{8} Y=aX(8)
第i个主成分: F i = a 1 i X 1 + a 2 i X 2 + … + a p i X p (9) F_{i}=a_{1i}X_{1}+a_{2i}X_{2}+…+a_{pi}X_{p}\tag{9} Fi=a1iX1+a2iX2++apiXp(9)

6、解释主成分

对于某个主成分而言,指标的系数越大,代表该指标对主成分的影响越大,我们对这个主成分的解释应赋予指标更大的权重。

二、代码程序

matlab代码如下:

clear;clc
x =  xlsread('文件路径\xxx.xlsx');  %导入excel数据
[n,p] = size(x);  % n是样本个数,p是指标个数
X=zscore(x); %matlab内置的标准化函数
C = cov(X); %求协方差矩阵
[V,lambda] = eig(C);  % V 特征向量矩阵,lamda为特征值构成的对角矩阵
[lambda, ind] = sort(diag(lambda), 'descend'); %排序
lambda=lambda./sum(lambda); %求贡献率
lambda=cumsum(lambda); %累计贡献率
k=find(lambda>0.9); %累计贡献率超过0.9
y=x*V(:,ind(1:k(1))); %y为主成分降维后的结果

python代码如下:

## pca特征降维
# 导入相关模块
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
from numpy.linalg import eig
from sklearn.datasets import load_iris

iris = load_iris() # 导入矩阵,行是样本,列是指标
#X = np.array([[5.1, 3.5, 1.4, 0.2],
#                [4.9, 3, 1.4, 0.2]])
#自己导入矩阵数据可以用上面的注释代码,然后把X = iris.data 删掉即可
X = iris.data
# Standardize by remove average通过去除平均值进行标准化
X = X - X.mean(axis=0)

# Calculate covariance matrix:计算协方差矩阵:
X_cov = np.cov(X.T, ddof=0)

# Calculate  eigenvalues and eigenvectors of covariance matrix
# 计算协方差矩阵的特征值和特征向量
eigenvalues, eigenvectors = eig(X_cov)
pi = eigenvalues/np.sum(eigenvalues) #计算贡献率
p = np.cumsum(pi) #计算累计贡献率

k=np.min(np.argwhere(p > 0.95))+1 #返回达到累计贡献率的阈值的下标

# top k large eigenvectors选取前k个特征向量
klarge_index = eigenvalues.argsort()[-k:][::-1]
k_eigenvectors = eigenvectors[klarge_index]

# X和k个特征向量进行点乘
X_pca = np.dot(X, k_eigenvectors.T)
print(X_pca) #输出主成分结果

两种编程语言都是一样的,看自己熟练哪一种就用哪种。

扫描二维码关注公众号,回复: 15106256 查看本文章

总结`

主成分分析有没有不用代码的操作?
  是有的,spsspro、MPai数据科学平台等都有内置的主成分分析的操作。

如何解释主成分?
  在实际过程操作中,我们知道了第i个主成分的构成,那么可以根据相对应的系数进行解释,如:X1代表食品支出,X2代表住房支出,X3代表娱乐支出,X4代表医疗支出,Y1为第1个主成分,构成如下:
F i = 0.91 X 1 + 0.83 X 2 + 0.04 X 2 + 0.76 X 4 (10) F_{i}=0.91X_{1}+0.83X_{2}+0.04X_{2}+0.76X_{4}\tag{10} Fi=0.91X1+0.83X2+0.04X2+0.76X4(10)
  可以明显观察到,X1、X2、X4前面的系数较高,对于主成分的影响较大,而X3前面的系数较高,对于主成分的影响较小,那么我们可以将第一主成分解释为:家庭必要支出
注:一旦主成分无法解释,那么这次主成分分析就是失败的,可以考虑用因子分析

主成分分析能否用于综合评价?
  先说结论,主成分分析虽然有主成分得分,但是我们一般是不会将主成分分析用于综合得分评价的。因为主成分是会损失部分原始数据的信息的,而且如果指标是极小型的,在其中我们没有对数据指标进行正向化的过程,那么得分结果是不准确的。
  主成分得分的原理是从几十个指标中分解出几个主元,相当于是全新的指标,并且有这几个主元的贡献率,贡献率衡量的是这个主元能够反映整体多少信息量(其他指标映射到主元的距离方差,方差越大,说明能反映的信息量越多),是个相对性的值,归一化后可以当做权重,权重与主元相乘可得到不同样本相对的数值。

猜你喜欢

转载自blog.csdn.net/weixin_52952969/article/details/124954713