首页
学习
活动
专区
圈层
工具
发布

PCA计算
EN

Data Science用户
提问于 2021-02-27 00:30:18
回答 1查看 292关注 0票数 0

考虑以下数据集:

现在,我们需要计算这些数据的主成分分析。以下是为该数据的协方差矩阵计算的特征值和特征向量:

因此,主要组成部分是:

现在,当我尝试用手做的时候,我发现特征值是1.28和0.0492 (与上面的解相同)。当然,主成分对应于特征值= 1.28。然而,当我试图求解特征向量时,解是[0],因为BX=0的增广矩阵是[1 0 0]。那么问题在哪里呢?另外,在计算主成分之后,如何找到转换后的数据?

编辑:协方差矩阵是

EN

回答 1

Data Science用户

发布于 2022-10-18 03:42:18

在开始做任何事情之前,进行一些探索性数据分析(EDA)是很有帮助的,这样您就可以大致了解您正在使用的数据以及您将要做的事情。

这是一幅数据图:

看起来,这个数据集中有很强的线性关系,所以这是一个强候选,因为使用PCA很可能只使用一个特征就可以捕获很大一部分方差。

方法1:手动(某种)

步骤1

首先,将数据集转换为矩阵。

\begin{array}{c|lcr} & \text{X} & \text{Y} \\ \hline 1 & 2.5 & 2.4\\ 2 & .5 & .7\\ 3 & 2.2 & 2.9\\ 4 & 1.9 & 2.2\\ 5 & 3.1 & 3.0\\ 6 & 2.3 & 2.7\\ 7 & 2.0 & 1.6\\ 8 & 1.0 & 1.1\\ 9 & 1.5 & 1.6\\ 10 & 1.1 & .9\\ \end{array} \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \textbf{A} = \begin{bmatrix} 2.5 & 2.4 \\ .5 & .7\\ 2.2 & 2.9\\ 1.9 & 2.2\\ 3.1 & 3.0\\ 2.3 & 2.7\\ 2.0 & 1.6\\ 1.0 & 1.1\\ 1.5 & 1.6\\ 1.1 & .9\\ \end{bmatrix}

步骤2

计算协方差矩阵。

回想一下,这是由以下几个方面指定的:

\begin{bmatrix} Var(x) & Con(x,y) \\ Cov(x,y) & Var(y)\\ \end{bmatrix}

为了计算这些值,我们需要得到平均值\bar{\text{X}}\bar{\text{Y}}

\bar{\text{X}} = { {2.5 \ + \ .5 \ + \ 2.2 \ + \ 1.9 \ + \ 3.1 \ + \ 2.3 \ + \ 2.0 \ + \ 1.0 \ + \ 1.5 \ + \ 1.1} \over {10} } = \fbox{1.81}
\bar{\text{Y}} = { {2.4 \ + \ .7 \ + \ 2.9 \ + \ 2.2 \ + \ 3.0 \ + \ 2.7 \ + \ 1.6 \ + \ 1.1 \ + \ 1.6 \ + \ .9} \over {10} } = \fbox{1.91}

我们通过插入公式中的值来计算Var(X)Var(Y)Cov(X,Y)的值:

Var(X) = { {\sum_{i=1}^n({x_i} - \bar{x})^2} \over {n-1} } = { {5.549} \over {9} } = \fbox{0.616555555556}
Var(Y) = { {\sum_{i=1}^n({y_i} - \bar{y})^2} \over {n-1} } = { {6.449} \over {9} } = \fbox{0.716555555556}
Cov(X,Y) = { {\sum_{i=1}^n({x_i} - \bar{x})({y_i} - \bar{y})} \over {n-1} } = { {5.539} \over {9} } = \fbox{.61544444444}

将这些结果放入矩阵中,得到协方差矩阵:

\begin{bmatrix} 0.61655556 & 0.61544444 \\ 0.61544444 & 0.71655556\\ \end{bmatrix}

步骤3

利用协方差矩阵的特征分解求出特征值。

使用公式A v = \lambda v,我们可以将它重写为(A-\lambda I)v=0,并注意这个方程在det(A-\lambda I)=0有一个解。

det = \Bigg| \begin{bmatrix} 0.61655556 & 0.61544444 \\ 0.61544444 & 0.71655556\\ \end{bmatrix} - \lambda \begin{bmatrix} 1 & 0 \\ 0 & 1 \\ \end{bmatrix} \Bigg| = 0
det = \Bigg| \begin{bmatrix} 0.61655556 & 0.61544444 \\ 0.61544444 & 0.71655556\\ \end{bmatrix} - \begin{bmatrix} \lambda & 0 \\ 0 & \lambda \\ \end{bmatrix} \Bigg| = 0
det = \Bigg| \begin{bmatrix} 0.61655556 - \lambda & 0.61544444 \\ 0.61544444 & 0.71655556 - \lambda \\ \end{bmatrix} \Bigg| = 0
(0.61655556 - \lambda)(0.71655556 - \lambda) \ - \ (0.61544444)(0.61544444) =
(\lambda^2 - 1.33311112 \lambda + .441796314567 - .378771858727) =
(\lambda^2 - 1.33311112 \lambda + .06302445584) =
\textbf{Eigen Values:} \ \lambda = \fbox{.0490834} \ \text{or} \ \lambda = \fbox{1.2840277}

步骤4(这里是我们不能单独手工进行的地方)

找到艾根矢量。

对于第一个特征向量v_1\lambda = .0490834

使用公式A v_1 = \lambda_1 v_1

\begin{bmatrix} 0.61655556 - \lambda & 0.61544444 \\ 0.61544444 & 0.71655556 - \lambda \\ \end{bmatrix} \begin{bmatrix} v_{1,1} \\ v_{1,2} \\ \end{bmatrix} = 0
\begin{bmatrix} 0.61655556 - .0490834 & 0.61544444 \\ 0.61544444 & 0.71655556 - .0490834 \\ \end{bmatrix} \begin{bmatrix} v_{1,1} \\ v_{1,2} \\ \end{bmatrix} = 0
\begin{bmatrix} .56747216 & 0.61544444 \\ 0.61544444 & .66747216 \\ \end{bmatrix} \begin{bmatrix} v_{1,1} \\ v_{1,2} \\ \end{bmatrix} = 0

注:这不是一个简单的方程,用手解决!我建议在这里使用MATLAB。

关于第二特征向量v_2\lambda = 1.2840277

使用公式A v_2 = \lambda_1 v_2

\begin{bmatrix} 0.61655556 - \lambda & 0.61544444 \\ 0.61544444 & 0.71655556 - \lambda \\ \end{bmatrix} \begin{bmatrix} v_{2,1} \\ v_{2,2} \\ \end{bmatrix} = 0
\begin{bmatrix} 0.61655556 - 1.2840277 & 0.61544444 \\ 0.61544444 & 0.71655556 - 1.2840277 \\ \end{bmatrix} \begin{bmatrix} v_{2,1} \\ v_{2,2} \\ \end{bmatrix} = 0
\begin{bmatrix} -.667477214 & 0.61544444 \\ 0.61544444 & -.61655554 \\ \end{bmatrix} \begin{bmatrix} v_{2,1} \\ v_{2,2} \\ \end{bmatrix} = 0

注:这不是一个简单的方程,用手解决!我建议在这里使用MATLAB。

由于手工求解这两个特征向量不是一种容易的方法,我建议使用MATLAB。

MATLAB代码:

代码语言:javascript
复制
A = [0.61655556 0.61544444; 0.61544444 0.71655556]
A

[v,d]=eig(A)

v

输出:

代码语言:javascript
复制
-0.735178655741955  0.677873398313764
0.677873398313764   0.735178655741955

方法2(使用NumPy)

我们可以用NumPy验证上述结果。

代码语言:javascript
复制
import numpy as np

# create a numpy array that stores the data matrix
matrix = np.array([[2.5, 2.4], [.5, .7], [2.2, 2.9], [1.9, 2.2], [3.1, 3.0],
                  [2.3, 2.7],[2.0, 1.6],[1.0, 1.1],[1.5, 1.6], [1.1, .9]])

# calculate the covariance matrix
covariance_matrix = np.cov(matrix[:,0], matrix[:,1])

# create variables to store the Eigen values and Eigen vectors 
eigen_values, eigen_vectors = np.linalg.eig(covariance_matrix)

输出:

特征值:

代码语言:javascript
复制
array([0.0490834 , 1.28402771])

特征向量:

代码语言:javascript
复制
array([[-0.73517866, -0.6778734 ],
       [ 0.6778734 , -0.73517866]])

方法3(使用scikit-learn)

使用上面在matrix示例中定义的相同的NumPy变量:

代码语言:javascript
复制
from sklearn.decomposition import PCA
import pandas as pd

# create and fit a PCA model
pca = PCA(n_components=2)
pca.fit(matrix)

# show the Eigen vector
pca.components_

# show the Eigen values
pca.explained_variance_

输出:

特征向量:

代码语言:javascript
复制
[[-0.6778734  -0.73517866]
 [-0.73517866  0.6778734 ]]

特征值:

代码语言:javascript
复制
[1.28402771 0.0490834 ]

最后,我们可以给出表示主轴方向和大小的图形向量。正如您所看到的,第一个组件更长,因为它解释了更多的差异。我们还可以使用一个特性将数据投影到第一个主组件上。

结论:总之,虽然你可以用手计算这个问题的很大一部分,但一旦你到了计算特征向量的部分,这就变得相当困难。在这一点上,我建议使用一种计算方法,例如使用MATLAB、NumPy或scikit-learn。

票数 1
EN
页面原文内容由Data Science提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://datascience.stackexchange.com/questions/90007

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档