def optimize(self, search='rigid', method='powell', start=None, radius=BRAIN_RADIUS_MM, tol=1e-1, ftol=1e-2): """ radius: a parameter for the 'typical size' in mm of the object being registered. This is used to reformat the parameter vector (translation+rotation+scaling+shearing) so that each element roughly represents a variation in mm. """ if start == None: T = Affine(subtype=search, radius=radius) else: T = Affine(subtype=search, vec12=start.vec12, radius=radius) tc0 = T.to_param() # Loss function to minimize def loss(tc): T.from_param(tc) return -self.eval(T) def callback(tc): T.from_param(tc) print(T) print(self.similarity + ' = %s' % self.eval(T)) print('') # Switching to the appropriate optimizer print('Initial guess...') print(T) if method=='simplex': print ('Optimizing using the simplex method...') tc = sp.optimize.fmin(loss, tc0, callback=callback, xtol=tol, ftol=ftol) elif method=='powell': print ('Optimizing using Powell method...') tc = sp.optimize.fmin_powell(loss, tc0, callback=callback, xtol=tol, ftol=ftol) elif method=='conjugate_gradient': print ('Optimizing using conjugate gradient descent...') tc = sp.optimize.fmin_cg(loss, tc0, callback=callback, gtol=ftol) else: raise ValueError('Unrecognized optimizer') # Output T.from_param(tc) return T
def explore(self, ux=[0], uy=[0], uz=[0], rx=[0], ry=[0], rz=[0], sx=[1], sy=[1], sz=[1], qx=[0], qy=[0], qz=[0]): grids = np.mgrid[0:len(ux), 0:len(uy), 0:len(uz), 0:len(rx), 0:len(ry), 0:len(rz), 0:len(sx), 0:len(sy), 0:len(sz), 0:len(qx), 0:len(qy), 0:len(qz)] ntrials = np.prod(grids.shape[1:]) UX = np.asarray(ux)[grids[0,:]].ravel() UY = np.asarray(uy)[grids[1,:]].ravel() UZ = np.asarray(uz)[grids[2,:]].ravel() RX = np.asarray(rx)[grids[3,:]].ravel() RY = np.asarray(ry)[grids[4,:]].ravel() RZ = np.asarray(rz)[grids[5,:]].ravel() SX = np.asarray(sx)[grids[6,:]].ravel() SY = np.asarray(sy)[grids[7,:]].ravel() SZ = np.asarray(sz)[grids[8,:]].ravel() QX = np.asarray(qx)[grids[9,:]].ravel() QY = np.asarray(qy)[grids[10,:]].ravel() QZ = np.asarray(qz)[grids[11,:]].ravel() simis = np.zeros(ntrials) vec12s = np.zeros([12, ntrials]) T = Affine() for i in range(ntrials): t = np.array([UX[i], UY[i], UZ[i], RX[i], RY[i], RZ[i], SX[i], SY[i], SZ[i], QX[i], QY[i], QZ[i]]) T.set_vec12(t) simis[i] = self.eval(T) vec12s[:, i] = t return simis, vec12s