在开始做任何事情之前,进行一些探索性数据分析(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代码: A = [0.61655556 0.61544444; 0.61544444 0.71655556]
A
[v,d]=eig(A)
v输出:
-0.735178655741955 0.677873398313764
0.677873398313764 0.735178655741955方法2(使用NumPy) 我们可以用NumPy验证上述结果。
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)输出: 特征值:
array([0.0490834 , 1.28402771])特征向量:
array([[-0.73517866, -0.6778734 ],
[ 0.6778734 , -0.73517866]])方法3(使用scikit-learn) 使用上面在matrix示例中定义的相同的NumPy变量:
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_输出:
特征向量:
[[-0.6778734 -0.73517866]
[-0.73517866 0.6778734 ]]特征值:
最后,我们可以给出表示主轴方向和大小的图形向量。正如您所看到的,第一个组件更长,因为它解释了更多的差异。我们还可以使用一个特性将数据投影到第一个主组件上。
结论:总之,虽然你可以用手计算这个问题的很大一部分,但一旦你到了计算特征向量的部分,这就变得相当困难。在这一点上,我建议使用一种计算方法,例如使用MATLAB、NumPy或scikit-learn。