主成分分析(PCA, Principal Component Analysis)

  • 一个非监督的机器学习算法
  • 主要用于数据的降维处理
  • 通过降维,可以发现更便于人类理解的特征
  • 其他应用:数据可视化,去噪等

主成分分析是尽可能地忠实再现原始重要信息的数据降维方法

原理推导:

如图,有一个二维的数据集,其特征分布于特征1和2两个方向

现在希望对数据进行降维处理,将数据压缩到一维,直观的我们可以想到将特征一或者特征二舍弃一个,可以得到这样的结果

        ------- : 舍弃特征1之后

        ------- : 舍弃特征2之后

可以看出,舍弃特征2保留特征1是一个较好的降维方案,此时点和点之间距离较大,拥有更高的可区分度

此时我们要想,肯定会有比这更好的方案,毕竟这太简单了

我们想象一下,能够找到这样的一条斜线w,将数据降维到w上(映射到w上)之后,能最好的保留原来的分布特征,且这些点分布在了一个轴上(斜线w)后点和点之间的距离也比之前的两种方案更加的大,此时的区分度也更加明显

思考:

  1. 如何找到让这个样本降维后间距最大的轴?
  2. 如何定义样本间距?

在统计学中,有一个直接的指标可以表示样本间的间距,那就是方差(Variance)

这样回过头来看思考1,问题就变成了:

找到一个轴,使得样本空间的所有点映射到这个轴之后,方差最大

求解这个轴的过程

将样例的均值归为0(demean)

  将全部样本都减去样本的均值,可以将样本转化为这种:

  

  

  经过demean后,在各个维度均值均为0,我们可以推出:

  

  方便我们进行计算

我们想要求w轴的方向(w1,w2),使得  Var(Xproject最大,Xproject 是映射到w轴之后的X的坐标

    

因为我们已经进行了demean操作,均值为0,所以此时

  

而  ||Xproject(i)||2 的实际长度就是下图中蓝色向量的长度

  

实际上,求把一个向量映射到另一个向量上的对应映射的长度,就是线性代数中点乘的操作

  

此时w是一个方向向量,||w|| = 1,所以可以化简成:

  

且因为前面已经推知

  

通过替换,我们就得到了:

  

而我们的目标,就是求w,使得Var(Xproject最大

对公式进行拆分

  

再化简:

  

至此,我们的主成分分析法就化简成了一个目标函数最优化问题,因为是求最大值,可以使用梯度上升法解决

使用梯度上升法求解PCA

目标: 求w,使得 最大

f(X)的梯度

  

            

此时再观察,可以将式子展开能够得到这样的结果:

  

再化简,可得:

  原式 = 

     = 

最后就得出结论:

   

那么,求出第一个主成分之后,如何求出下一个主成分呢?

数据进行改变,将数据在第一主成分上的分量去掉,如图

Xpr(i) 是第一主成分,原数据去掉第一主成分之后可以得到

  

再在 X'(i) 上求第一主成分即可求出原数据的第二主成分,以此类推..

代码实现

 import numpy as np
import matplotlib.pyplot as plt # 生成测试数据
X = np.empty((100, 2))
X[:, 0] = np.random.uniform(0., 100., size=100)
X[:, 1] = 0.75 * X[:, 0]+ 3. + np.random.normal(0, 10., size=100) # 均值归零方法
def demean(X):
return X - np.mean(X, axis=0) X_demean = demean(X) # 梯度上升法
def f(w, X):
return np.sum((X.dot(w)**2)) / len(X)
def df(w, X):
return X.T.dot(X.dot(w)) * 2. / len(X) # 将w转化为单位向量,方便计算
def direction(w):
return w / np.linalg.norm(w) #求第一主成分
def first_component(X, initial_w, eta, n_iters = 1e4, epsilon = 1e-8): w = direction(initial_w)
cur_iter = 0 while cur_iter < n_iters:
gradient = df(w, X)
last_w = w
w = w + eta * gradient
w = direction(w) # 每次求一个单位方向
if abs(f(w, X) - f(last_w, X)) < epsilon:
break cur_iter += 1
return w initial_w = np.random.random(X.shape[1]) # 不能从零开始 eta = 0.01 def first_n_component(n, X, eta=0.01, n_iters = 1e4, espilon = 1e-8):
X_pca = X.copy()
X_pca = demean(X_pca)
res = []
for i in range(n):
initial_w = np.random.random(X_pca.shape[1])
w = first_component(X_pca, initial_w, eta)
res.append(w) X_pca = X_pca - X_pca.dot(w).reshape(-1, 1)
X_pca = X_pca * w
return res # 注意 不能使用StandardScaler标准化数据 这样会打掉样本间的方差 求不出想要的结果 res = first_n_component(2, X)

PCA(主成分分析)原理,步骤详解以及应用的更多相关文章

  1. PCA(主成分分析)和LDA详解

    http://www.cnblogs.com/LeftNotEasy/archive/2011/01/08/lda-and-pca-machine-learning.html http://www.c ...

  2. gcc/g++等编译器 编译原理: 预处理,编译,汇编,链接各步骤详解

    摘自http://blog.csdn.net/elfprincexu/article/details/45043971 gcc/g++等编译器 编译原理: 预处理,编译,汇编,链接各步骤详解 C和C+ ...

  3. 人工智能之深度学习-初始环境搭建(安装Anaconda3和TensorFlow2步骤详解)

    前言: 本篇文章主要讲解的是在学习人工智能之深度学习时所学到的知识和需要的环境配置(安装Anaconda3和TensorFlow2步骤详解),以及个人的心得体会,汇集成本篇文章,作为自己深度学习的总结 ...

  4. ASP.NET连接Oracle数据库的步骤详解(转)

    ASP.NET连接Oracle数据库的步骤详解   本文我们主要介绍了ASP.NET连接Oracle数据库的步骤及每个步骤需要进行的设置,希望能够对您有所帮助.   在用ASP.NET开发应用程序时, ...

  5. Oracle 11g客户端在Linux系统上的配置步骤详解

    Oracle 11g客户端在Linux系统上的配置步骤详解 2011-07-26 10:47 newhappy2008 CSDN博客 字号:T | T 本文我们主要介绍了Oracle 11g客户端在L ...

  6. centos6.4安装配置vpn服务器步骤详解

      centos6.4安装配置vpn服务器步骤详解,从安装VPN到配置VPN服务器.配置VPN服务器的路由转发功能,每一步都很详细   一.VPN服务器环境说明 操作系统:CentOS release ...

  7. MapReduce工作原理图文详解 (炼数成金)

    MapReduce工作原理图文详解 1.Map-Reduce 工作机制剖析图: 1.首先,第一步,我们先编写好我们的map-reduce程序,然后在一个client 节点里面进行提交.(一般来说可以在 ...

  8. MD5算法步骤详解

    转自MD5算法步骤详解 之前要写一个MD5程序,但是从网络上看到的资料基本上一样,只是讲了一个大概.经过我自己的实践,我决定写一个心得,给需要实现MD5,但又不要求很高深的编程知识的童鞋参考.不多说了 ...

  9. EA创建用例图步骤详解

    EA创建用例图步骤详解 1 创建一个项目 2 选择需要的模型 3 新建模型包 4 新建图表 5 新建模型包 6 创建用户角色Actor 7 新建用例 8 关联用户和用例 9 最后整个项目浏览器目录结构 ...

随机推荐

  1. HTML表单部分学习笔记

    第一部分: <!-- action :指定处理提交表单的格式 method :指定提交表单的http方法 enctype:指明用来把表单提交给服务器时的互联网媒体形式 --> <fo ...

  2. Git的使用和配置小白必看都是干货,为您解惑

    Git安装 首先下载git这个软件,然后打开码云新建仓库 在本地选择一个路径作为本地仓库 点新建仓库然后输入邮箱和密码,然后进行配置 在要作为本地仓库的地方新建一个文件夹,保存后关闭,在文件夹空白处鼠 ...

  3. Orleans 知多少 | 2. 核心概念一览

    Orleans 术语解读 上面这张图中包含了Orleans中的几个核心概念: Grain Silo Orleans Cluster Orleans Client 从这张图,我们应该能理清他们之间的关系 ...

  4. TensorFlow笔记-可视化Tensorboard

    可视化Tensorboard •数据序列化-events文件 TensorBoard 通过读取 TensorFlow 的事件文件来运行 •tf.summary.FileWriter('/tmp/ten ...

  5. Jenkins-slave分布式环境构建与并行WebUi自动化测试项目

    前言 之前搭建过selenium grid的分布式环境,今天我们再来搭建一次Jenkins的分布式环境:jenkins-slave Jenkins的Master-Slave分布式架构主要是为了解决Je ...

  6. 一文带你了解Java反射机制

    想要获取更多文章可以访问我的博客 - 代码无止境. 上周上班的时候解决一个需求,需要将一批数据导出到Excel.本来公司的中间件组已经封装好了使用POI生成Excel的工具方法,但是无奈产品的需求里面 ...

  7. solidity的delete操作汇总

    简介 Solidity中的特殊操作符delete用于释放空间,为鼓励主动对空间的回收,释放空间将会返还一些gas. delete操作符可以用于任何变量,将其设置成默认值0. 删除枚举类型时,会将其值重 ...

  8. Python3发送邮件功能

    Python3实现邮件发送功能 import smtplib from email.mime.text import MIMEText # 导入模块 class SendEmail: def send ...

  9. PAY8 数字货币支付结算系统,全球付!实时结算!秒到账!

    数字货币支付是历史发展的必然 如今已经有越来越多的地方接受加密数字货币作为支付消费了,比如泰国电影院连锁店 Cineplex Group 可用加密货币买爆米花和电影票,西班牙一精品酒店接受数字货币支付 ...

  10. CF803D 题解

    题面 正解:一道二分大水题! A:为什么我得不到满分? B : 评测的系统不一样啊! A : 蛤? 正常情况下我们日常练习均使用的是windows系统,在windows下,string 本身是可以存储 ...