首页 > 程序开发 > Web开发 > Python >

python实现PCA算法02

2017-09-29

PCA python实现(法2) 运行version: Python 3 5 2 |Anaconda 4 2 0 (64-bit) 编写端version: Python 2 7 12 |Anaconda 4 2 0 (64-bit) 2 scikit-learn 实现 此代码的流程完整,涉及预测

python实现PCA

运行version: Python 3.5.2 |Anaconda 4.2.0 (64-bit)

编写端version: Python 2.7.12 |Anaconda 4.2.0 (64-bit)

2. scikit-learn 实现

此代码的流程完整,涉及预测,有训练集和预测集,在得到主成份对应的特征向量后,在预测集上进行映射,对应模型给出预测集的预测值。

鉴于数据的上传问题,在此给出完整代码以及详细注释。在运行过程中操作者带入本地数据,注意数据格式的衔接即可顺利得到结果。

2.1 导入模块

# -*- coding: utf-8 -*-
# @Time    : 2017/8/2 14:18
# @Author  : LinYimeng
# @Site    : 
# @File    : sklearnPCA.py
# @Software: PyCharm Community Edition
from sklearn.decomposition import PCA
from sklearn import preprocessing  ##标准化使用
import pandas as pd
import 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
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")
相关文章
最新文章
热点推荐