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

本文介绍了如何使用Python从头开始实现PCA(主成分分析),包括数据标准化、计算协方差矩阵、求解特征值和特征向量,并给出了两种选择主成分的方法:按数量选取和按信息累积比例选取。
摘要由CSDN通过智能技术生成

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 得到降维后的数据后,接着进行线性回归的分析

希望与广大网友互动??

点此进行留言吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值