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

2024-04-24 23:55:52 发布

您现在位置:Python中文网/ 问答频道 /正文

目前,我正试图找出Python中某个特定行为的原因。你知道吗

首先我想描述一下我的用例。其思想是对Python进行性能分析。因此,我想分析内存使用量运行时关于“主成分分析”-算法。为此,我使用sciketlearn(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

  • “使用”时间。重复()”以获取函数的许多运行时的列表
  • 将这些度量的列表写入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版本: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)


Tags: 数据函数内存orggt功能算法列表
1条回答
网友
1楼 · 发布于 2024-04-24 23:55:52

重要的问题是,要提取多少特性。 由于sciket learn的版本为0.18,PCA算法的svd_solver标志决定使用哪种算法。
默认行为是选择“最佳”选项,这在official documentation which you mentioned中有详细描述。
根据组件的数量,其中一个选择可能会影响您的性能。否则,我建议您在sciketlearn的官方GitHub中提及此行为,因为这对他们来说也可能很有趣。你知道吗

相关问题 更多 >