PCA算法+python实现(法一)步步详细解析
###(法一)步步详细解析 +(法二)scikit-learn快速实现
方法1. 编程一步一步实现
Software version: Python 2.7.12 |Anaconda 4.2.0 (64-bit)|
####我们以定义函数的形式来一步一步进行
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