sklearn pca降维
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降维的更多相关文章
- Python机器学习笔记 使用scikit-learn工具进行PCA降维
之前总结过关于PCA的知识:深入学习主成分分析(PCA)算法原理.这里打算再写一篇笔记,总结一下如何使用scikit-learn工具来进行PCA降维. 在数据处理中,经常会遇到特征维度比样本数量多得多 ...
- 一步步教你轻松学主成分分析PCA降维算法
一步步教你轻松学主成分分析PCA降维算法 (白宁超 2018年10月22日10:14:18) 摘要:主成分分析(英语:Principal components analysis,PCA)是一种分析.简 ...
- 用PCA降维 (Principal Component Analysis,主成分分析)
参考资料:Mastering Machine Learning With scikit-learn 降维致力于解决三类问题.第一,降维可以缓解维度灾难问题.第二,降维可以在压缩数据的同时让信息损失最 ...
- PCA降维的原理、方法、以及python实现。
PCA(主成分分析法) 1. PCA(最大化方差定义或者最小化投影误差定义)是一种无监督算法,也就是我们不需要标签也能对数据做降维,这就使得其应用范围更加广泛了.那么PCA的核心思想是什么呢? 例如D ...
- 吴裕雄 python 机器学习——主成份分析PCA降维
# -*- coding: utf-8 -*- import numpy as np import matplotlib.pyplot as plt from sklearn import datas ...
- opencv基于PCA降维算法的人脸识别
opencv基于PCA降维算法的人脸识别(att_faces) 一.数据提取与处理 # 导入所需模块 import matplotlib.pyplot as plt import numpy as n ...
- [机器学习 ]PCA降维--两种实现 : SVD或EVD. 强力总结. 在鸢尾花数据集(iris)实做
PCA降维--两种实现 : SVD或EVD. 强力总结. 在鸢尾花数据集(iris)实做 今天自己实现PCA,从网上看文章的时候,发现有的文章没有搞清楚把SVD(奇异值分解)实现和EVD(特征值分解) ...
- python机器学习使用PCA降维识别手写数字
PCA降维识别手写数字 关注公众号"轻松学编程"了解更多. PCA 用于数据降维,减少运算时间,避免过拟合. PCA(n_components=150,whiten=True) n ...
- PCA降维的原理及实现
PCA可以将数据从原来的向量空间映射到新的空间中.由于每次选择的都是方差最大的方向,所以往往经过前几个维度的划分后,之后的数据排列都非常紧密了, 我们可以舍弃这些维度从而实现降维 原理 内积 两个向量 ...
随机推荐
- python线程中的同步问题
多线程开发可能遇到的问题 假设两个线程t1和t2都要对num=0进行增1运算,t1和t2都各对num修改1000000次,num的最终的结果应该为2000000.但是由于是多线程访问,有可能出现下面情 ...
- Docker国内Yum源和国内镜像仓库
Docker国内Yum源和国内镜像仓库 2018年05月29日 :: nklinsirui 阅读数 6295更多 分类专栏: Docker 版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa ...
- Appium Android 获取包名appPackage和appActivity的几种方法
情况1: 安装包未安装到手机 准备前提条件: 1 Android SDK管理工具目录 2 PC端有apk包 使用方法: 1 打开终端,当前路径移动到sdk管理工具目录tools或build-tools ...
- N4_75条语法
1. コ/ソ/ア/ド体系 -(こ.そ.あ.ど)れ/-(こ.そ.あ.ど)の A:-(こ.そ.あ.ど)れ 接续: 指示代词和场所代词,分近称.中称.远称.疑问称. 意思: 这个,那个,那个,哪个 例:これ ...
- java实现RPC
一,服务提供者 工程为battercake-provider,项目结构图如下图所示 1.1 先创建一个“卖煎饼”微服务的接口和实现类 package com.jp.service; public in ...
- NumPy 简介及安装
NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库.NumPy 的前身 Numeric 最早是 ...
- Linu目录结构和创建用户
具体目标结构 ./bin [重点] (/usr/bin./usr/local/bin) ●是Binary的速写,这个目录存放着最经常使用的命令. ./sbin (/usr/sbin./usr/loca ...
- CentOS7.6静默(无图形化界面)安装Oracle 11g
一.准备工作 1.准备CentOS 7 系统环境 由于是使用静默模式(silent)安装的,无需使用图形化界面,我选择了最小安装的服务器版的CentOS 7.安装完成后,只有命令行界面. 2.下载 O ...
- 白盒测试之JUnit与SpringTest的完美结合
通过白盒的单元测试可以验证程序基本功能的有效性,从而保证整个系统的质量,功在一时,利在千秋.目前80%以上公司后台还是基于java,尤其是后台大量采用Spring框架,我们这里采用Junit和Spri ...
- 模拟赛小结:The 2019 China Collegiate Programming Contest Harbin Site
比赛链接:传送门 上半场5题,下半场疯狂挂机,然后又是差一题金,万年银首也太难受了. (每次银首都会想起前队友的灵魂拷问:你们队练习的时候进金区的次数多不多啊?) Problem J. Justify ...