我做迭代递归加权最小二乘回归。这里有两个主要部分:找出权重和拟合回归。
拟合由statsmodels.regression.linear_model.WLS.fit (2个矩阵乘法,1个矩阵求逆和3个其他矩阵乘法)组成,耗时约3ms。
固定权重由减去两个数组组成,将每个元素除以标量,对每个元素平方,找到相反的元素,加1,在每个和0之间找到最大值(epanechnikov核关于拟合的标准化误差)
err = y - y_hat
h = np.std(err) * c
w=np.maximum(0,1-(err/h)**2)但它需要30ms。我不明白为什么矩阵求逆所需的时间要少10倍。我们讨论的是3000x3000矩阵和3000x1数组(y,y_hat,err和w),c是标量,取决于大小(本例中是3000的函数)。消耗最多的是第三行(>80%的计算时间)。
现在这看起来不是很多,但我必须做很多这样的事情。
我怎样才能加速这个过程?
发布于 2020-05-20 20:12:37
一个小点,但是你有**2;(err/h)*(err/h)呢?
我认为使用**的成本更高。在Spyder中,如果我定义了两个函数:
def function_a(i):
a=i**2
return(a)
def function_b(i):
b=i*i
return(b)从控制台运行,我得到了这些结果;乘法速度快了3倍。
%timeit for x in range(100): function_a(x)
30.2 µs ± 1.12 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
%timeit for x in range(100): function_b(x)
11.5 µs ± 185 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)https://stackoverflow.com/questions/61912579
复制相似问题