Python-sklearn之PCA主成分分析

写在前面

作为大数据开发人员,我们经常会收到一些数据分析工程师给我们的指标,我们基于这些指标进行数据提取。其中数据分析工程师最主要的一个特征提取方式就是PCA主成分分析,下面我将介绍Python的sklearn库中是如何实现PCA算法及其使用。

一、PCA主成分分析

什么是PCA主成分分析。百度百科给出如下定义:
请添加图片描述

1、主成分分析步骤

对于一个PCA主成分分析,一般分为以下几个步骤:

  1. 去除平均值
  2. 计算协方差矩阵
  3. 计算协方差矩阵的特征值和特征向量
  4. 将特征值排序
  5. 保留前N个最大的特征值对应的特征向量
  6. 将原始特征转换到上面得到的N个特征向量构建的新空间中(最后两步,实现了特征压缩)

2、主成分分析的主要作

概括起来说,主成分分析主要有以下几个方面的作用。

  1. 主成分分析能降低所研究的数据空间的维数。即用研究m维的Y空间代替p维的X空间(m<p),而低维的Y空间代替高维的x空间所损失的信息很少。即:使只有一个主成分Yl(即 m=1)时,这个Yl仍是使用全部X变量(p个)得到的。例如要计算Yl的均值也得使用全部x的均值。在所选的前m个主成分中,如果某个Xi的系数全部近似于零的话,就可以把这个Xi删除,这也是一种删除多余变量的方法。
  2. 有时可通过因子负荷aij的结论,弄清X变量间的某些关系。
  3. 多维数据的一种图形表示方法。我们知道当维数大于3时便不能画出几何图形,多元统计研究的问题大都多于3个变量。要把研究的问题用图形表示出来是不可能的。然而,经过主成分分析后,我们可以选取前两个主成分或其中某两个主成分,根据主成分的得分,画出n个样品在二维平面上的分布况,由图形可直观地看出各样品在主分量中的地位,进而还可以对样本进行分类处理,可以由图形发现远离大多数样本点的离群点。
  4. 由主成分分析法构造回归模型。即把各主成分作为新自变量代替原来自变量x做回归分析。
  5. 用主成分分析筛选回归变量。回归变量的选择有着重的实际意义,为了使模型本身易于做结构分析、控制和预报,好从原始变量所构成的子集合中选择最佳变量,构成最佳变量集合。用主成分分析筛选变量,可以用较少的计算量来选择量,获得选择最佳变量子集合的效果。

二、Python使用PCA主成分分析

from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
import numpy as np

X = np.array([[12, 350, 1.825, 0.102, 315, 0, 2, 4], [25, 300, 5.57, 0.45, 220, 25, 3, 2.5],  [25, 300, 5.25, 1.1, 220, 20, 4, 3]])
Y = np.array([22, 300, 4.25, 1.86, 210, 18, 3, 2])
# n_components指定降维后的维数
pca = PCA(n_components=2)
print(pca)
# 应用于训练集数据进行PCA降维
pca.fit(X)
# 用X来训练PCA模型,同时返回降维后的数据
newX = pca.fit_transform(X)
print(newX)
# 将降维后的数据转换成原始数据,
pca_new = pca.transform(X)
print(pca_new.shape)
# 输出具有最大方差的成分
print(pca.components_)
# 输出所保留的n个成分各自的方差百分比
print(pca.explained_variance_ratio_)
# 输出所保留的n个成分各自的方差
print(pca.explained_variance_)
# 输出未处理的特征维数
print(pca.n_features_)
# 输出训练集的样本数量
print(pca.n_samples_)
# 输出协方差矩阵
print(pca.noise_variance_)
# 每个特征的奇异值
print(pca.ingular_values_)
# 用生成模型计算数据精度矩阵
print(pca.get_precision())

# 计算生成特征系数矩阵
covX = np.around(np.corrcoef(X.T), decimals=3)
# 输出特征系数矩阵
print(covX)
# 求解协方差矩阵的特征值和特征向量
featValue, featVec = np.linalg.eig(covX)
# 将特征进行降序排序
featValue = sorted(featValue)[::-1]

# 图像绘制
# 同样的数据绘制散点图和折线图
plt.scatter(range(1,  X.shape[1] + 1),  featValue)
plt.plot(range(1,  X.shape[1] + 1),  featValue)

# 显示图的标题
plt.title("Test Plot")
# xy轴的名字
plt.xlabel("Factors")
plt.ylabel("Eigenvalue")
# 显示网格
plt.grid()
# 显示图形
plt.show()

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>