设置
import numpy as np
np.random.seed([3, 1415])
x = np.random.rand(1000000, 1)
y = np.random.rand(1000000, 1)
%%timeit
diff = x - y
diff.T.dot(diff)
100 次循环,3 次中的最佳:每个循环 3.66 毫秒
%%timeit
diff = x - y
np.square(diff).sum()
100 个循环,3 个循环中的最佳值:每个循环 6.85 毫秒
我会说是的。点积更快。
编辑:
为了完整性和解决@Eric 在评论中对 OP 问题的关注。
在手头的回归中,内生 (y) 变量的维度是 n x 1。因此,我们可以安全地假设第二维度的大小始终为 1。
但是,如果它的大小大于 1,比如 m,(这绝对是可能的,只是不是 OP 需要的),那么我们将查看维度为 nxk 和内生 ( Y) 尺寸为 nx m。这意味着大小为 k x m 的参数矩阵 Theta。还是完全合理的。更重要的是,为了计算误差平方和,我们将 (X * Theta - Y) 平方和求和。 (X * Theta - Y) 的内积不再适合作为计算成本函数的方法,其性能也无关紧要。为了得到合适的东西,我们将 (X * Theta - Y) 重塑为一维,然后取内积。在这种情况下,我们对一维所做的分析仍然是最合适的分析。
说了这么多,我运行了以下代码:
idx = pd.Index(np.arange(1000, 501000, 1000)).sort_values()
ddd = pd.DataFrame(index=idx, columns=['dot', 'dif'])
def fill_ddd(row):
i = row.name
x = np.random.rand(i, 1)
s = pd.datetime.now()
for _ in range(100):
x.T.dot(x)
row.loc['dot'] = (pd.datetime.now() - s).total_seconds() / 100.
s = pd.datetime.now()
for _ in range(100):
np.square(x).sum()
row.loc['dif'] = (pd.datetime.now() - s).total_seconds() / 100.
return row
np.random.seed([3, 1415])
ddd.apply(fill_ddd, axis=1)
ddd.plot()
点积是明显的赢家,而且更加一致。