我有一个用python编写的函数,它执行两个过程:
代码如下:
import numpy as np
def iterative_hessian(data, targets,
sketch_method, sketch_size, num_iters):
'''
Original problem is min 0.5*||Ax-b||_2^2
iterative_hessian asks us to minimise 0.5*||S_Ax||_2^2 - <A^Tb, x>
for a summary of the data S_A
'''
A = data
y = targets
n,d = A.shape
x0 = np.zeros(shape=(d,))
m = int(sketch_size) # sketching dimension
ATy = A.T@y
covariance_mat = A.T.dot(A)
for n_iter in range(int(num_iters)):
S_A = m**(-0.5)*np.random.normal(size=(m, n))
B = S_A.T.dot(S_A)
z = ATy - covariance_mat@x0 + np.dot(S_A.T, np.dot(S_A,x0)) #
x_new = np.linalg.solve(B,z)
x0 = x_new
return np.ravel(x0)
在实践中,我不使用S_A = m**(-0.5)*np.random.normal(size=(m, n))
行,而是使用不同的随机变换,其应用速度更快,但原则上它足以解决问题。这段代码适用于我需要的东西,但我想知道是否有合理的方法来执行以下操作:
S_A = m**(-0.5)*np.random.normal(size=(m, n))
的独立随机副本的数量(num_iters
- 可以被认为是10到30之间){{在迭代之前需要1}}并且只扫描输入一次以生成所有这样的副本?我认为这会将S_A
变量存储在某种多维数组中,但我不确定如何最好地执行此操作,或者它是否实用。我已经尝试了一个基本的例子并行执行此操作,但它比重复通过矩阵要慢。S_A
上的平均时间。这样做很简单 - 导入一个时间模块并将代码放在函数中,但是,这将始终是函数的时间,也许我只想在测试时执行此操作。一个简单的方法是在函数定义x_new = np.linalg.solve(B,z)
中创建一个参数,然后让time_updates = False
按照上面的if time_updates == False:
进行复制完全相同的代码但添加了一些计时功能。有没有更好的方法可以使用Python中的类?我的目的是对从不适合内存的文件中读取的数据块使用此迭代。虽然可以将块存储在内存中,但是如果函数只通过该块一次而不是else:
次,则会很方便。传递计算的数量,num_iters
,S_A
等,但是很好。