机器学习--PCA降维

一、引言

在当今数据爆炸的时代,数据量急剧增长且维度越来越高。高维数据虽然包含丰富信息,但也带来诸多问题,如计算复杂度增加、“维度灾难” 等。降维技术作为处理高维数据的有效手段应运而生,其中主成分分析(Principal Component Analysis,PCA)是一种广泛应用的线性降维算法。本文将深入探讨 PCA 降维技术的原理、应用场景及代码实现,带你全面认识这一强大工具。

二、PCA 原理详解

(一)数据的向量空间表示

我们将数据集看作是向量空间中的点。例如,对于一个具有 n 个样本,每个样本有 m 个特征的数据集,每个样本可以表示为一个 m 维向量。这些向量构成了一个 m 维向量空间。

(二)方差与协方差

  1. 方差:方差用于衡量数据在某个特征维度上的分散程度。方差越大,说明该维度上的数据越分散,蕴含的信息可能越多。数学公式为:

\(Var(X)=\frac{1}{n}\sum_{i = 1}^{n}(x_i-\overline{x})^2\)

其中,\(x_i\)是数据点,\(\overline{x}\)是均值,n 是数据点数量。

  1. 协方差:协方差用于衡量两个特征维度之间的相关性。如果两个维度的变化趋势相似,协方差为正;反之,为负。公式为:

\(Cov(X,Y)=\frac{1}{n}\sum_{i = 1}^{n}(x_i-\overline{x})(y_i-\overline{y})\)

(三)PCA 的核心思想

PCA 的目标是找到一组新的正交基,将原始数据投影到这些基上,使得数据在新基上的方差最大。这些新的基就是主成分。通过保留方差较大的主成分,去除方差较小的成分,实现数据降维,同时尽可能保留数据的主要信息。

  1. 计算数据的协方差矩阵:对于一个 m 维数据集,其协方差矩阵是一个 m×m 的矩阵,其中每个元素\(C_{ij}\)表示第 i 个特征和第 j 个特征的协方差。
  1. 对协方差矩阵进行特征值分解:得到特征值\(\lambda_i\)和对应的特征向量\(v_i\)。特征值表示数据在对应特征向量方向上的方差大小。
  1. 选择主成分:按照特征值从大到小排序,选取前 k 个特征向量,它们对应的主成分能够保留大部分数据方差。k 通常远小于原始维度 m,从而实现降维。

三、PCA 的应用场景

(一)数据可视化

高维数据难以直接可视化,通过 PCA 将数据降到 2 维或 3 维,可以在平面或空间中直观展示数据分布,帮助分析数据结构和规律。

(二)数据压缩

在存储和传输数据时,高维数据占用大量空间和带宽。PCA 降维后可以减少数据存储量和传输量,同时保留关键信息。

(三)机器学习算法加速

在一些机器学习算法中,如 K 近邻(KNN)、支持向量机(SVM)等,高维数据会导致计算量大幅增加。使用 PCA 对数据降维,可以加速算法运行,提高效率,同时在某些情况下还能避免过拟合。

(四)去除噪声

高维数据中往往包含噪声,噪声通常在方差较小的维度上。PCA 通过去除低方差维度,可以在一定程度上过滤掉噪声,提高数据质量。

四、PCA 代码实现(Python 示例)

下面使用 Python 和 Scikit - learn 库实现 PCA 降维。

from sklearn.decomposition import PCA
import pandas as pd

data=pd.read_excel('电信客户流失数据.xlsx')

x=data.iloc[:,:-1]
y=data.iloc[:,-1]

pca=PCA(n_components=8)
pca.fit(x)

#pca.explained_variance_ratio_ 是一个数组,包含了每个主成分所解释的方差比例
print('特征所占百分比:{}'.format(sum(pca.explained_variance_ratio_)))
print(pca.explained_variance_ratio_)

# 使用 transform 方法将原始数据 x 转换为降维后的数据
# 该方法会根据之前 fit 步骤计算出的主成分,将原始数据投影到这些主成分上,得到降维后的数据
print('PCA降维后的数据:')
new_x=pca.transform(x)
print(new_x)

from sklearn.model_selection import train_test_split
x_train_w,x_test_w,y_train_w,y_test_w=train_test_split(new_x,y,test_size=0.3,random_state=1000)


from sklearn.linear_model import LogisticRegression
lr=LogisticRegression(C=0.01,max_iter=1000)#C正则化系数的倒数
lr.fit(x_train_w,y_train_w)

test_predicted=lr.predict(x_test_w)
result=lr.score(x_test_w,y_test_w)
print(result)

from sklearn import metrics
print(metrics.classification_report(y_test_w,test_predicted))

在上述代码中,首先导入必要的库。然后生成一个简单的二维数据集。接着创建 PCA 对象,指定降维后的维度为 1。使用fit_transform方法对数据进行拟合和转换,得到降维后的数据。最后查看主成分和每个主成分解释的方差比例。

五、总结

PCA 作为一种强大的降维技术,在数据处理和机器学习领域发挥着重要作用。通过理解其原理,我们能够明白它是如何在保留数据主要信息的同时降低维度。在实际应用中,PCA 在数据可视化、压缩、算法加速等方面都有出色表现。掌握 PCA 的代码实现,能够帮助我们在项目中快速应用这一技术解决实际问题。