PCA(主成分分析)是什么
降维算法:保留原始数据的关键信息
注意:在降维过程中,维度通常是指特征的数量,而不是空间的维度。
主成分分析(PCA)是一个常见的特征提取方法,它通过找到数据中的主成分(方差最大的方向)来实现降维。
通俗理解,就是寻找新的坐标系,使得数据尽可能分布在一个或几个坐标轴上,同时尽可能保留原先数据分布的主要信息,使原先高维度的信息,在转换后能用低维度的信息来保存。而新坐标系的坐标轴,称为主成分(Principal components, PC),这也就是PCA的名称来源。
为什么找方差最大的方向?
在信号处理领域中认为信号具有较大的方差,噪声有较小的方差;信噪比就是信号与噪声的方差比,越大意味着数据的质量越好。
PCA(主成分分析)用来干什么的,好处
通过保留主要特征来捕捉数据的重要结构,使得模型更快收敛。
展开来说,PCA去除噪声和不重要的特征,将多个指标转换为少数几个主成分,这些主成分是原始变量的线性组合,且彼此之间互不相关,其能反映出原始数据的大部分信息,而且可以提升数据处理的速度。
PCA(主成分分析)怎么实现的(三步)
PCA方法的总结
标准化(去中心化);
从协方差矩阵或相关矩阵中获取特征向量和特征值,或执行奇异值分解SVD;
按降序对特征值进行排序,并选择 k k k个与最大特征值相对应的特征向量,其中 k k k是新特征子空间的维数( k ≤ p k≤p k≤p);
将选择的 k k k个特征向量构造为投影矩阵 W W W;
通过 W W W对原始数据集 X X X进行变换,得到 k k k维特征子空间 Y Y Y。
准备数据集
关于Iris数据集
scikit-learn中的鸢尾花数据集(Iris dataset),一共包含150张图片。
3种鸢尾花:山鸢尾(50张)、杂色鸢尾(50张)、维吉尼亚鸢尾(50张)。
4个特征:萼片长度(厘米)、萼片宽度(厘米)、花瓣长度(厘米)、花瓣宽度(厘米)。
加载数据集
加载数据集
import pandas as pd
# load-dataset
df = pd.read_csv(
filepath_or_buffer='https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data',
header=None,
sep=',')
df.columns = ['sepal_len', 'sepal_wid', 'petal_len', 'petal_wid', 'class']
df.dropna(how="all", inplace=True) # drops the empty line at file-end
df.tail()
运行结果
划分成 数据 X X X、标签 y y y
# split data table into data X and class labels y
X = df.iloc[:, 0:4].values
y = df.iloc[:, 4].values
数据集为 150 × 4 150×4 150×4的矩阵,不同列代表不同特征,每行为1个样本,每个样本行x可以被描述为一个4维向量。
可视化数据分布
from matplotlib import pyplot as plt
import seaborn as sns
# 设置 seaborn 的样式为 whitegrid
sns.set_style("whitegrid")
label_dict = {
1: 'Iris-Setosa',
2: 'Iris-Versicolor',
3: 'Iris-Virgnica'}
feature_dict = {
0: 'sepal length [cm]',
1: 'sepal width [cm]',
2: 'petal length [cm]',
3: 'petal width [cm]'}
plt.figure(figsize=(8, 6))
for cnt in range(4):
plt.subplot(2, 2, cnt + 1)
for lab in ('Iris-setosa', 'Iris-versicolor', 'Iris-virginica'):
plt.hist(X[y == lab, cnt],
label=lab,
bins=10,
alpha=0.3, )
plt.xlabel(feature_dict[cnt])
plt.legend(loc='upper right', fancybox=True, fontsize=8)
plt.tight_layout()
plt.show()
运行结果
标准化
归一化:将数据映射到[0,1]或[-1,1]区间范围内,不同特征的量纲不同,值范围大小不同,存在奇异值,对训练有影响。
标准化:将数据映射到满足标准正态分布的范围内,使数据满足均值为0,标准差为1。
去中心化:使数据满足均值为0,但对标准差没有要求。
每种方法对应的使用场景
1.若对数据的范围没有限定要求,则选择标准化进行数据预处理
2.若要求数据在某个范围内取值,则采用归一化。
3若数据不存在极端的极大极小值时,采用归一化。
4.若数据存在较多的异常值和噪音,采用标准化。
标准化过程如下:
1、计算每个特征(每一列,共p个特征)的均值 x i ˉ \bar{x_i} xiˉj和标准差 S j S_j Sj,公式如下: x i ˉ = 1 n ∑ i = 1 n x i j \bar{x_i}=\frac{1}{n}\sum_{i=1}^nx_{ij} xiˉ=n1i=1∑nxij S j = ∑ i = 1 n ( x i j − x j ˉ ) 2 n − 1 S_j=\sqrt{\frac{\sum_{i=1}^n(x_{ij}-\bar{x_j})^2}{n-1}} Sj=n−1∑