TomographicImaging / CIL

A versatile python framework for tomographic imaging
https://tomographicimaging.github.io/CIL/
Apache License 2.0
95 stars 41 forks source link

CIL operator norm uses power method with only 10 inner iternations #1704

Open MargaretDuff opened 8 months ago

MargaretDuff commented 8 months ago

When we use step_size=1/Lipschitz constant, and the CIL norm underestimates the norm, this leads to a larger step size and could cause issues with convergence.

Something to discuss with @epapoutsellis, @jakobsj and @paskino

MargaretDuff commented 8 months ago

Discussed with @zeljkozeljko

Example

m, n = 900, 1000
 A =  np.random.normal(0, 1, (m, n))
 U, S, VT = np.linalg.svd(A, full_matrices=False)
 smallest_eigenval = 1e-2
 largest_eigenval = 1.
 Anew = U @ np.diag([(smallest_eigenval + (largest_eigenval-smallest_eigenval)*(1-j/(len(S)-1))) for j in range(len(S))]) @ VT
 Aop = MatrixOperator(Anew) 
print('cil norm {}, numpy norm {}'.format(Aop.norm()**2 ,np.linalg.norm(Anew, ord=2) ** 2))
MargaretDuff commented 8 months ago

Suggestion: Perhaps when calculating the Lipschitz constant of least squares, we could use a larger iteration number for the power method?