PCA主成分分析

目录

  • 1. 理解
  • 2 方法
  • 3 代码
    • 3.1 numpy
    • 3.2 Sklearn

1. 理解

PCA是一种无监督学习的数据降维度的方法。 简单来说, 就是将原始数据映射到一个特征空间,以达到数据维度降低的目的。这个特征空间就是由主成分构成的空间。主成分本质上来说就是原始数据变量的一个线性组合。 理论上来说,主成分的数量最多可以等于原始数据的维度。事实上, 在解决实际问题时, 我们可以允许极少部分信息的损失。因此, 我们可以选择一小部分主成分来构成我们的特征空间,通过将原始数据映射到这个特征空间来达到降维的目的。

数据维度降低了, 当应用机器学习方法时,就能更快的产生结果,并且是更好的结果。输入的数据维度降低了,计算量就小了因而加快了机器学习的速度;而且,应用PCA也提取出了数据的特征,一定程度上能帮助机器学习产生更好的结果。举个例子,在早期的人脸识别中,我们不是将原始的图像作为分类算法的输入,而是通过PCA提取出eigenfaces,再进行分类。

2 方法

首先,我们要实现的就是用少数的主成分包含原始数据的大部分信息。 在下面这个例子中,原始数据是二维的,我们能找到一个主成分(粉色的那条直线),它能包含最多的数据信息(数据投影到该直线上时最离散), 实际上还有一个与它正价交的主成分,如果我们进行数据降维,可以将该主成分省略,因为它只包含了少量的数据信息。
PCA主成分分析_第1张图片
主成分之间是正交的(其实就是垂直),因为希望每个主成分之间是相互独立的,这里的独立是讲一个主成分投影到另一个主成分时,只是一个点,我的理解是这样就不会包含重复的信息了。

具体的步骤如下图。(直接截了一张研究生作业的图),就是计算特征值和特征向量。特征向量就是主成分了。
PCA主成分分析_第2张图片

3 代码

3.1 numpy

如何求解特征值和特征向量

求解 Σ = [ 1 0.5 0.5 1 ] \Sigma = \begin{bmatrix}1 & 0.5\\\\0.5 &1\end{bmatrix} Σ=10.50.51 的特征值 λ \lambda λ 和特征向量 ν \nu ν

import numpy as np

M = np.array([[1, 0.5],[0.5, 1]])

eigenvalues, eigenvectors = np.linalg.eig(M)

eigenvalues
# array([1.5, 0.5])

eigenvectors
# array([[ 0.70710678, -0.70710678],
#       [ 0.70710678,  0.70710678]])

# 注意,每一列是才是主成分/特征向量,与上面的特征值一一对应
PCA1 = eigenvectors[:,0] # array([0.70710678, 0.70710678])
PCA2 = eigenvectors[:,1] # array([-0.70710678,  0.70710678])

# 计算主成分包含信息比率
explained_variance_PCA1 =eigenvalues[0]/(eigenvalues[0]+eigenvalues[1])
explained_variance_PCA2 =eigenvalues[1]/(eigenvalues[0]+eigenvalues[1])

3.2 Sklearn

真实数据时操作

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA

# Load dataset
data = pd.read_csv('XXXX.csv')
data.head()

# Standardize the data
data = StandardScaler().fit_transform(df_final)
# Look through the standardized data
pd.DataFrame(data).head()

# principal component analysis
pca = PCA()
pca.fit(data)

# 将数据投影到主成分上
projected_data = pca.transform(data) 

# 保留投影在PCA1, PCA2上的值
print(projected_data[:,0:2])


# 输出主成分
print(pca.components_)

# 输出特征值
print(pca.explained_variance_)

# 计算主成分包含信息比率
print(pca.explained_variance_ratio_)
# Plot the explained variance ratio
plt.plot(range(1, len(df_final.columns)+1), np.cumsum(pca.explained_variance_ratio_*100),'-o')
plt.xlabel('The Number of Components')
plt.ylabel('Cumulative Explained Variance Ratio')
plt.grid()
plt.show()

你可能感兴趣的:(Machine,Learning)