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可以将数据从原来的向量空间映射到新的空间中.由于每次选择的都是方差最大的方向,所以往往经过前几个维度的划分后,之后的数据排列都非常紧密了, 我们可以舍弃这些维度从而实现降维 原理 内积 两个向量 ...
随机推荐
- CSUST 2012 一个顶俩 (本校OJ题)(思维+树链剖分)
(点击这里查看原题,不保证可以进去....外网可能比较卡) Description A:一心一意 B:一个顶俩 最近QQ更新后那个成语接龙好像挺火的?但我只知道图论里一条边是一个顶俩个点的emm. 如 ...
- php设计模式之注册模式
注册模式,解决全局共享和交换对象.已经创建好的对象,挂在到某个全局可以使用的数组上,在需要使用的时候,直接从该数组上获取即可.将对象注册到全局的树上.任何地方直接去访问. <?php class ...
- TOPK 问题
TOPK 问题 描述 如从海量数字中寻找最大的 k 个,这类问题我们称为 TOPK 问题,通常使用堆来解决: 求前 k 大,用最小堆 求前 k 小,用最大堆 例子 现有列表 [1, 2, 0, 3, ...
- mac下开启phpredis扩展
下载 官网下载php合适的版本:http://pecl.php.net/package/redis 这里我的php版本:7.1.23,下载的phpredis版本:5.0.0 配置安装 解包.重命名 s ...
- Docker架构及其三要素
1.Docker架构 a.Docker客户端和服务端 Docker是客户-服务器(C/S)架构的程序.Docker客户端只需向Docker服务器或守护进程发出请求,服务器或守护进程将完成所有工作并 ...
- 2019-2020-1 20199319《Linux内核原理与分析》第八周作业
可执行程序工作原理 ELF目标文件格式 1.目标文件(ABI,应用程序二进制接口):编译器生成的文件. 2.目标文件的格式:out格式.COFF格式.PE(windows)格式.ELF(Linux)格 ...
- swoole如何在后台运行
swoole如何在后台运行 nohup php server.php &
- Summer training round2 #6 (Training #22)
A:二分答案 如果中位数比目前的大就right=mid-1 else left=mid+1 C!:几何 G:优先队列贪心 #include <bits/stdc++.h> using na ...
- Java 和JavaScript实现C#中的String.format效果
1.Java实现 /** * 需要引入com.alibaba.fastjson.1.2.8 * String result2=HuaatUtil.format(templa ...
- JAVA GUI设
1.两种设置大小的方式: //Border border1=BorderFactory.createEmptyBorder(20,20,20,20); //设置大小 panel.setB ...