【问题标题】:numpy: is matrix multiplication faster than sum of a vector?numpy:矩阵乘法比向量之和快吗?
【发布时间】:2016-09-18 07:21:37
【问题描述】:

我正在使用 numpy 在 python 中实现线性回归。我的平方成本函数的实现是这样的

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

所有参数都是二维ndarrays,但是datay和结果只有一个高度。

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

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

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

【问题讨论】:

  • " 矩阵的维度不相关。" - 它们绝对是 - 这些解决方案在传递具有更多维度的参数时表现得非常不同
  • @Eric 啊谢谢,我已经编辑了问题

标签: python numpy matrix machine-learning


【解决方案1】:

设置

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

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


【讨论】:

  • 我可以确认类似的结果。
  • 感谢您展示如何计时!在 Eric 更正后,我会建议进行编辑
猜你喜欢
  • 1970-01-01
  • 2020-05-30
  • 2014-03-01
  • 1970-01-01
  • 2023-01-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多