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可以将数据从原来的向量空间映射到新的空间中.由于每次选择的都是方差最大的方向,所以往往经过前几个维度的划分后,之后的数据排列都非常紧密了, 我们可以舍弃这些维度从而实现降维 原理 内积 两个向量 ...
随机推荐
- Java代码 简单用于处理和数据库相关的操作
package util; import org.apache.commons.beanutils.BeanUtils; import java.lang.reflect.InvocationTarg ...
- [Nest] 05.nest之数据库
数据库 Nest 与数据库无关,允许您轻松地与任何 SQL 或 NoSQL 数据库集成.根据您的偏好,您有许多可用的选项.一般来说,将 Nest 连接到数据库只需为数据库加载一个适当的 Node.js ...
- [Next] 五.next自定义内容
自定义 head 这是默认的 head 这样的 head 并不能满足我们的需求.next 公开了一个内置组件,用于将元素追加到<head>标签的.我们可以通过这个自定义 head 新建 c ...
- @RequestMapping-限定请求方法的映射
限定请求方法的映射 测试: 如果非指定的请求方法访问时会出现405状态:
- TypeScript 和 JavaScript 的区别
TypeScript 和 JavaScript 是目前项目开发中较为流行的两种脚本语言,我们已经熟知 TypeScript 是 JavaScript 的一个超集.JavaScript 和 TypeSc ...
- angular项目中ts的配置编译tsconfig.json
{ "compilerOptions": { /* 基本选项 */ "target": "es5", // 指定 ECMAScript 目标 ...
- jquery ready load
jq 加载三种写法 $(document).ready(function() { // ...代码... }) //document ready 简写 $(function() { // ...代码. ...
- 使用Django的ORM详细操作
1.自己动手创建数据库 create database 数据库名; 2.在Django项目中设置连接数据库的相关配置(告诉Django连接哪一个数据库) #在数据库相关的配置 DATABASES = ...
- dedecms 多级栏目时,调用上级栏目名称和链接
{dede:field name='position' runphp='yes'} $tc="-"; //分隔符 $tw=$GLOBALS['cfg_list_symbol']; ...
- python、第八篇:索引原理与慢查询优化
一 介绍 1. 为何要有索引? 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,在生产环境中,我们遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,因此对查 ...