在python中运行PCA时奇怪的内存消耗行为

时间:2018-01-15 13:14:05

标签: python performance memory runtime pca

目前我正在尝试在Python中找到特定行为的原因。

首先,我想描述一下我的用例。这个想法是对Python的性能分析。因此,我想分析关于"主成分分析" 算法的内存使用运行时。为此,我使用scikit-learn(http://scikit-learn.org/stable/modules/generated/sklearn.decomposition.PCA.html)。

为了了解算法对不同数据集的行为,我生成了几个随机统一的分布式数据集。奇怪的是,内存使用量增加,两个数据集的运行时间更快。

现在我想解释一下,我将如何衡量内存使用情况和运行时间。 内存测量(包:https://pypi.python.org/pypi/memory_profiler

  • 禁用垃圾回收
  • 使用@profile装饰查找功能的增量
  • 将输出写入日志文件
  • 使用另一个python程序查找属于特定数据集的日志文件的增量
  • 总结增量 - 结果是完整函数的总内存分配 (我也用启用垃圾收集测试了它)

时间测量(功能:https://docs.python.org/2/library/timeit.html

  • 使用" timeit.repeat()"获取函数的许多运行时列表
  • 将这些测量列表写入CSV

在我执行了大约100次记忆测量和更多时间测量之后,我认识到了上述行为。 希望你能帮助我,找到这种行为的理由。

这是我测量的功能:

@profile 
def pcaTrain(dataset):
 model = sklearn_pca.fit(dataset)
 model.variance = np.var(model.transform(dataset), axis=0, ddof=1)
 return model 

以下是内存使用情况和时间测量的一些图表:

Memory measurements for dataset 4-17

Runtime measurements for dataset 4-17

设置:

  • Python-version:3.5.2

  • 记忆:> 100 GB

数据集列表:

  • dset04 - >每列1.000.000行(10个特征x 1.000.000)

  • dset05 - >每列1.000.000行(12个特征x 1.000.000)

  • dset06 - >每列1.000.000行(14个特征x 1.000.000)

  • dset07 - >每列1.000.000行(16个特征x 1.000.000)

  • dset08 - >每列1.000.000行(18个特征x 1.000.000)

  • dset09 - >每列1.000.000行(20个特征x 1.000.000)

  • dset10 - >每列1.000.000行(22个特征x 1.000.000)

  • dset11 - >每列1.000.000行(24个特征x 1.000.000)

  • dset12 - >每列1.000.000行(26个特征x 1.000.000)

  • dset13 - >每列1.000.000行(28个特征x 1.000.000)

  • dset14 - >每列1.000.000行(30个特征x 1.000.000)

  • dset15 - >每列1.000.000行(35个特征x 1.000.000)

  • dset16 - >每列1.000.000行(40个特征x 1.000.000)

  • dset17 - >每列1.000.000行(45个特征x 1.000.000)

1 个答案:

答案 0 :(得分:0)

重要的问题是,你提取的功能有多少。 从Scikit-learn的0.18版本开始,PCA算法的svd_solver标志决定使用哪种算法。
默认行为是选择" best"选择,在official documentation which you mentioned中有详细描述。
可能,其中一个选项会影响您的表现,具体取决于组件的数量。否则,我建议你在scikit-learn的官方GitHub中提到这种行为,因为这对他们来说也很有趣。