python中pca算法_python实现PCA算法01

python实现PCA算法

Software version: Python 2.7.12 |Anaconda 4.2.0 (64-bit)|

法1. 编程一步一步实现

法2. sklearn

我们以定义函数的形式来一步一步进行

1.1 导入模块:Numpy,Pandas

# -*- coding: utf-8 -*-

# @Time : 2017/8/17 14:20

# @Author : LinYimeng

# @Site :

# @File : PCA.py

# @Software: PyCharm Community Edition

import numpy as np

import pandas as pd

df1 = pd.DataFrame({'x1':np.random.randn(8),'x2':np.random.randn(8),'x3':np.random.randn(8),'x4':np.random.randn(8)})

1.2 z-score 标准化

零均值化 :第一步.求每一列的平均值和标准差,第二步,该列上新数据=(原数据-均值)/标准差。

python备注: DataFrame和Series之间的算术运算会将Series的索引匹配到DataFrame的列,然后沿着行一直向下运算(广播)。

def standardization(dataX):

###pca程序1 ,准备程序

meanVal=dataX.mean(axis=0) ###我们的数据变量按列进行排列(即一行为一个样本),按列求均值,即求各个特征的均值

#meanVal = np.mean(dataX, axis=0) ###此同为np的方法,得到Series

stdVal=dataX.std(axis=0)

datasTad =(dataX-meanVal)/stdVal

return datasTad

1.3 pca主体部分,(为便于理解首先逐步编写,最后定义函数合并)

1.3.1 求相关系数或者协方差矩阵

PCA可以根据相关系数矩阵,也可以根据协方差矩阵进行计算。经标准化的样本数据的协方差矩阵就是原始样本数据的相关矩阵。

python备注:DataFrame的corr和cov方法将以DataFrame 的形式反悔完整的相关系数或协方差矩阵。

# dataCov = datasTad.cov()

## dataCorr = datasTad.corr()

1.3.2 求特征值、特征矩阵

python备注:numpy.linalg函数中的eig函数(参数类型为array),可以直接由covMat求得特征值和特征向量。

# newData1 = np.array(dataCov)

# eigenValue, eigenVector = np.linalg.eig(newData1)

# print eigenValue,eigenVector

特征值和特征向量是一一对应的.eg:

[ 2.28755238 1.19050837 0.00740526 0.51453398]

[[-0.35550858 -0.75662146 0.49766033 0.23123975]

[ 0.41457366 -0.5522369 -0.22386014 -0.68778611]

[-0.53285545 0.2980044 0.39214938 -0.68809688]

[-0.64638023 -0.18371651 -0.74056715 -0.00106679]]

1.3.3 保留特征值比较大的前n个主成分

python备注: np.argsort函数返回的是数组值从小到大的索引值

# sorceEigenValue = np.argsort(eigenValue))

# pcaEigenValue = sorceEigenValue[-n]

# pcaEigenVector = eigenVector[pcaEigenValue]

# print sorceEigenValue

1.3.4 将1.3.1-1.3.4步骤写入pca定义函数

给定要选取的主成份个数 n .

def pcan(dataX,datasTad,n):

#pca 程序2,主程序

dataCov = datasTad.cov()

newData1 = np.array(dataCov)

eigenValue, eigenVector = np.linalg.eig(newData1)#求得特征值,特征向量

sorceEigenValue = np.argsort(eigenValue) #特征值下标从小到大的排列顺序

nPcaEigenVector = sorceEigenValue[-n:] #最大的n个特征值的下标

pcaEigenVector = eigenVector[nPcaEigenVector] #选取特征值对应的特征向量

PCAX = np.dot(dataX , pcaEigenVector.T) #得到降维后的数据

return PCAX ,pcaEigenVector

对选取主成份的个数还可以另一种选法:根据解释原始信息的程度选取,给定累计解释率 a

def pcaPercentage(dataX,datasTad,percentage= 0.85):

#pca 程序2,主程序

dataCov = datasTad.cov()

newData1 = np.array(dataCov)

eigenValue, eigenVector = np.linalg.eig(newData1)#求得特征值,特征向量

sortEigenValue = np.argsort(eigenValue) #特征值下标从小到大的排列顺序

sorceEigenValue=np.sort(eigenValue) #升序

cumEigenValue = np.cumsum(sorceEigenValue) #特征值累加

sumEigenValue= sum(sorceEigenValue) #特征值求和

k =0 #计数,k最终结果为对应要提取的主成份个数

for i in cumEigenValue:

k = k+1

if i >=sumEigenValue*percentage:

break

nPcaEigenVector = sorceEigenValue[-k:] #最大的k个特征值的下标

pcaEigenVector = eigenVector[nPcaEigenVector] #选取特征值对应的特征向量

PCAX = np.dot(dataX , pcaEigenVector.T) #得到降维后的数据

return PCAX ,pcaEigenVector,k

if __name__ == "__main__":

# 导入数据,切记不含因变量。我们在此构造df1数据,此数据变量间没有一定的相关性,只做计算演示。

df1 = pd.DataFrame({'x1':np.random.randn(8),'x2':np.random.randn(8),'x3':np.random.randn(8),'x4':np.random.randn(8)})

datasTad = standardization(df1)

PCAX,pcaEigenVector = pcan(df1,datasTad,2)#选取前两个主成份

# PCAX,pcaEigenVector ,k =pcaPercentage(dataX,datasTad,percentage= 0.85)

print pcaEigenVector

# print PCAX

# print k

[[ 0.05859874 0.63246821]

[ 1.76814374 -0.81231113]

[-0.76487122 0.71552014]

[ 0.45433 0.05110494]

[-0.1879232 -0.21065165]

[-0.66398789 -1.08685442]

[ 2.57674664 0.03846883]

[-0.37070498 -1.61123788]]

1.6 分析主成份的现实意义

1.5 得到降维后的数据后,接着进行线性回归的分析

希望与广大网友互动??

点此进行留言吧!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/436975.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

设计模式(一)预备知识

前言 学习设计模式需要有面向对象编程的基础,要基本掌握一种面向对象的编程语言。关于面向对象编程思想,我们有另外一篇文章专门讲解:面向过程和面向对象的联系和区别。 知识点 虚函数 在类的成员函数定义中,形式上为定义为vir…

【转】GitHub 从单机到联机:玩转 Pull Request

最近在参与一个叫 Exercism 的项目,这是一个由 GitHub 生态工程师 Katrina Owen 发起的编程练习社区,提供了超过50门语言的练习。作为用户,你仅需使用命令行工具即可下载和提交练习,提交后还可以和社区中其他学习者交流讨论。 Exe…

android cmake 打印_Android使用CMAKE编译libjpeg

本文主要介绍使用 CMAKE 编译 libjpeg-turbo 类库,本文相关代码请在GitHub-TurboJpegSample 查看。libjpeg-turbo 附GitHub 地址,libjpeg-turbo 是个运用极其广泛的库,可以说,基本上电脑上手机上能见到的 JPEG 压缩的地方用的一般…

设计模式(四)结构型模式

前言 结构型设计模式,主要研究: 主要有哪些场景使用结构型设计模式;每种场景应该使用何种设计模式;以程序中的功能为核心,研究程序功能的组织结构。所以这一章,我们要把“功能结构”作为研究的核心。 下…

centos 删除crontab_centos下crontab的使用

4.cron文件语法:分 小时 日 月 星期 命令0-59 0-23 1-31 1-12 0-6 command (取值范围,0表示周日一般一行对应一个任务)5.记住几个特殊符号的含义:“*”代表取值范围内的数字,“/”代表”每”,“-”代表从某个数字到某个数字,“,”分开…

【转】GitHub客户端操作1--仓库相关操作github团队协作流程

1、创建仓库 点击“”,点击Create,然后填写Name为my,点击Create repository,即可创建一个my仓库 2、从本地仓库存放位置,添加test仓库到GitHub客户端 点击“”,点击Add,然后点击Browse,选择仓库存放位置&a…

音视频相关链接

开发库 FFmpeg FFmpeg官网 FFmpeg github 平台相关 DirectShow DirectShow简介 DirectShow官网

【转】GitHub客户端操作2--分支操作

简单分支操作 (1)创建新分支:my分支 备注:新创建的分支:my分支里面的内容是和master分支里面的内容是完全一样的。 (2)删除my分支 (3)修改my分支【在my分支上进行项目内…

uniapp动态修改样式_uniapp样式动态绑定

场景一:用户点击按钮后动态切换按钮选中样式(如图)已上线未开始//选择状态selectState(e){this.whichSelectede.currentTarget.dataset.state}.state-btn-content{//write your style.state-btn-selected{ ... }.state-btn-noselect{ ... }}注:需要注意的…

音视频工程师(初步)(一)音视频的基本概念

1. 前言 本文是音视频工程师系列的第一篇文章。 学习音视频的过程中发现,网络上高质量的音视频技术博客不是很多。具有代表性的是 雷神的 雷霄骅的CSDN博客 因为笔者是一名普通的软件开发人员,一向不喜欢高高在上或者晦涩难懂的理论,我们…

【转】GitHub客户端操作3--pull Request(拉请求)

一、参考说明 参考文章一:Github上提交代码(pullrequest) 网址: https://jingyan.baidu.com/article/358570f64dcdc2ce4724fc32.html 参考文章二:GitHub——Pull Request 网址:http://blog.csdn.net/u012325167/article/detai…

webstorm 内存溢出怎么弄_webstrom 内存溢出,软件崩溃卡死解决的方法

今天用gulp搭建了一个工程,准备做一个体育h5的项目,其中需要用到sass代码压缩,加版本号等功能.gulpfile.js和package.json都是已经写好的.我用CMD命令窗口cnpm安装node_modules依赖文件.当我安装完毕之后用webstrom打开时,第一件事先把node_modules排除忽略了.如下:然后我去编辑…

躺平也要看,2022年计算机相关考试汇总

1. 全国计算机专业资格考试(软考) 1.1 官网 全国官网:https://www.ruankao.org.cn/,从全国官网首页的底部可以直达各个省区的考试机构报名网站。 1.2 考试安排 软考一年两次。 场次报名时间考试时间上半年 预计报名时间在2月…

【转】GitHub上README.md教程

本文是转载文章,文章的来源:csdn博客 博主:果冻虾仁 文章: GitHub上README写法暨GFM语法解读 博文地址:https://blog.csdn.net/guodongxiaren/article/details/23690801 转载请保留原作者guodongxiaren的原文地址&…

python supervisor flask_supervisor配合uwsgi部署flask应用

这已经是第N次来部署flask应用了, 但是每次都花了不少时间在配置上面, 这里一次性记录下, 备个忘~写在前面其实使用uwsgi来部署flask应用在官网上已经有较为详细的 文档 了, 推荐先读一下.先解决一些问题:为何使用 uwsgi 来部署应用? 方便管理; 较为常见的部署方式; 可配置性较…

设计模式(五)行为型模式

前言 在上一篇结构型模式中,我们以功能为基本单位,研究了一些设计模式,用于实现功能转换、功能组合、功能封装等目的。 我们知道,面向对象编程有两个核心元素:对象、对象间通信协作。从面向对象的角度看,…

51单片机auxr寄存器_51—52系列单片机特殊功能寄存器一览表

P2.1P2.0RSTP3.0/RXDP3.1/TXDXTAL2XTAL1P3.2/INT0P3.3/INT1P3.4/T0P3.5/T1GNDVCCP1.7P1.6P1.5P1.4P1.3P1.2P1.1/AIN1P1.0/AIN0P3.7注:类似的还有Philips公司的87LPC64,20引脚8XC748/750/(751),24引脚8X749(752),28引脚8XC754&…

【转】WPF单位真的与分辨率无关吗?

转载自http://www.cnblogs.com/helloj2ee/archive/2009/04/21/1440709.htm WPF从发布之日起,一直将“分辨率无关(resolution independence)”作为其亮点,声称使用WPF制作的用户界面在轻巧的Ultra-Mobile PC的屏幕上和在50英寸的电视机上都能很好地显示。…

设计模式(六)J2EE 模式

前言 本章设计模式只挑了一些必要的加以讲解,因为有的设计模式过于简单或者根本用不到,可以不做了解。 MVC 模式 使用说明 MVC模式可以说是最有名的设计模式之一。它提出将软件的数据模型Model、视图Visual、控制器Controller三者分开封装&#xff0c…

ubuntu设置始终亮屏_ubuntu设置关闭屏幕和锁定

见链接:http://askubuntu.com/questions/177348/how-do-i-disable-the-screensaver-lockIf you want to wrap your app in a script that takes care of this for you when you launch it (or GUI simply isnt an option), the best command-line solution as of Ub…