尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

用MLAlgorithms做降维:PCA主成分分析的代码实现与几何直觉完全指南

用MLAlgorithms做降维:PCA主成分分析的代码实现与几何直觉完全指南 用MLAlgorithms做降维PCA主成分分析的代码实现与几何直觉完全指南【免费下载链接】MLAlgorithmsMinimal and clean examples of machine learning algorithms implementations项目地址: https://gitcode.com/gh_mirrors/ml/MLAlgorithmsMLAlgorithms是一个用最小、最干净的代码实现机器学习算法的开源项目其中 mla/pca.py 仅用 60 多行 Python 就完整实现了PCA 主成分分析——一种最常用的数据降维算法。对于初学者来说读这份源码比啃优化过的 sklearn 内部实现要轻松得多是理解「PCA 到底在做什么」的最佳切入点。一、为什么需要降维高维数据有三个经典痛点计算贵100 个特征的分类问题比 2 个特征慢几十倍噪声多很多特征对结果毫无贡献反而干扰模型维度灾难看不清人眼只能看 2D/3D想把数据画出来就必须降维。PCA 的思路一句话概括把一堆可能相关的特征旋转成几个互不相关的主成分并按方差从大到小排序。前几个主成分就保留了数据中绝大部分的变化信息。几何直觉找数据伸展的方向想象 1000 个点在二维平面上排成一条斜着的椭圆中心化先把数据平移到原点减均值旋转找到椭圆长轴方向——这是数据变化最大的方向即第一主成分正交约束第二主成分必须与第一主成分垂直取剩余变化最大的方向丢弃如果短轴方向的波动只有长轴的 1%丢掉它几乎不损失信息。PCA 的输出components就是这组旋转方向向量行向量把数据乘上它的转置就完成了换坐标轴。二、项目里的 PCA 长什么样整个核心实现集中在 mla/pca.py类定义在第 12 行class PCA(BaseEstimator): y_required False # 无监督任务不需要标签 y它继承自 mla/base/base.py 的BaseEstimator该文件第 5 行统一了fit / transform / predict的接口风格与 scikit-learn 的用法几乎一致——这点对新手很友好。三个关键方法方法代码位置作用fitmla/pca.py#L35-L37计算均值 分解_decomposemla/pca.py#L39-L55中心化、SVD/特征分解、求方差解释比transformmla/pca.py#L57-L60投影到主成分空间核心逻辑逐行看_decompose是灵魂mla/pca.py#L39-L55def _decompose(self, X): X X.copy() X - self.mean # ① 均值中心化 if self.solver svd: _, s, Vh svd(X, full_matricesTrue) # ② SVD 分解 elif self.solver eigen: s, Vh np.linalg.eig(np.cov(X.T)) # ② 协方差矩阵特征分解 Vh Vh.T s_squared s**2 variance_ratio s_squared / s_squared.sum() # ③ 方差解释比 self.components Vh[0 : self.n_components] # ④ 取前 k 个方向对应上面四步几何直觉① 中心化 → ② 求方向 → ③ 看每个方向保留了多少方差 → ④ 只留下前 k 个方向。transform则只是一次矩阵乘法mla/pca.py#L57-L60先减均值再X components.T把每个样本读成新坐标。两个求解器怎么选solversvd默认基于scipy.linalg.svd数值更稳定、更推荐solvereigen走协方差矩阵特征分解是教科书式写法便于对照公式理解。两者数学上等价。三、快速上手从安装到运行示例安装项目git clone https://gitcode.com/gh_mirrors/ml/MLAlgorithms cd MLAlgorithms pip install -r requirements.txt python setup.py develop依赖很轻只需 requirements.txt 里的 numpy、scipy 等科学计算库。运行 PCA 官方示例不安装也能直接跑项目自带示例模块 examples/pca.pypython -m examples.pca这个示例做了一个完整的降维 分类流水线步骤拆解用 sklearn 造一个1000 样本 × 100 特征的二分类问题examples/pca.py#L14-L21划分训练/测试集分别用svd和eigen两种求解器做 PCA把 100 维压到15 维examples/pca.py#L28-L34在降维后的数据上训练 mla/linear_models.py 里的LogisticRegression打印分类准确率。for s in [svd, eigen]: p PCA(15, solvers) p.fit(X_train) # 只在训练集上 fit X_train_reduced p.transform(X_train) X_test_reduced p.transform(X_test) # 接着训练逻辑回归对比两种 solver 的准确率跑完你会看到类似输出Classification accuracy for svd PCA: 0.87xx Classification accuracy for eigen PCA: 0.87xx100 维直接降到 15 维准确率几乎不掉——这就是 PCA 的威力。一个容易踩的坑注意示例里刻意只fit(X_train)再transform测试集examples/pca.py#L31-L34。PCA 会记住训练集的均值和方向测试集不能参与 fit否则会造成数据泄漏让准确率虚高。四、如何选择主成分个数 kPCA 没有告诉你 k 该选多少但_decompose里已经算好了答案——方差解释比mla/pca.py#L50-L54variance_ratio s_squared / s_squared.sum() logging.info(Explained variance ratio: %s % (variance_ratio[:self.n_components]))打开日志即可看到前 k 个主成分各自解释了多大比例的方差。经验法则让累计解释比达到 95% 左右对应的 k 就是甜点。import logging logging.basicConfig(levellogging.INFO) # 加上这行就能看到解释比 from mla.pca import PCA p PCA(n_components15, solversvd) p.fit(X_train)五、配套测试与延伸学习降维的测试用例在 mla/tests/test_reduction.py它验证「PCA 降到 50 维 随机森林」的 ROC-AUC 不低于 0.75当前标记为 skip可作参考想用非线性降维同目录的 mla/tsne.py 实现了 t-SNE适合做数据可视化想继续深挖线性模型可看 mla/linear_models.py 的梯度下降实现更多算法清单见 README.md。六、常见问题 FAQQ1PCA 是监督学习吗不是。y_required False表明它只看特征 X不需要标签属于无监督特征提取。Q2PCA 对特征尺度敏感吗非常敏感。方差大的特征会主导主成分实际使用前建议先做标准化本项目示例数据本身尺度一致所以未处理。Q360 行代码和 sklearn 的 PCA 差在哪功能上这里实现的是核心数学流程sklearn 额外处理了增量拟合、稀疏矩阵、多种 solver 加速等工程细节。学原理读这里生产用 sklearn。Q4fit之后哪些属性能拿来用p.mean训练集均值mla/pca.py#L36p.components前 k 个主成分方向mla/pca.py#L55小结MLAlgorithms 的 PCA 实现mla/pca.py用「中心化 → 分解 → 取前 k 个方向」三步把主成分分析讲透了✅几何直觉找数据变化最大的正交方向丢弃次要方向✅双求解器svd默认、稳与eigen教科书式可切换对照✅实战闭环examples/pca.py 演示 100 维 → 15 维 逻辑回归的完整流程✅接口对齐 sklearnfit / transform用法一致学习成本平滑迁移。先跑一遍python -m examples.pca再对照 mla/pca.py 逐行读PCA 的数学与工程你就都通了。【免费下载链接】MLAlgorithmsMinimal and clean examples of machine learning algorithms implementations项目地址: https://gitcode.com/gh_mirrors/ml/MLAlgorithms创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表