gpt4 book ai didi

python - numpy:矩阵乘法比向量的总和快吗?

转载 作者:行者123 更新时间:2023-11-28 21:09:56 29 4
gpt4 key购买 nike

我正在使用 numpy 在 python 中实现线性回归。我对平方成本函数的实现如下所示

square_cost(w, datax, datay):
ndata = datax.shape[1]
return (1/ndata)*np.sum((h(w, datax)-datay)**2)

所有的参数都是二维的ndarrays,但是datay和result的高度只有1。

我后来看到的是这个实现:

square_cost(w, datax, datay):
ndata = datax.shape[1]
diff = h(w, datax)-datay
return (1/ndata)*diff.dot(diff.T)

我认为我的第一个实现最清晰,但第二个实现是否更快,因为它使用点积?

最佳答案

设置

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 loops, best of 3: 3.66 ms per loop

%%timeit
diff = x - y
np.square(diff).sum()

100 loops, best of 3: 6.85 ms per loop

我会说是的。点积更快。


编辑:

为了完整性和解决@Eric 在评论中对 OP 问题的担忧。

在手头的回归中,内生 (y) 变量的维度是 n x 1。因此,我们可以安全地假设第二个维度的大小始终为 1。

但是,如果它的大小大于 1,比如说 m,(这绝对是可能的,只是不是 OP 所需要的)那么我们将查看维度为 n x k 的外生 (X) 和内生 ( Y) 的维度 n x m。这意味着大小为 k x m 的参数矩阵 Theta。还是完全合理的。更重要的是,为了计算误差平方和,我们将对 (X * Theta - Y) 进行平方和求和。 (X * Theta - Y) 的内积不再适合作为计算成本函数的方法,它的性能无关紧要。为了得到合适的东西,我们将 (X * Theta - Y) reshape 为一维,然后取内积。在这种情况下,我们在一个维度上所做的相同分析仍然是最合适的分析。

综上所述,我运行了以下代码:

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()

enter image description here

点积是明显的赢家,而且更加一致。


关于python - numpy:矩阵乘法比向量的总和快吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37356645/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com