在本文中,我们将讨论主成分分析(PCA),它是什么?它是如何工作的?在哪里使用?首先,我们将研究PCA背后的技术细节,并将其应用于众所周知的iris数据集并讨论结果。但是,读者应该具备线性代数和统计分析的知识;至少了解矩阵运算和方差/协方差。

主成分分析是什么?

PCA是一种在数据集中提取模式的统计技术,是降维方法,但实际上不止这些。PCA只是转换您的数据集以识别隐藏的关系,相似性或差异,然后您可以在其输出上进行降维,数据压缩或特征提取。然而,PCA是最着名的并且用于减少数据集的维度,这就是我们将在本文中做的事情:使用PCA降低维数。

您应该在这里提出这个问题:为什么我们需要减少数据集中的维度?那不是失去信息吗?是的,当我们丢弃数据中的一些维度时,我们就会丢失信息。然而,在某些情况下,我们的数据可以有许多特征或变量来应用机器学习技术进行分类或聚类。想想亚马逊视频、Youtube或Netflix的用户数据集,每个视频内容都是一个变量或特性,当您需要提取用户或视频之间的相似性并生成推荐时,它们可能是百万维的。

简单地说,数据的维度越多,处理起来就越困难。采用PCA、LDA等降维技术,是从数据中提取新的强大的特征,使用这些新的特征或组件代替原始的特征。

主成分分析是如何运作的吗?

为了分析和建立新的数据集(减少了维度)从原始的数据集由PCA,一般采用以下步骤:

  1. 获取数据集
  2. 计算数据的协方差矩阵
  3. 计算特征值和特征向量除以协方差矩阵
  4. 选择主成分
  5. 从选定的组件构造新的特征数据集

让我们讨论并将每个步骤逐个应用到iris数据集。

1.获取数据集

正如我们所说,iris数据集是本文中的目标数据集。数据有4个特征或变量; 或矩阵代数中的4维。并且,1个目标向量显示依赖于4个特征的花的类型。所以,问题在于四维。4D并不多,但我们会尝试将其缩小为2D以说明PCA。让我们开始加载数据:

# sklearn has built-in iris dataset

iris数据集的协方差矩阵

3.计算特征值和特征向量

特征值和特征向量是PCA的核心; 不仅在PCA中,而且在其他如SVD,LDA中也是如此。但为什么他们如此重要?特征值和特征向量相关联构成了矩阵方程的根特征。我将把这个解释留给这个来源,并继续使用PCA的特征向量和特征值的重要特征。

我们需要了解它们的3个简单特征:首先,我们只能计算方阵的特征值/特征向量(nxn,矩阵的协方差)。其次,特征向量彼此垂直/正交。如果我们有n维矩阵,那么我们在n空间中有n个特征向量,并且它们都是垂直的。这是有道理的,因为它们都构成了它们所代表的数据。最后,特征向量的长度恰好为1,并且每个特征向量具有相应的特征值,其表示向量的幂。

由于我们正在寻找新的特征来减少数据的维数,因此计算数据协方差矩阵的特征向量来寻找具有显著性(特征值)的patterns (特征向量)。协方差矩阵的特征向量将代表新的特征,我们将根据它们的特征值幂或影响来选择其中的一些特征。我们在iris示例中做这个。我们已经有了协方差矩阵它是一个方阵!

# numpy linear algebra module eig() api

# Compute the eigenvalues and eigenvectors of a square array

eig_values, eig_vectors = np.linalg.eig(R_cov)

# print values and corresponding vectors

eig_values

eig_vectors

pca主成分分析总得分(PCA主成分分析)(1)

iris数据集协方差矩阵的特征值

pca主成分分析总得分(PCA主成分分析)(2)

iris数据集协方差矩阵的特征向量

4、选择主成分

从第一个结果中,我们得到了数据中每个维度的特征值,以及相应的特征向量。我们需要知道的是,将特征值从高到低排序。然后,我们选取一些值最高的特征向量来构建我们的新特征。

正如我们前面讨论的,特征值代表一个向量的影响或力量,所以我们必须选择特征值较高的特征向量。在这种情况下,由于我们希望将虹膜数据的维数减少到2,我们将选择第一个特征向量,因为它们的特征值是结果中最高的2。所选择的最高值特征向量将是我们构建新特征和简化数据集的主要组成部分。我们把这个矩阵叫做新特征向量。

# pick 2 eigenvectors whose eigenvalues are highest

featureVector = eig_vectors[:,:2]

featureVector

pca主成分分析总得分(PCA主成分分析)(3)

选择2个特征值最高的特征向量

通过丢弃一些特征值/特征向量,我们将丢失一些信息。但是,由于我们选择具有最高价值或重要性的组件,因此这种松散是合理的。通过删除,我们将使用较少维度的数据来工作。

5.构建新的简化数据集

为了建立新的数据集,我们需要将原始矩阵(R)的转置乘以新特征向量的转置(选择的主要成分)。

pca主成分分析总得分(PCA主成分分析)(4)

为什么我们乘以原始数据集和主成分的转置是为了获得我们选择的特征向量的新数据。我知道它似乎很复杂但你可以找到迄今为止采取的这些步骤的视觉解释。

pca主成分分析总得分(PCA主成分分析)(5)

使用矩阵可视化在PCA中应用的步骤

这里是为iris数据集生成新2D数据的Python代码

featureVector_t = np.transpose(featureVector)

# R is the original iris dataset

R_t = np.transpose(R)

newDataset_t = np.matmul(featureVector_t, R_t)

newDataset = np.transpose(newDataset_t)

# check the shape of new reduced 2D dataset

newDataset.shape

最后,我们得到了二维简化的新数据集。当然,它已经丢失了一些信息,但是由于我们选择了两个主要的特征向量,我们从选定的分量中构建的新特征应该足够更进一步。

现在,我们来想象一下。首先,我们的数据集有4个维度,不可能绘制,但这是一个2D数据,很容易绘制。

import seaborn as sns

import pandas as pd

%matplotlib inline

# create new DataFrame

df = pd.DataFrame(data=newDataset, columns=['PC1', 'PC2'])

y = pd.Series(iris.target)

y = y.replace(0, 'setosa')

y = y.replace(1, 'versicolor')

y = y.replace(2, 'virginica')

df['Target'] = y

# plot 2D data

sns.lmplot(x='PC1', y='PC2', data=df, hue='Target', fit_reg=False, legend=True)

pca主成分分析总得分(PCA主成分分析)(6)

二维简化数据图

从上面的图中,现在可以很容易地对两个主成分的样本进行分类或聚类。虽然由于删除了其他次要组件而丢失了一些信息,但是现在我们手里有了更多可解释的数据。最好的是它仍然非常接近原始数据。

结论

我们将原始虹膜数据集中的维度缩减到理想的大小(2D),并产生了新的特性。现在,在新的数据集中应用进一步的技术将更加有效。对于这个iris示例,我们并没有获得太多,可以考虑亚马逊、Youtube和Netflix等大公司的数据集。

然后我们可以继续应用我们的分类/聚类技术,在新的数据集或主组件上找到最好的MSE/MAE。如果结果不能满足我们的要求,我们可以尝试改变组件数量,或者可以应用其他类似的降维方法,比如SVD或LDA。

,