2026/5/18 17:57:38
网站建设
项目流程
自己做的网站涉黄,网站设计 分辨率,wordpress 悬浮通知,网站制作需要多少钱kDay 87#xff1a;【99天精通Python】机器学习进阶 - PCA 降维 - 抓住数据的主干
前言
欢迎来到第87天#xff01;
在机器学习中#xff0c;我们经常遇到高维数据。比如#xff0c;一张 100x100 像素的图片#xff0c;拉平后就是 10000 个特征#xff1b;一份…Day 87【99天精通Python】机器学习进阶 - PCA 降维 - 抓住数据的主干前言欢迎来到第87天在机器学习中我们经常遇到高维数据。比如一张 100x100 像素的图片拉平后就是 10000 个特征一份用户调查问卷可能有上百个问题。特征太多会带来维度灾难 (Curse of Dimensionality)计算量大模型训练极慢。过拟合模型学到了太多噪声泛化能力差。无法可视化超过三维的数据人类就看不懂了。降维 (Dimensionality Reduction)就是在尽可能保留原始信息的前提下用更少的特征来表示数据。主成分分析 (Principal Component Analysis, PCA)是最经典、最常用的降维方法。本节内容PCA 原理旋转坐标轴Sklearn 中的PCA如何选择降维后的维度 (n_components)可视化降维效果实战练习手写数字降维与重建一、PCA 原理找到最重要的方向PCA 的目标是找到一个新的坐标系在这个坐标系下数据点的方差最大。方差越大代表信息量越丰富。这些新的坐标轴就叫做主成分 (Principal Components)。[外链图片转存中…(img-1L5jRPDv-1768773842454)]上图中PC1 是方差最大的方向第一个主成分PC2 是与 PC1 正交且方差次大的方向。如果我们只想保留一维那么所有点都投影到 PC1 轴上这就是降维。二、Sklearn 实现我们用一个三维数据来演示。importnumpyasnpfromsklearn.decompositionimportPCAimportmatplotlib.pyplotasplt# 1. 创建一个 3D 数据集np.random.seed(42)Xnp.dot(np.random.rand(2,2),np.random.randn(2,200)).T X[:,1]0.5*X[:,0]Xnp.hstack([X,0.1*np.random.randn(200,1)])# 增加一个噪声维度# 2. 初始化 PCA# n_components2: 我们想降到 2 维pcaPCA(n_components2)# 3. 训练并转换X_2dpca.fit_transform(X)# 4. 查看结果print(f原始形状:{X.shape})# (200, 3)print(f降维后形状:{X_2d.shape})# (200, 2)# 可视化对比figplt.figure(figsize(10,5))ax1fig.add_subplot(121,projection3d)ax1.scatter(X[:,0],X[:,1],X[:,2])ax1.set_title(Original 3D Data)ax2fig.add_subplot(122)ax2.scatter(X_2d[:,0],X_2d[:,1])ax2.set_title(PCA to 2D)# plt.show()三、如何选择降维的维度通常我们不会直接指定n_components2而是让 PCA 帮我们决定。一个常见的做法是保留 95% 的信息。3.1 解释方差比 (Explained Variance Ratio)# 初始化时不指定 n_componentspcaPCA()pca.fit(X)# 查看每个主成分能解释的方差比例print(pca.explained_variance_ratio_)# 查看累计方差比cumulative_variancenp.cumsum(pca.explained_variance_ratio_)plt.plot(range(1,len(cumulative_variance)1),cumulative_variance,markero)plt.xlabel(Number of Components)plt.ylabel(Cumulative Explained Variance)plt.grid(True)# plt.show()3.2 自动选择我们可以直接在 PCA 中设置保留的方差比例。# 自动选择能保留 95% 方差的主成分数量pcaPCA(n_components0.95)X_reducedpca.fit_transform(X)print(f保留95%信息后维度变为:{X_reduced.shape[1]})四、实战MNIST 降维与可视化手写数字图片是 28x28 784 维的我们无法直接可视化。我们可以用 PCA 把它降到 2 维然后画出来看看不同数字是否能自动分开。fromsklearn.datasetsimportfetch_openmlfromsklearn.preprocessingimportStandardScaler# 1. 加载数据 (只取 5000 个否则太慢)X,yfetch_openml(mnist_784,version1,return_X_yTrue,as_frameFalse)X,yX[:5000],y[:5000]# 2. 标准化scalerStandardScaler()X_scaledscaler.fit_transform(X)# 3. PCA 降维pcaPCA(n_components2)X_pcapca.fit_transform(X_scaled)# 4. 可视化plt.figure(figsize(10,8))y_numericy.astype(int)plt.scatter(X_pca[:,0],X_pca[:,1],cy_numeric,cmapplt.cm.get_cmap(jet,10),alpha0.6)plt.colorbar(labelDigit Label)plt.xlabel(Principal Component 1)plt.ylabel(Principal Component 2)plt.title(PCA of MNIST Dataset)# plt.show()从图中可以看出PCA 成功地把一些相似的数字如 1 和 7在二维空间中分开了。五、降维 vs 特征选择特征选择 (Feature Selection)从原有特征中挑选出一部分如 100 个特征里选 10 个。PCA 降维将原有特征线性组合创造出全新的、更少的主成分特征。PCA 保留了所有特征的信息只是权重不同而特征选择会完全丢弃某些特征。六、常见问题Q1PCA 需要标准化吗必须PCA 是基于方差的。如果某个特征的数值范围特别大如收入它会主导整个 PCA 的计算导致其他特征被忽略。Q2降维后能恢复吗可以但会丢失一部分信息。X_reconstructed pca.inverse_transform(X_reduced)Q3PCA 是最好的降维方法吗不是。PCA 只能做线性降维。对于复杂的非线性结构如瑞士卷需要用t-SNE或UMAP。七、小结PCA 降维核心思想Sklearn 实现选择维度寻找方差最大的方向线性组合PCA(n_components...)fit_transform()指定数量: n_components2指定比例: n_components0.95画图: Explained Variance关键要点PCA是处理高维数据的利器能有效减少计算量和噪声。降维前必须对数据进行标准化。通过explained_variance_ratio_可以判断降维保留了多少信息。八、课后作业图像压缩读取一张灰度图片将其reshape成一个长向量用 PCA 降维保留 80% 信息然后再inverse_transform恢复成图片看看和原图有多大差别。t-SNE查阅sklearn.manifold.TSNE用它来对 MNIST 数据进行降维并与 PCA 的结果进行对比。人脸识别加载 sklearn 自带的fetch_lfw_people数据集使用 PCA SVM 进行人脸识别分类。下节预告Day 88实战篇总结与项目复盘- 我们的实战篇Day 46-87即将结束。明天我们将对数据分析和机器学习部分进行全面复盘并展望最终的项目篇二系列导航上一篇Day 86 - K-Means聚类下一篇Day 88 - 实战篇总结待更新