【问题标题】:Dimensionality reduction being way too slow using PCA and a small dataset使用 PCA 和小数据集降维太慢了
【发布时间】:2015-07-17 11:52:47
【问题描述】:

我使用 numpy 存储了以下数据集: https://www.dropbox.com/sh/ppseiv9skqlhljr/AACQEWZh11oszL5-Z_NHqre3a?dl=0

数据集的训练和开发分区有不同的numpy文件

[50,1,396]

我正在使用 mlpy 库中的 PCA Fast 来执行降维。但是整个过程太慢了,我不知道为什么。 在执行 PCA 之前,我将数据集转换为以下形状:

[50,396]

所以数据集的形状不是我的问题的原因。

我使用的代码如下:

import os
import numpy as np
import sys
import csv
import mlpy

inputfiletrain=''
outputfiletrain=''
inputfiledev=''
outputfiledev=''

def parseCommandLineArgs():
        global inputfiletrain
        global outputfiletrain
        global inputfiledev
        global outputfiledev

        for i in range(0, len(sys.argv)):

                if sys.argv[i] == 'inputfiletrain':
                        inputfiletrain = sys.argv[i + 1]
                        print
                        print "------*****Using Directory :*****------"
                        print 'inputfiletrain=' + inputfiletrain
                        print "------**********************------"
                        print

                if sys.argv[i] == 'outputfiletrain':
                        outputfiletrain = sys.argv[i + 1]
                        print
                        print "------*****Using Directory :*****------"
                        print 'outputfiletrain=' + outputfiletrain
                        print "------**********************------"
                        print

                if sys.argv[i] == 'inputfiledev':
                        inputfiledev = sys.argv[i + 1]
                        print
                        print "------*****Using Directory :*****------"
                        print 'inputfiledev=' + inputfiledev
                        print "------**********************------"
                        print

                if sys.argv[i] == 'outputfiledev':
                        outputfiledev = sys.argv[i + 1]
                        print
                        print "------*****Using outputFeatures Filename :*****------"
                        print 'outputfiledev=' + outputfiledev
                        print "------**********************------"
                        print




def pcaDimRed(features, nDims):
        X=np.empty([features.shape[0], features.shape[2]])
        print features.shape[2]
        print X.shape


        for i,f in enumerate(features):

            #np.append(X,f[0],axis=0)

            X[i]=f[0]
        #np.vstack(X)


        print X
        print "PCAStarting"
    #pca = mlpy.PCA(method='cov')
    pca=  mlpy.PCAFast(k=nDims, eps=0.1)
    pca.learn(X)
    coeff = pca.coeff()
    coeff = coeff[:,0:nDims]

        print "PCAEnding"
    featuresNew = []
    for f in X:
        ft = f.copy()
#       ft = pca.transform(ft, k=nDims)
        ft = np.dot(f, coeff)
        featuresNew.append(ft)


        thodwrisformat = np.empty((len(files), 1, mean.shape[0]))
        for i,f in enumerate(featuresNew):
            thodwrisformat[i][0]=f

    return (thodwrisformat, coeff)

def pcaDevelopmentSet(features, nDims,coeff):

        featuresNew = []

                for f in features:
                        ft = f.copy()
        #       ft = pca.transform(ft, k=nDims)
                        ft = np.dot(f, coeff)
                        featuresNew.append(ft)
                return featuresNew

parseCommandLineArgs()
print inputfiledev
FeaturesDev = np.load(inputfiledev)
FeaturesTrain = np.load(inputfiletrain)

PCATrain=pcaDimRed(FeaturesTrain,68)
FeaturesTrain=PCATrain[1]
coeff=PCATrain[2]
FeaturesDev=pcaDevelopmentSet(FeaturesDev, 68,coeff)


np.save(outputfiledev,FeaturesDev)
np.save(outputfiletrain,FeaturesTrain)

我在 ubuntu linux 和 python 2.7 下使用这个代码。要安装 mlpy,必须使用以下命令:

wget http://sourceforge.net/projects/mlpy/files/mlpy%203.5.0/mlpy-3.5.0.tar.gz
tar xvf mlpy-3.5.0.tar.gz
cd mlpy-3.5.0
sudo python setup.py install

最后要运行此代码,假设脚本存储为 pca.py,并且它与包含数据集分区的目录 feature_vectors 所在的文件夹位于同一文件夹中,必须使用以下命令:

python pca.py inputfiletrain feature_vectors/train/featuresShape.npy outputfiletrain feature_vectors/train/featuresShapePCA.npy inputfiledev feature_vectors/development/featuresShape.npy outputfiledev feature_vectors/development/featuresShapePCA.npy 

我需要想法,为什么 PCA 在这个数据集上这么慢...

【问题讨论】:

  • 是什么让你认为这个操作应该更快?您是否有证据表明它对于不同但大小相当的数据集更快?还是在不同的情况下?
  • 是的,他们在 mlpy 项目的文档中提供的快速 pca 示例会生成大小为 (100,100) 的随机矩阵,这些矩阵的处理速度要快得多...mlpy.sourceforge.net/docs/3.2/dim_red.html
  • @obelix 但这是一个更大的 50x396 矩阵! 19800 与 10.000。而且你没有提到你是如何测量牢度的:每个时期还是每个批次?
  • 每小时让我的笔记本电脑运行算法...尽管它应该以更合乎逻辑的时间结束...我已经让我的笔记本电脑保持清醒状态超过 8 小时并且该过程已经未完成...
  • 还有例子100x100的速度?

标签: python numpy pca


【解决方案1】:

关于你的讨论:

  • 如果您测量每批次的牢度:您的过程会因为更高的维度(即 396 的数据形状)而变慢。
  • 如果您测量每个 epoch 的牢度:由于数据更多,即 50x396 = 19800 与 100x100 随机示例相比,您的过程会更慢。

【讨论】:

  • 如果我使用计时器,则 100x100 示例数据集需要不到 5 分钟的时间......我的数据集需要超过 8 小时,并且该过程未完成......
  • 好的,我尝试复制它。
  • 您确定 mlpy 安装方法正确吗:george@templar:~$ tar xvf mlpy-3.5.0.tar.gz gzip: stdin: not in gzip format tar: Child 返回状态 1 tar : 错误不可恢复:现在退出
猜你喜欢
  • 2017-08-05
  • 2013-03-06
  • 2013-12-31
  • 2015-02-28
  • 1970-01-01
  • 2019-07-21
  • 1970-01-01
  • 1970-01-01
  • 2013-09-30
相关资源
最近更新 更多