numpy:矩阵乘法比矢量之和快吗?

Chr*_*ram 2 python numpy machine-learning matrix

我正在使用numpy在python中实现线性回归.我对平方成本函数的实现看起来像这样

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

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

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

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

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

piR*_*red 6

建立

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)
Run Code Online (Sandbox Code Playgroud)

100个循环,最佳3:3.66毫秒每个循环

%%timeit
diff = x - y
np.square(diff).sum()
Run Code Online (Sandbox Code Playgroud)

100个循环,最佳3:6.85毫秒每循环

我会说是的.Dot产品更快.


编辑:

为了完整性并在OP的问题中解决@ Eric对评论的关注.

在手边的回归中,内生(y)变量的维数是nx 1.因此,我们可以安全地假设第二维的大小始终为1.

但是,如果它的大小大于1,比如m,(这肯定是可能的,而不是OP需要的那样)那么我们将看一个外生的(X)维度nxk和内生(Y)尺寸nx m.这意味着大小为kx 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()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

点积是明显的赢家,更加一致.