现在,我正在使用numpy.linalg.solve
来求解矩阵,但是实际上我正在使用它来求解5000 * 17956矩阵,这确实很耗时。它运行非常缓慢,花了我一个多小时才解决。用于求解矩阵方程的运行时间可能为O(n ^ 3),但我从未想到过会这么慢。有什么方法可以在Python中更快地解决它?
我的代码类似于这样,以解决方程BT * UT = BT*B a
的问题,其中m
是测试用例的数量(在我的情况下超过5000),B
是数据矩阵m*17956
,而u
是1*m
。
C = 0.005 # hyperparameter term for regulization
I = np.identity(17956) # 17956*17956 identity matrix
rhs = np.dot(B.T, U.T) # (17956*m) * (m*1) = 17956*1
lhs = np.dot(B.T, B)+C*I # (17956*m) * (m*17956) = 17956*17956
a = np.linalg.solve(lhs, rhs) # B.T u = B.T B a, solve for a (17956*1)
答案 0 :(得分:2)
更新(2018年7月2日)::更新后的问题询问正则项的影响以及矩阵中数据的类型。总的来说,这可能会对特定CPU最优化的数据类型产生巨大影响(粗略的经验法则,在所有其他条件都很好的情况下,AMD最好使用矢量化整数数学,而Intel可以使用矢量化浮点数学更好)保持相等),并且大量零值的存在可以允许使用稀疏矩阵库。但是,在这种特殊情况下,主对角线的变化(远低于所考虑的所有值的1%)对运行时间的影响可以忽略不计。
TLDR;
lhs
和rhs
的预处理几乎没有用完。numpy.linalg.solve
相比,您将无法更快地解决确切的问题。m
很小,并且B
是可逆的,那么您可以在一分钟或更短的时间内求解方程U.T=Ba
。np.dot(U, B).T
而不是np.dot(B.T, U.T)
。移调整齐。这样可以避免在像B
这样的大矩阵上进行转置,尽管由于您将三次运算作为主要步骤,所以这对您的问题无关紧要。scipy.linalg.solve
中的参数以获取收益。 答案 1 :(得分:1)