我做了一个可重复的例子,说明了我真正想要做的事情,问题是同一个维度。
任何人都可以向我解释这些时间差异,我在拟合阶段所做的更改是X[:,:]
(变量的数量为504)我使用X[:,range(0,504)]
?
from sklearn import linear_model
import numpy as np
y = np.random.normal(0,1,15000)
X = np.random.normal(0,1,15000*504)
X = np.reshape(X, (15000, 504))
Z = X.copy()
Z = X[:, range(0,504)]
np.allclose(Z,X)
# True
linear_model.Ridge(alpha=100).fit(X,y)
# Timing: 54.45 seconds
linear_model.Ridge(alpha=100).fit(Z,y)
# Timing: 5.89 seconds
np.allclose(Z,X)
# True
通过在这里选择一系列变量(所有变量),如何加速几乎10倍?当我使用Z = X[:, :]
时,时间也约为54秒。
那么以这种方式选择范围真是太神奇了?
根据DSM的要求:
OS: Ubuntu 13.04
>>> sklearn.__version__
'0.14.1'
>>> np.__version__
'1.7.0'
>>> X.__array_interface__
{'data': (139670867165200, False), 'shape': (15000, 504), 'descr': [('', '<f8')],
'version': 3, 'strides': None, 'typestr': '<f8'}
>>> Z.__array_interface__
{'data': (139670746202128, False), 'shape': (15000, 504), 'descr': [('', '<f8')],
'version': 3, 'strides': (8, 120000), 'typestr': '<f8'}
>>> y.__array_interface__
{'data': (23622352, False), 'shape': (15000,), 'descr': [('', '<f8')], 'version':
3, 'strides': None, 'typestr': '<f8'}
答案 0 :(得分:2)
在我的盒子上,我得到了:
>>> X.flags
C_CONTIGUOUS : True
F_CONTIGUOUS : False
...
>>> Z.flags
C_CONTIGUOUS : False
F_CONTIGUOUS : True
...
这意味着由基于列的花式索引引起的内存复制会影响Z阵列的内部内存布局。您也可以尝试:
>>> Z2 = np.asfortranarray(X)
一些numpy例程可能无法将正确的标志传递给BLAS / LAPACK例程,以针对C连续内存布局进行优化。我正在运行numpy的开发版本,我无法观察到任何性能差异。自1.7.0发布以来,该问题可能已得到解决。