哈喽,我是kk~
上周咱们有小伙伴面试了腾讯视频的算法岗位,据说是当成小白去面试的,比较在意基础理论的掌握。
实际项目没问多少,主要集中在论文 + 基础理论。
整整面试了3个小时,硬生生把学校时期的论文拽了回来!
校园时候的成绩不错,也好在当初用心完成论文以及好好学习基础理论。
咱们今天单拿出来一个问题和大家聊聊~
问:PCA在处理高维数据上的适用性?
下面,简单的和大家聊聊看,有问题随时评论区留言!~
PCA 本身大家很熟悉了,PCA 通过找到数据中的主要方差方向来减少数据的维度,从而更好地理解数据结构和模式。但是,对于高维数据,PCA是否适用仍然是一个值得思考的问题。
PCA通过线性变换将高维数据投影到低维空间上,这个投影方向可以最大程度地保留原始数据的方差。具体来说,在PCA中,我们首先需要计算协方差矩阵,然后找到协方差矩阵的特征值和特征向量。特征值表示了协方差矩阵中的每个特征的方差,而特征向量则描述了每个特征的方向。我们可以选择保留最大的特征值对应的特征向量,从而实现降维。
PCA公式推导
在推导PCA的过程中,假设我们有一个高维数据集X,其中每个样本包含d个特征。首先,我们需要计算协方差矩阵Σ,它可以通过以下公式表示:
其中,X是数据集,n是样本数,
是均值向量。
接下来,我们对协方差矩阵Σ进行特征分解,得到特征值和特征向量。特征值通过以下公式计算:
其中,v是特征向量,
是特征值。我们选择前k个最大的特征值对应的特征向量,组成投影矩阵W。然后,我们可以通过以下公式对原始数据集X进行降维处理:
处理高维数据的维度灾难
尽管PCA是一种有效的降维技术,但在处理高维数据时,可能会遇到维度灾难的问题。维度灾难是因为在高维空间中,样本之间的距离变得更加稀疏,同时计算量也大大增加。
为了解决维度灾难问题,我们可以采用以下策略:
特征选择:根据业务需求和对数据的理解,手动选择具有较高重要性的特征进行降维,而不是保留所有特征。
特征提取:使用其他降维技术,如非负矩阵分解(NMF)或独立成分分析(ICA),来提取更有意义的特征。
增量PCA:将数据集分成多个小批次,然后使用增量PCA逐步进行降维。这样可以减少计算复杂度和存储需求。
数据预处理:在应用PCA之前,进行数据预处理是很重要的。可以采用归一化、标准化等方法,使得数据在相同尺度上,从而更好地运用PCA。
相关代码
导入库:首先导入需要的库。
生成数据:生成一个二维的数据集,方便可视化。
标准化数据:标准化数据,使其均值为0,方差为1。
计算PCA:使用scikit-learn库中的PCA来计算主成分。
画出原理图:展示原数据、主成分方向和投影数据。
import numpy as npimport matplotlib.pyplot as pltfrom sklearn.decomposition import PCAfrom sklearn.preprocessing import StandardScaler# 1. 生成二维数据np.random.seed(0)X = np.dot(np.random.rand(2, 2), np.random.randn(2, 2000)).T# 2. 标准化数据scaler = StandardScaler()X_std = scaler.fit_transform(X)# 3. 计算PCApca = PCA(n_components=2)X_pca = pca.fit_transform(X_std)# 4. 绘制原理图def plot_pca(X, X_pca, pca): fig, ax = plt.subplots(1, 2, figsize=(12, 5)) # 原始数据和主成分方向 ax[0].scatter(X[:, 0], X[:, 1], alpha=0.2) for length, vector in zip(pca.explained_variance_, pca.components_): v = vector * 3 * np.sqrt(length) ax[0].plot([0, v[0]], [0, v[1]], '-k', lw=3) ax[0].set_title('Original Data with Principal Components') ax[0].axis('equal') # 投影后的数据 ax[1].scatter(X_pca[:, 0], X_pca[:, 1], alpha=0.2) ax[1].set_title('Data Projected onto Principal Components') ax[1].axis('equal') plt.show()plot_pca(X_std, X_pca, pca)
通过这个代码,你可以清楚地看到PCA如何找到数据中的主要方向,并将数据投影到这些方向上。
以上就是关于PCA在处理高维数据上的适用性以及解决维度灾难问题的介绍。
关于论文方面,我们最近组织了一个 1对1 的指导,感兴趣的同学可以扫码了解!~