向函数添加更多属性:时间和迭代改进

时间:2018-06-01 10:50:42

标签: python numpy iteration mathematical-optimization large-data

我有一个用python编写的函数,它执行两个过程:

  1. 预处理:从数组中读取数据并计算一些我稍后需要防止重复计算的值
  2. 迭代并计算摘要'每个阶段的数据,并用它来解决优化问题。
  3. 代码如下:

    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))行,而是使用不同的随机变换,其应用速度更快,但原则上它足以解决问题。这段代码适用于我需要的东西,但我想知道是否有合理的方法来执行以下操作:

    1. 有没有办法指定S_A = m**(-0.5)*np.random.normal(size=(m, n))的独立随机副本的数量(num_iters - 可以被认为是10到30之间){{在迭代之前需要1}}并且只扫描输入一次以生成所有这样的副本?我认为这会将S_A变量存储在某种多维数组中,但我不确定如何最好地执行此操作,或者它是否实用。我已经尝试了一个基本的例子并行执行此操作,但它比重复通过矩阵要慢。
    2. 假设我想赋予此函数更多属性,例如我想返回行S_A上的平均时间。这样做很简单 - 导入一个时间模块并将代码放在函数中,但是,这将始终是函数的时间,也许我只想在测试时执行此操作。一个简单的方法是在函数定义x_new = np.linalg.solve(B,z)中创建一个参数,然后让time_updates = False按照上面的if time_updates == False:进行复制完全相同的代码但添加了一些计时功能。有没有更好的方法可以使用Python中的类?
    3. 我的目的是对从不适合内存的文件中读取的数据块使用此迭代。虽然可以将块存储在内存中,但是如果函数只通过该块一次而不是else:次,则会很方便。传递计算的数量,num_itersS_A等,但是很好。

0 个答案:

没有答案