PCA(主成分分析)原理,步骤详解以及应用

主成分分析(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) 上求第一主成分即可求出原数据的第二主成分,以此类推..

代码实现

 1 import numpy as np
 2 import matplotlib.pyplot as plt
 3
 4 # 生成测试数据
 5 X = np.empty((100, 2))
 6 X[:, 0] = np.random.uniform(0., 100., size=100)
 7 X[:, 1] = 0.75 * X[:, 0]+ 3. + np.random.normal(0, 10., size=100)
 8
 9 #  均值归零方法
10 def demean(X):
11     return X - np.mean(X, axis=0)
12
13 X_demean = demean(X)
14
15 #  梯度上升法
16 def f(w, X):
17     return np.sum((X.dot(w)**2)) / len(X)
18 def df(w, X):
19     return X.T.dot(X.dot(w)) * 2. / len(X)
20
21 #  将w转化为单位向量,方便计算
22 def direction(w):
23     return w / np.linalg.norm(w)
24
25 #求第一主成分
26 def first_component(X, initial_w, eta, n_iters = 1e4, epsilon = 1e-8):
27
28     w = direction(initial_w)
29     cur_iter = 0
30
31     while cur_iter < n_iters:
32         gradient = df(w, X)
33         last_w = w
34         w = w + eta * gradient
35         w = direction(w)  # 每次求一个单位方向
36         if abs(f(w, X) - f(last_w, X)) < epsilon:
37             break
38
39         cur_iter += 1
40     return w
41
42 initial_w = np.random.random(X.shape[1]) # 不能从零开始
43
44 eta = 0.01
45
46 def first_n_component(n, X, eta=0.01, n_iters = 1e4, espilon = 1e-8):
47     X_pca = X.copy()
48     X_pca = demean(X_pca)
49     res = []
50     for i in range(n):
51         initial_w = np.random.random(X_pca.shape[1])
52         w = first_component(X_pca, initial_w, eta)
53         res.append(w)
54
55         X_pca = X_pca - X_pca.dot(w).reshape(-1, 1)
56         X_pca = X_pca * w
57     return res
58
59 # 注意 不能使用StandardScaler标准化数据 这样会打掉样本间的方差 求不出想要的结果
60
61 res = first_n_component(2, X)

原文地址:https://www.cnblogs.com/VitoLin21/p/11371780.html

时间: 2024-11-07 14:19:27

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

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

摘自http://blog.csdn.net/elfprincexu/article/details/45043971 gcc/g++等编译器 编译原理: 预处理,编译,汇编,链接各步骤详解 C和C++编译器是集成的,编译一般分为四个步骤: 预处理(preprocessing)  ----------------- cpp/ gcc -E  编译(compilation) ------------------ cc1 / gcc -S 汇编(assembly)  ----------------

linux Mysql 主从复制 原理介绍和步骤详解

大家好,我是霸王卸甲,今天我给大家带来的是linux数据库中的主从复制的简单介绍和步骤详解. 主从复制 mysql主从复制 灵活 一主一从 主主复制 一主多从---扩展系统读取的性能,因为读是在从库读取的: 多主一从---5.7开始支持 联级复制--- 用途及条件 mysql主从复制用途 实时灾备,用于故障切换 读写分离,提供查询服务 备份,避免影响业务 主从部署必要条件: 主库开启binlog日志(设置log-bin参数) 主从server-id不同 从库服务器能连通主库 主从原理mysql主

安装MACOS操作步骤详解

安装MACOS操作步骤详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 关于安装MAC的操作系统其实大家都知道可以让客服帮忙提供软件上的支持,而且苹果客服都很有礼貌呢,而且非常的有耐心.特别感谢她们的帮助,让我对MAC的操作系统的好感度有了大大的提升.起初,我刚刚拿到我的本的时候是去年,因为我压根并不看好笔记本,我到现在也非常喜欢台式机,因为体验度是相当棒的,但是由于工作的原因,可能是要去出差的时候带着个台式机到处跑也不太合适,于是就决定买一个低配的笔记本.刚刚拿到笔记本第

CentOS下安装Apache步骤详解

CentOS下安装Apache步骤详解 一.实验环境 Linux: CentOS release 6.7 (Final) Apache: httpd-2.4.23.tar.gz VMware: VMware 10.0 宿主机: Win10 x64 二.Apache介绍 Apache一款 Web服务器软件.它可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,是最流行的Web服务器端软件之一.它快速.可靠并且可通过简单的API扩充,将Perl/Python等解释器编译到服务器

197vpn配置热门pc端步骤详解

197vpn配置热门pc端步骤详解 在使用197vpn的时候会面临到各种的系统情况,不同的系统配置vpn进行使用的方法也是不同的,下面我们来看看当前热门的pc端系统中vpn是如何配置的呢? Windows 7 在画面右下角,点选网络连接,然后选择"打开网络共享中心": 在弹出的对话窗口中,选择"设置新的连接或网络": 选择"连接到工作区",然后选择"使用我的Internet连接(VPN),通过Internet使用虚拟专用网络(VPN)来

Oracle 10g创建表空间的完整步骤详解

本文我们主要介绍了Oracle 10g创建表空间的完整步骤,包括表空间的创建与删除.为应用创建用户以及权限的授予等操作,希望能够对您有所帮助. AD:WOT2014:用户标签系统与用户数据化运营培训专场 Oracle 10g数据库中,当在数据库中创建用户时,基于应用性能和管理方面的考虑,最好为不同的用户创建独立的表空间. 那么创建表空间的步骤是怎样实现的呢?本文我们主要就介绍了这一部分内容,接下来就让我们一起来了解一下这部分内容吧. 1.创建表空间 不论是Lnux环境,还是Wndows环境,都要

JDBC连接SQL Server 2005步骤详解

一.设置SQL Server服务器:    1."开始" → "程序" → "Microsoft SQL Server 2005" → "配置工具" → "SQL Server Configuration Manager"(确认"SQL Server Management Studio"已关闭)    2."SQL Server 2005 服务"中停止服务"

CentOS7/RHEL7安装Redis步骤详解

CentOS7/RHEL7安装Redis步骤详解 CentOS7/RHEL7安装Redis还是头一次测试安装了,因为centos7升级之后与centos6有比较大的区别了,下面我们就一起来看看CentOS7/RHEL7安装Redis步骤详解 方法一:使用命令安装(前提是已经安装了EPEL). 安装redis: yum -y install redis 启动/停止/重启 Redis启动服务:1systemctl start redis.service停止服务: systemctl stop red

LVS-DR工作原理图文详解

为了阐述方便,我根据官方原理图另外制作了一幅图,如下图所示:VS/DR的体系结构: 我将结合这幅原理图及具体的实例来讲解一下LVS-DR的原理,包括数据包.数据帧的走向和转换过程. 官方的原理说明:Director接收用户的请求,然后根据负载均衡算法选取一台realserver,将包转发过去,最后由realserver直接回复给用户. 实例场景设备清单: 说明:我这里为了方便,client是与vip同一网段的机器.如果是外部的用户访问,将client替换成gateway即可,因为IP包头是不变的