PCA(Principle Component Analysis)主成分分析是广泛使用的降维算法,由PCA的名字就可以知道,PCA的主要目标是把数据维度降下来,使得减少数据冗余,降低数据处理带来的计算资源消耗。

1 PCA原理

PCA的基本思想是将数据的最主要成分提取出来代替原始数据,也就是将\(n\)维特征映射到,由\(k\)维正交特征组成的特征空间就是主成分,这里使用的降维方法就是投影。问题是怎样抽取数据的主要成分,如何衡量投影后保存的信息呢?PCA算法使用方差来度量信息量,为了确保降维后的低维度数据尽可能多的保留原始数据的有效信息,需要使降维后的数据尽可能的分散,从方差角度理解就是保留最大的方差。那么如何得到包含最大差异性的主成分呢?实际上,计算数据矩阵的协方差矩阵,得到协方差矩阵的特征值和特征向量,然后选择特征值最大的\(k\)个特征对应的特征向量组成的矩阵,就将原始数据矩阵投影到了新的\(k\)维特征空间,实现了数据特征的降维。下面介绍方差和协方差的计算过程,关于特征值和特征向量的计算查看SVD原理。
样本均值:\[\bar{x}=\frac{1}{n}\sum_{i=1}^{n}x_{i}\]
样本方差:\[S^{2}=\frac{1}{n-1}\sum_{i=1}^{n}\left ( x_{i}-\bar{x} \right )^{2}\]
样本协方差:\[Cov\left ( X,Y \right )=E\left [ \left ( X-E(X) \right ) \left ( Y-E(Y) \right )\right ]=\frac{1}{n-1}\sum_{i=1}^{n}\left ( x_{i} -\bar{x}\right )\left ( y_{i}-\bar{y} \right )\]

2 PCA算法

输入: \(n\)维数据集\(D=\left \{ x^{(1)},x^{(2)},\cdots ,x^{(m)} \right \}\),降维到\(k\)维
输出: 降维后的数据集\({D}'\)
1)对所有的样本数据去中心化:\(x^{(i)}=x^{(i)}-\frac{1}{m}\sum_{j=1}^{m}x^{(j)}\)
2)计算数据集的协方差矩阵\(XX^{T}\)
3)分解协方差矩阵\(XX^{T}\)得到特征值和特征向量
4)取出最大的\(k\)个特征值对象的特征向量\(\left ( w_{1},w_{2},\cdots ,w_{k} \right )\),将所有特征向量标准化得到特征向量矩阵\(W\)
5)对数据集中的每一个样本\(x^{(i)}\),转换为新的样本\(z^{(i)}=W^{T}x^{(i)}\)
6)得到输出样本集\({D}'=\left ( z^{(1)},z^{(2)},\cdots ,z^{(m)} \right )\)

3 PCA代码实现

PCA降维


import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy.io import loadmat#2D-->1D
mat = loadmat('D:/Python/Andrew-NG-Meachine-Learning/machine-learning-ex7/ex7/ex7data1.mat')
X = mat['X']
print(X.shape)   #(50, 2)
plt.scatter(X[:,0], X[:,1], facecolors='none', edgecolors='b')#X 均值归一化
def featureNormal(X):means = X.mean(axis=0)stds = X.std(axis=0, ddof=1)X_norm = (X - means)/stdsreturn X_norm, means, stds#PCA
def pca(X):sigma = (X.T@X)/len(X)U, S, V = np.linalg.svd(sigma)return U, S, VX_norm, means, stds = featureNormal(X)
U, S, V = pca(X_norm)print(U[:,0])plt.figure(figsize=(7, 5))
plt.scatter(X[:,0], X[:,1], facecolors='none', edgecolors='b')
plt.plot([means[0], means[0]+1.5*S[0]*U[0,0]],[means[1], means[1]+1.5*S[0]*U[0,1]],c='r', linewidth=3, label='First Principal Component')plt.plot([means[0], means[0]+1.5*S[1]*U[1,0]],[means[1], means[1]+1.5*S[1]*U[1,1]],c='g', linewidth=3, label='Second Principal Component')
plt.grid()
plt.axis("equal")
plt.legend()      #Dimensionality Reduction with PCAdef projectData(X, U, K):Z = X @ U[:,:K]return ZZ = projectData(X_norm, U, 1)
Z[0]
#print(Z[0]) #[ 1.48127391]#Reconstructing an approximation of the data 重建数据
def recoverData(Z, U, K):X_rec = Z @ U[:,:K].Treturn X_recX_rec = recoverData(Z, U, 1)
X_rec[0]
#print(X_rec[0])     #[-1.04741883 -1.04741883]        #Visualizing the projections
plt.figure(figsize=(7,5))
plt.axis("equal")
plot = plt.scatter(X_norm[:,0], X_norm[:,1], s=30, facecolors='none',edgecolors='b',label='Original Data Points')plot = plt.scatter(X_rec[:,0], X_rec[:,1], s=30, facecolors='none',edgecolors='r',label='PCA Reduced Data Points')plt.title("Example Dataset: Reduced Dimension Points Shown", fontsize=14)
plt.xlabel('x1 [Feature Normalized]',fontsize=14)
plt.ylabel('x2 [Feature Normalized]', fontsize=14)
plt.grid(True)for x in range(X_norm.shape[0]):plt.plot([X_norm[x,0], X_rec[x,0]],[X_norm[x,1], X_rec[x,1]], 'k--')#输入第一项全是X坐标 第二项全是y坐标
plt.legend()

可视化 PCA将数据从2D减少到1D:


PCA应用 Face Image Dataset 人脸识别图像上运行PCA 实践中使用PCA减少维度

大数据集实现PCA


import numpy as np
import pandas as pd
from scipy.io import loadmat
import matplotlib.pyplot as pltmat = loadmat('D:/Python/ex7faces.mat')
X = mat['X']
print(X.shape)  #(5000, 1024)def displayData(X, row, col):fig, axs = plt.subplots(row, col, figsize=(8,8))for r in range(row):for c in range(col):axs[r][c].imshow(X[r*col + c].reshape(32,32).T, cmap = 'Greys_r')axs[r][c].set_xticks([])axs[r][c].set_yticks([])displayData(X, 10, 10)def featureNormalize(X):means = X.mean(axis=0)stds = X.std(axis=0, ddof=1)X_norm = (X - means) / stdsreturn X_norm, means, stdsdef pca(X):sigma = (X.T @ X) / len(X)U, S, V = np.linalg.svd(sigma)return U, S, V    X_norm, means, stds = featureNormalize(X)
U, S, V = pca(X_norm)
#print(U.shape, S.shape)  #(1024, 1024) (1024,)displayData(U[:,:36].T, 6, 6)#Dimensionality Reductiondef projectData(X, U, K):Z = X @ U[:,:K]return Zz = projectData(X_norm, U, K=36)
def recoverData(Z, U, K):X_rec = Z @ U[:,:K].Treturn X_rec
X_rec = recoverData(z, U, K=36)
displayData(X_rec, 10, 10)

参考: 吴恩达机器学习

转载于:https://www.cnblogs.com/eugene0/p/11470225.html

PCA原理及代码实现相关推荐

  1. PCA降维原理及其代码实现(附加 sklearn PCA用法参数详解)

    学习笔记 本篇博文绝大多数来源于书籍<机器学习实战> 记录自己的学习笔记而已. 降维作用 (1)使得数据集更容易使用 (2)降低很多算法的计算开销 (3)去除噪声 (4)多维数据不容易画图 ...

  2. PCA原理分析和Matlab实现方法(三)

    PCA主成分分析原理分析和Matlab实现方法(三) [尊重原创,转载请注明出处]http://blog.csdn.net/guyuealian/article/details/68487833   ...

  3. 主成分分析(PCA)原理分析Python实现

    目录 1 引言 2 PCA的意义 3 PCA的实现步骤 4 弄懂PCA要回答的问题 5 PCA原理 5.1 如何降维? 5.2 如何量化投影以后样本点之间的区分度? 5.3 求取k维坐标系 5.3.1 ...

  4. 在PyTorch中进行双线性采样:原理和代码详解

    ↑ 点击蓝字 关注视学算法 作者丨土豆@知乎 来源丨https://zhuanlan.zhihu.com/p/257958558 编辑丨极市平台 在pytorch中的双线性采样(Bilinear Sa ...

  5. 【资源】Faster R-CNN原理及代码讲解电子书

    <Faster R-CNN原理及代码讲解>是首发于GiantPandaCV公众号的教程,针对陈云大佬实现的Faster R-CNN代码讲解,Github链接如下: https://gith ...

  6. 视觉SLAM开源算法ORB-SLAM3 原理与代码解析

    来源:深蓝学院,文稿整理者:何常鑫,审核&修改:刘国庆 本文总结于上交感知与导航研究所科研助理--刘国庆关于[视觉SLAM开源算法ORB-SLAM3 原理与代码解析]的公开课. ORB-SLA ...

  7. multinormalNB多项式朴素贝叶斯原理及代码

    https://blog.csdn.net/u011239443/article/details/76176743 multinormalNB多项式朴素贝叶斯原理及代码 https://www.cnb ...

  8. DeepLearning tutorial(1)Softmax回归原理简介+代码详解

    FROM: http://blog.csdn.net/u012162613/article/details/43157801 DeepLearning tutorial(1)Softmax回归原理简介 ...

  9. DeepLearning tutorial(3)MLP多层感知机原理简介+代码详解

    FROM:http://blog.csdn.net/u012162613/article/details/43221829 @author:wepon @blog:http://blog.csdn.n ...

  10. DeepLearning tutorial(4)CNN卷积神经网络原理简介+代码详解

    FROM: http://blog.csdn.net/u012162613/article/details/43225445 DeepLearning tutorial(4)CNN卷积神经网络原理简介 ...

最新文章

  1. 游标、事务并发和锁三者之间的那点事
  2. 基于Matlab的神经网络结合遗传算法在非线性函数极值寻优中的应用
  3. Linux 主机被入侵后的处理案例
  4. 显卡在电脑什么位置_显卡是什么?电脑显卡有什么用?——《作用篇》
  5. linux中的vsprintf_Git29 年超 100 万次 commit,Linux 内核何以发展至今?
  6. 计算机管理将c盘分区,硬盘分区图文教程:新买的电脑只有一个C盘 如何再分区?...
  7. 【UCOSIII】一、任务创建、删除、挂起、恢复、任务管理
  8. Python接口自动化之yaml配置文件
  9. SpringBoot测试类
  10. [nssl1320][jzoj cz 2108] 买装备 {dfs}
  11. DID 起步:图说去中心化身份 | ArcBlock 博客
  12. 一个高速公路交警的救命忠告
  13. bzoj4484[Jsoi2015]最小表示 拓补排序+bitset
  14. (兼职月赚两万?)程序员如何接私活? 如何让自己的知识变现?
  15. 场地预约管理微信小程序开发过程中的错误记录
  16. Vant2 源码分析之 vant-sticky
  17. 哈夫曼树(huffman)
  18. 人工智能实战2019第八次作业 16721088 焦宇恒
  19. STM32 CRH和CRL设置方向
  20. DNS服务器IP地址大全

热门文章

  1. IDEA设置Maven组合命令一键编译打包发布
  2. webview是什么东西_做性能优化前需要考虑什么?
  3. [渝粤教育] 西南科技大学 刑事诉讼法学 在线考试复习资料(1)
  4. Python笔试题汇总
  5. 循环神经网络系列(二) LSTM 和 GRU
  6. 计算机视觉实战(十六)光流估计 (附完整代码)
  7. 【转】彻底删除打印机
  8. linux命令行删除N天前的数据的命令
  9. 4.4.4 无锁的对象引用:AtomicReference和AtomicStampedReference
  10. CoreData 增删改查