PCA算法+python实现(法一)一步一步实现+(法二)scikit-learn+快速实现
来源:互联网 发布:手机麻将服务端源码 编辑:程序博客网 时间:2024/04/28 01:46
PCA算法+python实现(法一)一步一步实现
方法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 Editionimport 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 得到降维后的数据后,接着进行线性回归的分析(可参考下面程序)
PCA+python实现(法2)scikit-learn+快速实现
运行version: Python 3.5.2 |Anaconda 4.2.0 (64-bit)
编写端version: Python 2.7.12 |Anaconda 4.2.0 (64-bit)
此代码的流程完整,涉及预测,有训练集和预测集,在得到主成份对应的特征向量后,在预测集上进行映射,对应模型给出预测集的预测值。
鉴于数据的上传问题,在此给出完整代码以及详细注释。在运行过程中操作者带入本地数据,注意数据格式的衔接即可顺利得到结果。
2.1 导入模块
# -*- coding: utf-8 -*-# @Time : 2017/8/2 14:18# @Author : LinYimeng# @Site : # @File : sklearnPCA.py# @Software: PyCharm Community Editionfrom sklearn.decomposition import PCAfrom sklearn import preprocessing ##标准化使用import pandas as pdimport numpy as np
2.2数据准备,同法1一样,需要将数据转化为 array
def ready_pca(train,test):###pca程序1 ,准备程序 #选出自变量 trainX =train.ix[:,['暴风影音', '乐视网', '爱奇艺', '腾讯视频', '爱音乐', '唱吧', '有杀气童话', '金山电池医生']].fillna(0) ##如果最后一列为因变量,选取所有自变量则可以 ##trainX = train.ix[:,:len(train.T)] #包头不包尾部因变量 testX =test.ix[:,['暴风影音', '乐视网', '爱奇艺', '腾讯视频', '爱音乐', '唱吧', '有杀气童话', '金山电池医生']].fillna(0) trainX = preprocessing.scale(trainX ) #标准化 testX = preprocessing.scale(testX ) #标准化 colume = list(trainX.columns) trainX1 = np.array(trainX) testX1 = np.array(testX) return trainX1,testX1,colume
2,3 主成份
def pca_train(trainX1,testX1,colume):#pca 程序2,主程序 pca=PCA(copy=True, n_components=3, whiten=False) ## n_components ,如果带入参数为整数,则参数为选取的主成份的个数;如果带入参数为小于1大于0的小数,则按照选取的主成份的个数 ## 当whiten,True(默认为假)时,将将component_矢量乘以n_samples的平方根,然后除以奇异值,以确保具有单位分量方差的不相关输出。将从变换的信号(组的相对方差尺度)中消除一些信息,但有时可以通过使其数据符合一些硬连线的假设,来提高下游估计量的预测精度。 ## copy : bool (default True),如果False,传递给fit的数据将被覆盖并运行适合(X).transform(X)将不会产生预期结果,请改用fit_transform(X)。 pca.fit(trainX1) #### 将trainX1传入定义好的pca模型 components = pca.components_ ####选取的特征向量对应的系数array pacTrainX = pca.transform(trainX1) #####将trainX1在构造好的pca模型上进行映射 pcaTestX = pca.transform(testX1) ####test主成份 ratio = pca.explained_variance_ratio_ ####选取的主成份分别对应的方差解释率 差占比 sum_rati0 = reduce(lambda x,y:x+y,ratio) ####选取主成份的解释方差 print('pacTrainX,pca.fit',pca) print('pcaTestX,ratio',ratio) print('sum_rati0',sum_rati0) defen_train = pd.DataFrame(pacTrainX,columns = colume) components_train = pd.DataFrame(components,columns = colume) defen_test = pd.DataFrame(pcaTestX ,columns = colume) return pacTrainX,pcaTestX,defen_train,components_train,ratio,sum_rati0,defen_test
2.4 对生成主成份的数据进行线性预测
def Linear(pacTrainX,trainy,pcaTestX): pca_svc = LinearSVC() pca_svc.fit(defen_train,trainy) pca_y_predict= pca_svc.predict(defen_test ) return pca_y_predict
“`python
if name == “main“:
train = pd.read_csv(“F:\wo\train.csv”)
test = pd.read_csv(“F:\wo\test.csv”)
jiangwei_train1,jiangwei_test1,pca334_colume=ready_pca(train,test)defen_train,components_train,ratio,sum_rati0,defen_test=pca_train(jiangwei_train1,jiangwei_test1)defen_train.to_csv("F:\\wo\\defen_train.csv")defen_train.to_csv("F:\\wo\\defen_test.csv")components_train.to_csv("F:\\wo\\components_train.csv")
- PCA算法+python实现(法一)一步一步实现+(法二)scikit-learn+快速实现
- sklearn(scikit-learn)快速入门【Python实现】
- 决策树算法实现(scikit-learn)
- 用Python一步一步实现PCA
- 用Python Scikit-learn 实现机器学习十大算法--朴素贝叶斯算法(文末有代码)
- 第6节--决策树算法实现(scikit-learn)
- 基于scikit-learn实现各种算法
- scikit-learn实现决策树
- scikit-learn实现决策树
- 【机器学习一】五种线性回归原理以及代码实现(python基于SCIKIT-LEARN库)
- PCA详解-并用scikit-learn实现PCA压缩红酒数据集
- 使用Scikit-learn实现基于内存的协同过滤算法(使用movieLens数据集)
- scikit-learn:通过TruncatedSVD实现LSA(隐含语义分析)
- Scikit-learn实现基于模型的推荐系统(SVD)
- 【Python学习系列二十四】scikit-learn库逻辑回归实现唯品会用户购买行为预测
- 【Python学习系列二十九】scikit-learn库实现天池平台智慧交通预测赛
- PCA(主成份分析法)技术及其Python实现
- 在Python中一步一步实现Principal Component Analysis(PCA)
- Hadoop
- Spring ActiveMQ 整合(二.1): 重发机制概念解释
- java数据类型
- Js如何遍历Set
- canvas绘制圆环进度条
- PCA算法+python实现(法一)一步一步实现+(法二)scikit-learn+快速实现
- 锁定游戏光标和隐藏
- 深度学习解决大规模文本分类问题
- WegVirtmgr配置过程
- RabbitMQ及Erlang内存使用分析
- Python 异常处理
- 20170927
- Apache Spark 2.2.0 中文文档
- Spring+Quartz实现定时任务的配置方法