Python机器学习算法实现

Author:louwill

Machine Learning Lab

作为一种常见的多元统计分析方法,主成分分析法(Principal Component Analysis,PCA)也是一种经典的无监督学习算法。PCA通过正交变换将一组由线性相关变量表示的数据转换为少数几个由线性无关变量表示的数据,这几个线性无关的变量就是主成分。PCA通过将高维数据维度减少到少数几个维度,本质上属于一种数据降维方法,也可以用来探索数据的内在结构。

PCA原理与推导

PCA的基本想法如下:首先对需要降维的数据各个变量标准化(规范化)为均值为0、方差为1的数据集。然后对标准化后的数据进行正交变换,将原来的数据转换为若干个线性无关的向量表示的新数据。这些新向量表示的数据不仅要求相互线性无关,而且需要是所包含的信息量最大。

PCA使用方差来衡量新变量的信息量大小,按照方差大小排序依次为第一主成分、第二主成分等。下面对PCA原理进行简单推导。假设原始数据为




维随机变量




























,其均值向量为






































其协方差矩阵为




:

现假设由




维随机变量









维随机变量




























的线性变换:
其中








































然后可得变换后的随机变量







的统计特征:

当上述线性变换满足如下条件时,变换后的





















分别为




的第一主成分、第二主成分以及第




主成分。

  • 变换的系数向量










    为单位向量,有



























  • 变换后的变量















    线性无关,即
























  • 变量












    所有线性变换中方差最大的,







    是与







    不相关的所有线性变换中方差最大的。

以上条件给出了求解PCA主成分的方法。根据约束条件和优化目标,我们可以使用拉格朗日乘子法来求出主成分。先来求解第一主成分。

根据前述条件,我们可以形式化第一主成分的数学表达为:






































定义拉格朗日函数:





























将上述拉格朗日函数对







求导并令为0可得:

















所以









的特征值,







是对应的单位特征向量。假设












的最大特征值







对应的单位特征向量,则















均为上述优化问题的最优解。所以









为第一主成分,其方差为对应协方差矩阵的最大特征值:






























同样方法也可求第二主成分。但约束条件中需要加上与第一主成分不相关的约束,具体推导这里略过。按上述方法可一致计算到第




个主成分,且第




个主成分的方差等于




的第




个特征值:

假设原始数据为









列的数据




,梳理PCA的计算流程如下:











  • 列的数据按照列进行均值为0方差为1的标准化;

  • 计算标准化后的




    的协方差矩阵














  • 计算协方差矩阵的特征值和对应的特征向量;

  • 将特征向量按对应特征值大小从上到下按行排列成矩阵,取前




    行构成的矩阵












  • 即为PCA降维后的




    维数据。

PCA的numpy实现

虽然sklearn中提供了PCA降维的API,但其背后算法是用SVD来实现的。numpy模块下提供了强大的矩阵运算函数,下面我们用numpy来实现一个PCA算法。

import numpy as npclass PCA():# 计算协方差矩阵def calculate_covariance_matrix(self, X):m = X.shape[0]# 数据标准化X = X - np.mean(X, axis=0)return 1 / m * np.matmul(X.T, X)def pca(self, X, n_components):# 计算协方差矩阵covariance_matrix = self.calculate_covariance_matrix(X)# 计算协方差矩阵的特征值和对应特征向量eigenvalues, eigenvectors = np.linalg.eig(covariance_matrix)# 对特征值排序idx = eigenvalues.argsort()[::-1]# 取最大的前n_component组eigenvectors = eigenvectors[:, idx]eigenvectors = eigenvectors[:, :n_components]# Y=PX转换return np.matmul(X, eigenvectors)

由上述代码可以看到,基于numpy我们仅需要数行核心代码即可实现一个PCA降维算法。下面以sklearn digits数据集为例看一下降维效果:

from sklearn import datasets
import matplotlib.pyplot as plt
import matplotlib.cm as cmx
import matplotlib.colors as colors# 导入sklearn数据集
data = datasets.load_digits()
X = data.data
y = data.target# 将数据降维到2个主成分
X_trans = PCA().pca(X, 2)
x1 = X_trans[:, 0]
x2 = X_trans[:, 1]# 绘图展示
cmap = plt.get_cmap('viridis')
colors = [cmap(i) for i in np.linspace(0, 1, len(np.unique(y)))]class_distr = []
# 绘制不同类别分别
for i, l in enumerate(np.unique(y)):_x1 = x1[y == l]_x2 = x2[y == l]_y = y[y == l]class_distr.append(plt.scatter(_x1, _x2, color=colors[i]))# 图例
plt.legend(class_distr, y, loc=1)# 坐标轴
plt.suptitle("PCA Dimensionality Reduction")
plt.title("Digit Dataset")
plt.xlabel('Principal Component 1')
plt.ylabel('Principal Component 2')
plt.show();

参考资料:

统计学习方法第二版

多元统计分析 何晓群

https://github.com/RRdmlearning/Machine-Learning-From-Scratch

往期精彩:

数学推导+纯Python实现机器学习算法18:奇异值分解SVD

数学推导+纯Python实现机器学习算法17:XGBoost

数学推导+纯Python实现机器学习算法16:Adaboost

数学推导+纯Python实现机器学习算法15:GBDT

数学推导+纯Python实现机器学习算法14:Ridge岭回归

数学推导+纯Python实现机器学习算法13:Lasso回归

数学推导+纯Python实现机器学习算法12:贝叶斯网络

数学推导+纯Python实现机器学习算法11:朴素贝叶斯

数学推导+纯Python实现机器学习算法10:线性不可分支持向量机

数学推导+纯Python实现机器学习算法8-9:线性可分支持向量机和线性支持向量机

数学推导+纯Python实现机器学习算法7:神经网络

数学推导+纯Python实现机器学习算法6:感知机

数学推导+纯Python实现机器学习算法5:决策树之CART算法

数学推导+纯Python实现机器学习算法4:决策树之ID3算法

数学推导+纯Python实现机器学习算法3:k近邻

数学推导+纯Python实现机器学习算法2:逻辑回归

数学推导+纯Python实现机器学习算法1:线性回归

往期精彩回顾适合初学者入门人工智能的路线及资料下载机器学习及深度学习笔记等资料打印机器学习在线手册深度学习笔记专辑《统计学习方法》的代码复现专辑
AI基础下载机器学习的数学基础专辑获取一折本站知识星球优惠券,复制链接直接打开:https://t.zsxq.com/yFQV7am本站qq群1003271085。加入微信群请扫码进群:

【机器学习基础】数学推导+纯Python实现机器学习算法19:PCA降维相关推荐

  1. 【机器学习基础】数学推导+纯Python实现机器学习算法30:系列总结与感悟

    Python机器学习算法实现 Author:louwill Machine Learning Lab 终于到了最后的总结.从第一篇线性回归的文章开始到现在,已经接近有两年的时间了.当然,也不是纯写这3 ...

  2. 【机器学习基础】数学推导+纯Python实现机器学习算法24:HMM隐马尔可夫模型

    Python机器学习算法实现 Author:louwill Machine Learning Lab HMM(Hidden Markov Model)也就是隐马尔可夫模型,是一种由隐藏的马尔可夫链随机 ...

  3. 【机器学习基础】数学推导+纯Python实现机器学习算法28:CRF条件随机场

    Python机器学习算法实现 Author:louwill Machine Learning Lab 本文我们来看一下条件随机场(Conditional Random Field,CRF)模型.作为概 ...

  4. 【机器学习基础】数学推导+纯Python实现机器学习算法27:EM算法

    Python机器学习算法实现 Author:louwill Machine Learning Lab 从本篇开始,整个机器学习系列还剩下最后三篇涉及导概率模型的文章,分别是EM算法.CRF条件随机场和 ...

  5. 【机器学习基础】数学推导+纯Python实现机器学习算法26:随机森林

    Python机器学习算法实现 Author:louwill Machine Learning Lab 自从第14篇文章结束,所有的单模型基本就讲完了.而后我们进入了集成学习的系列,整整花了5篇文章的篇 ...

  6. 【机器学习基础】数学推导+纯Python实现机器学习算法25:CatBoost

    Python机器学习算法实现 Author:louwill Machine Learning Lab 本文介绍GBDT系列的最后一个强大的工程实现模型--CatBoost.CatBoost与XGBoo ...

  7. 【机器学习基础】数学推导+纯Python实现机器学习算法24:LightGBM

    Python机器学习算法实现 Author:louwill Machine Learning Lab 第17讲我们谈到了竞赛大杀器XGBoost,本篇我们来看一种比XGBoost还要犀利的Boosti ...

  8. 【机器学习基础】数学推导+纯Python实现机器学习算法23:kmeans聚类

    Python机器学习算法实现 Author:louwill Machine Learning Lab 聚类分析(Cluster Analysis)是一类经典的无监督学习算法.在给定样本的情况下,聚类分 ...

  9. 【机器学习基础】数学推导+纯Python实现机器学习算法22:最大熵模型

    Python机器学习算法实现 Author:louwill Machine Learning Lab 最大熵原理(Maximum Entropy Principle)是一种基于信息熵理论的一般原理,在 ...

  10. 【机器学习基础】数学推导+纯Python实现机器学习算法21:马尔可夫链蒙特卡洛...

    Python机器学习算法实现 Author:louwill Machine Learning Lab 蒙特卡洛(Monte Carlo,MC)方法作为一种统计模拟和近似计算方法,是一种通过对概率模型随 ...

最新文章

  1. [置顶] 将项目从tomcat 迁移到JBoss
  2. packed record与record区别
  3. httphandlers 与 httpmodules
  4. 初探Apache Impala
  5. C++遍历树-非递归递归-使用了标记位
  6. 【Python】列表类型操作函数和方法
  7. java 检测表情符号_一个能在字符串中识别出 Emoji 的简单工具 (支持JavaScript和Java)...
  8. 深入跨国互联网业务场景,看华为云数智融合元数据如何打破“数据墙”
  9. java webservice 验证_SOAP header验证WebService接口的访问权限
  10. SonicWALL防火墙初探
  11. 川土微电子|数字隔离器替代光耦817
  12. oracle database link
  13. scikit-learn入门到精通(二):seting和estimator
  14. python灰色波浪线,PyCharm关闭碍眼的波浪线图文详解
  15. 奇点大学人工智能专家:人造智能大脑已接近现实
  16. java毕业设计二手交易系统Mybatis+系统+数据库+调试部署
  17. Doo Prime 提供高达 1000 倍杠杆,助您撬动无限机遇
  18. AN/APG-68雷达空对空雷达模式
  19. C#中Internal关键字的总结
  20. Web侦察工具HTTrack (爬取整站)

热门文章

  1. 关于选择博客网站的一点看法
  2. iOS进阶 - iOS如何监控崩溃
  3. jieba库的使用和好看的词元
  4. 兼顾FPGA和单片机
  5. Python--day6
  6. CC2538相关资料
  7. linux——使用fidsk对linux硬盘进行操作【转】
  8. 手脱ASProtect v1.23 RC1(无Stolen Code)
  9. 失眠害死人-jQueryAJAX
  10. [转载]学习数据库分表和分库思想