PCA降维

一.原理

这篇文章总结的不错PCA的数学原理。

PCA主成分分析是将原始数据以线性形式映射到维度互不相关的子空间。主要就是寻找方差最大的不相关维度。数据的最大方差给出了数据的最重要信息。

二.优缺点

优:将高维数据映射到低维,降低数据的复杂性,识别最重要的多个特征

不足:不一定需要,且可能损失有用信息

适用数值型数据

三.步骤

1.原始数据X,对于每列属性,去平均值(也可以对数值进行标准分化)

2.计算样本点的协方差矩阵(列间两两计算相关性)

3.求出协方差矩阵的特征值和对应的特征向量

4.从大到小排序特征值,取得最前的k个特征向量P

5.将数据转换到k个特征向量构建的新空间中,Y=P^tX

四.python代码

 #!/usr/bin/python
# -*- coding: utf-8 -*- import numpy as np
from sklearn.decomposition import PCA
from matplotlib import pyplot as plt class PCA_DimensionalityReduction: def __init__(self):
# 随机产生数据沿y=2x分布,
self.x = np.arange(1, 101, 1).astype(float)
self.y = 2 * np.arange(1, 101, 1).astype(float) def dataProduction(self):
#添加服从正太分布的噪音数据normal(均值,标准差,个数)
noise=np.random.normal(0,10,100)
self.y+=noise
#定义绘图
self.fig=plt.figure(figsize=(10,10))
#红色的小圆点在坐标平面上画一个点
plt.plot(self.x,self.y,'ro')
#坐标范围axis[xmin,xmax,ymin,ymax]
plt.axis([0,102,-20,220])
#箭头
plt.quiver(60, 100, 10 - 0, 20 - 0, scale_units='xy', scale=1)
plt.arrow(60, 100, 10 - 0, 20 - 0, head_width=2.5, head_length=2.5, fc='k', ec='k')
#图中的任意位置添加文字
plt.text(70,110,r'$v^1$',fontsize=20) #保存
# 添加子图,返回Axes实例,参数:子图总行数,子图总列数,子图位置
ax=self.fig.add_subplot(111)
ax.axis([0,102,-20,220])
ax.set_xlabel('x',fontsize=40)
ax.set_ylabel('y',fontsize=40)
self.fig.suptitle('2 dimensional',fontsize=40)
self.fig.savefig('pca_data.png') '''
PCA算法
总结一下PCA的算法步骤:
设有m条n维数据。
1)将原始数据按列组成n行m列矩阵X
2)将X的每一行(代表一个属性字段)进行零均值化,即减去这一行的均值
3)求出协方差矩阵C=(1/m)X(X)^T
4)求出协方差矩阵的特征值及对应的特征向量
5)将特征向量按对应特征值大小从上到下按行排列成矩阵,取前k行组成矩阵P
6)Y=PX
即为降维到k维后的数据
'''
#使用np.linalg.eig计算特征值和特征向量
def dr_pca(self):
#每列属性的均值
mean_x=np.mean(self.x)
mean_y=np.mean(self.y)
#这里对数据标准分化
mean_vector=np.array([[mean_x],[mean_y]])
self.u_x=(self.x-mean_x)/np.std(self.x)#除标准差
self.u_y=(self.y-mean_y)/np.std(self.y)
#协方差矩阵
sigma=np.cov([self.u_x,self.u_y])
#从协方差矩阵中求出特征值和特征向量,选择特征值最大的对应的特征向量
eig_vals,eig_vecs=np.linalg.eig(sigma)
eig_pairs=[(np.abs(eig_vals[i]),eig_vecs[:,i]) for i in range(len(eig_vals))]
eig_pairs.sort()
eig_pairs.reverse()
v1=eig_pairs[0][1]#取出一个最大特征值对应的特征向量
print('v1,shape:',(v1,v1.shape))
#映射到由k个特征向量组成的子空间特征向量(主成分)
X=np.array([self.u_x,self.u_y])
#X=X.T
print('X shape:',X.shape)
main_vector=v1.T.dot(X)
print('main_vector:',main_vector.T) #w=np.array(v1.reshape(2,1))
#main_vector=w.T.dot(X)
#print('w:',w.shape)
#print("main_vector2:",main_vector) #使用sklearn中的pca
def sklearn_pca(self):
X=np.array([self.u_x,self.u_y])
X=X.T
pca=PCA(n_components=1) #指定主成分数量 #pca.fig(X)#训练pca模型
#v1 = pca.components_[0] # 得到特征向量
#print('v1:', v1) main_vector=pca.fit_transform(X)#用X来训练PCA模型,同时返回降维后的结果数据。
print('sklearn:',main_vector) if __name__=='__main__':
pca=PCA_DimensionalityReduction()
pca.dataProduction()
pca.dr_pca()
pca.sklearn_pca()

参考:1.CRC.Machine.Learning.An.Algorithmic.Perspective.2nd.Edition.

   2.machine learning for the web

   3.machine learning in action

sklearn pca降维的更多相关文章

  1. Python机器学习笔记 使用scikit-learn工具进行PCA降维

    之前总结过关于PCA的知识:深入学习主成分分析(PCA)算法原理.这里打算再写一篇笔记,总结一下如何使用scikit-learn工具来进行PCA降维. 在数据处理中,经常会遇到特征维度比样本数量多得多 ...

  2. 一步步教你轻松学主成分分析PCA降维算法

    一步步教你轻松学主成分分析PCA降维算法 (白宁超 2018年10月22日10:14:18) 摘要:主成分分析(英语:Principal components analysis,PCA)是一种分析.简 ...

  3. 用PCA降维 (Principal Component Analysis,主成分分析)

    参考资料:Mastering Machine Learning With scikit-learn 降维致力于解决三类问题.第一,降维可以缓解维度灾难问题.第二,降维可以在压缩数据的同时让信息损失最 ...

  4. PCA降维的原理、方法、以及python实现。

    PCA(主成分分析法) 1. PCA(最大化方差定义或者最小化投影误差定义)是一种无监督算法,也就是我们不需要标签也能对数据做降维,这就使得其应用范围更加广泛了.那么PCA的核心思想是什么呢? 例如D ...

  5. 吴裕雄 python 机器学习——主成份分析PCA降维

    # -*- coding: utf-8 -*- import numpy as np import matplotlib.pyplot as plt from sklearn import datas ...

  6. opencv基于PCA降维算法的人脸识别

    opencv基于PCA降维算法的人脸识别(att_faces) 一.数据提取与处理 # 导入所需模块 import matplotlib.pyplot as plt import numpy as n ...

  7. [机器学习 ]PCA降维--两种实现 : SVD或EVD. 强力总结. 在鸢尾花数据集(iris)实做

    PCA降维--两种实现 : SVD或EVD. 强力总结. 在鸢尾花数据集(iris)实做 今天自己实现PCA,从网上看文章的时候,发现有的文章没有搞清楚把SVD(奇异值分解)实现和EVD(特征值分解) ...

  8. python机器学习使用PCA降维识别手写数字

    PCA降维识别手写数字 关注公众号"轻松学编程"了解更多. PCA 用于数据降维,减少运算时间,避免过拟合. PCA(n_components=150,whiten=True) n ...

  9. PCA降维的原理及实现

    PCA可以将数据从原来的向量空间映射到新的空间中.由于每次选择的都是方差最大的方向,所以往往经过前几个维度的划分后,之后的数据排列都非常紧密了, 我们可以舍弃这些维度从而实现降维 原理 内积 两个向量 ...

随机推荐

  1. Java第七周课堂示例总结

    一.super();调用基类构造方法 代码: class Grandparent{ public Grandparent(){ System.out.println("GrandParent ...

  2. MY TESTS

    励志整理所有的n次考试的博客: [五一qbxt]test1 [五一qbxt]test2 [校内test]桶哥的问题 [6.10校内test] noip模拟 6.12校内test [6.12校内test ...

  3. 2019年8月23日 星期五(韩天峰的swoole)

    Swoole:面向生产环境的 PHP 异步网络通信引擎 使 PHP 开发人员可以编写高性能的异步并发 TCP.UDP.Unix Socket.HTTP,WebSocket 服务. Swoole 可以广 ...

  4. CVE-2018-18955漏洞学习

    简介 这是名称空间的漏洞,文章先介绍user namespaces的简单只是,然后从补丁入手,分析源码,找到漏洞出现的原因.因为对这块的源码不是那么熟悉,所以着重描述源码分析的部分,其他可以参考末尾的 ...

  5. 全面解析java编码问题

    1.web.xml文件里配置 <filter> <filter-name>CharacterEncodingFilter</filter-name> <fil ...

  6. Elasticsearch入门教程(六):Elasticsearch查询(二)

    原文:Elasticsearch入门教程(六):Elasticsearch查询(二) 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:h ...

  7. 导出excel-NPOI

    前台调用: view: <a href='/Admin/NurseUser/Excel' target='_blank'>导出Excel</a>或js: window.loca ...

  8. python time,calendar,datetime

    time sleep:休眠指定的秒数(可以是小数) localtime:将一个时间戳转换为time.struct_time类型的对象(类似于元组) # 将一个时间戳转换为一个类似于元组的对象,不指定时 ...

  9. Elasticsearch中文文档,内容不全

    注意 内容不全,这是观看中文文档进行操作的 文档地址 旧版中文文档,部分内容过期 https://www.elastic.co/guide/cn/elasticsearch/guide/current ...

  10. python学习之路入门篇

    本文是up学习python过程中遇到的一些问题及总结归纳,本小节是入门篇. python基本语法 循环.分支不多赘述. 模块:一个.py文件就是一个模块. 文件和异常 模式 含义解释 “r” 读模式 ...