def hessian(v, p, X1, X2, Y, rowind, colind, lamb): #P = np.dot(X,v) #P = vecProd(X1, X2, v) P = sparse_kronecker_multiplication_tools_python.x_gets_subset_of_A_kron_B_times_v(v, X2, X1.T, colind, rowind) z = (1. - Y*P) z = np.where(z>0, z, 0) sv = np.nonzero(z)[0] #map to rows and cols rows = rowind[sv] cols = colind[sv] p_after = sparse_kronecker_multiplication_tools_python.x_gets_subset_of_A_kron_B_times_v(p, X2, X1.T, cols, rows) p_after = sparse_kronecker_multiplication_tools_python.x_gets_A_kron_B_times_sparse_v(p_after, X1.T, X2, rows, cols) p_after = p_after.reshape(X2.shape[1], X1.shape[1]).T.ravel() return p_after + lamb*p
def func(v): #REPLACE #P = np.dot(X,v) P = sparse_kronecker_multiplication_tools_python.x_gets_subset_of_A_kron_B_times_v(v, X2, X1.T, colind, rowind) z = (1. - Y*P) z = np.where(z>0, z, 0) return np.dot(z,z)
def mv(v): v_after = sparse_kronecker_multiplication_tools_python.x_gets_subset_of_A_kron_B_times_v( v, X1, X2.T, label_row_inds, label_col_inds) v_after = sparse_kronecker_multiplication_tools_python.x_gets_A_kron_B_times_sparse_v( v_after, X1.T, X2, label_row_inds, label_col_inds) + regparam * v return v_after
def func(v): #REPLACE #P = np.dot(X,v) P = sparse_kronecker_multiplication_tools_python.x_gets_subset_of_A_kron_B_times_v( v, X2, X1.T, colind, rowind) z = (1. - Y * P) z = np.where(z > 0, z, 0) return np.dot(z, z) + lamb * np.dot(v, v)
def hessian(v, p): #P = np.dot(X,v) #P = vecProd(X1, X2, v) P = sparse_kronecker_multiplication_tools_python.x_gets_subset_of_A_kron_B_times_v( v, X2, X1.T, colind, rowind) z = (1. - Y * P) z = np.where(z > 0, z, 0) sv = np.nonzero(z)[0] #map to rows and cols rows = rowind[sv] cols = colind[sv] p_after = sparse_kronecker_multiplication_tools_python.x_gets_subset_of_A_kron_B_times_v( p, X2, X1.T, cols, rows) p_after = sparse_kronecker_multiplication_tools_python.x_gets_A_kron_B_times_sparse_v( p_after, X1.T, X2, rows, cols) p_after = p_after.reshape(X2.shape[1], X1.shape[1]).T.ravel() return 2 * p_after + lamb * p
def predictWithDataMatricesAlt(self, X1pred, X2pred, row_inds = None, col_inds = None): if row_inds == None: P = np.dot(np.dot(X1pred, self.W), X2pred.T) P = P.reshape(X1pred.shape[0] * X2pred.shape[0], 1, order = 'F') else: P = sparse_kronecker_multiplication_tools_python.x_gets_subset_of_A_kron_B_times_v(self.W.reshape((self.W.shape[0] * self.W.shape[1], 1), order = 'F'), X1pred, X2pred.T, np.array(row_inds, dtype=np.int32), np.array(col_inds, dtype=np.int32)) #P = X1pred * self.W * X2pred.T return P
def func(v, X1, X2, Y, rowind, colind, lamb): #REPLACE #P = np.dot(X,v) P = sparse_kronecker_multiplication_tools_python.x_gets_subset_of_A_kron_B_times_v(v, X2, X1.T, colind, rowind) z = (1. - Y*P) #print z z = np.where(z>0, z, 0) #return np.dot(z,z) return 0.5*(np.dot(z,z)+lamb*np.dot(v,v))
def gradient(v, X1, X2, Y, rowind, colind, lamb): #REPLACE #P = np.dot(X,v) #P = vecProd(X1, X2, v) P = sparse_kronecker_multiplication_tools_python.x_gets_subset_of_A_kron_B_times_v(v, X2, X1.T, colind, rowind) z = (1. - Y*P) z = np.where(z>0, z, 0) sv = np.nonzero(z)[0] #map to rows and cols rows = rowind[sv] cols = colind[sv] #A = -2*np.dot(X[sv].T, Y[sv]) A = - sparse_kronecker_multiplication_tools_python.x_gets_A_kron_B_times_sparse_v(Y[sv], X1.T, X2, rows, cols) A = A.reshape(X2.shape[1], X1.shape[1]).T.ravel() #B = 2 * np.dot(X[sv].T, np.dot(X[sv],v)) v_after = sparse_kronecker_multiplication_tools_python.x_gets_subset_of_A_kron_B_times_v(v, X2, X1.T, cols, rows) v_after = sparse_kronecker_multiplication_tools_python.x_gets_A_kron_B_times_sparse_v(v_after, X1.T, X2, rows, cols) B = v_after.reshape(X2.shape[1], X1.shape[1]).T.ravel() #print "FOOOBAAR" return A + B + lamb*v
def primal_rls_objective(w, X1, X2, Y, rowind, colind, lamb): #primal form of the objective function for regularized least squares #w: current primal solution #X1: samples x features data matrix for domain 1 #X2: samples x features data matrix for domain 2 #rowind: row indices for training pairs #colind: column indices for training pairs #lamb: regularization parameter P = sparse_kronecker_multiplication_tools_python.x_gets_subset_of_A_kron_B_times_v(w, X2, X1.T, colind, rowind) z = (Y - P) return 0.5*(np.dot(z,z)+lamb*np.dot(w,w))
def primal_svm_objective(w, X1, X2, Y, rowind, colind, lamb): #primal form of the objective function for support vector machine #w: current primal solution #X1: samples x features data matrix for domain 1 #X2: samples x features data matrix for domain 2 #rowind: row indices for training pairs #colind: column indices for training pairs #lamb: regularization parameter #P = np.dot(X,v) P = sparse_kronecker_multiplication_tools_python.x_gets_subset_of_A_kron_B_times_v(w, X2, X1.T, colind, rowind) z = (1. - Y*P) z = np.where(z>0, z, 0) return 0.5*(np.dot(z,z)+lamb*np.dot(w,w))
def gradient(v): #REPLACE #P = np.dot(X,v) #P = vecProd(X1, X2, v) P = sparse_kronecker_multiplication_tools_python.x_gets_subset_of_A_kron_B_times_v( v, X2, X1.T, colind, rowind) z = (1. - Y * P) z = np.where(z > 0, z, 0) sv = np.nonzero(z)[0] #map to rows and cols rows = rowind[sv] cols = colind[sv] #A = -2*np.dot(X[sv].T, Y[sv]) A = -2 * sparse_kronecker_multiplication_tools_python.x_gets_A_kron_B_times_sparse_v( Y[sv], X1.T, X2, rows, cols) A = A.reshape(X2.shape[1], X1.shape[1]).T.ravel() #B = 2 * np.dot(X[sv].T, np.dot(X[sv],v)) v_after = sparse_kronecker_multiplication_tools_python.x_gets_subset_of_A_kron_B_times_v( v, X2, X1.T, cols, rows) v_after = 2 * sparse_kronecker_multiplication_tools_python.x_gets_A_kron_B_times_sparse_v( v_after, X1.T, X2, rows, cols) B = v_after.reshape(X2.shape[1], X1.shape[1]).T.ravel() #print "FOOOBAAR" return A + B + lamb * v
def predictWithDataMatricesAlt(self, X1pred, X2pred, row_inds=None, col_inds=None): if row_inds == None: P = np.dot(np.dot(X1pred, self.W), X2pred.T) P = P.reshape(X1pred.shape[0] * X2pred.shape[0], 1, order='F') else: P = sparse_kronecker_multiplication_tools_python.x_gets_subset_of_A_kron_B_times_v( self.W.reshape((self.W.shape[0] * self.W.shape[1], 1), order='F'), X1pred, X2pred.T, np.array(row_inds, dtype=np.int32), np.array(col_inds, dtype=np.int32)) #P = X1pred * self.W * X2pred.T return P
def dual_from_primal(self): w = self.W.ravel() X1 = self.resource_pool['xmatrix1'] X2 = self.resource_pool['xmatrix2'] rowind = np.array(self.label_row_inds, dtype = np.int32) colind = np.array(self.label_col_inds, dtype = np.int32) P = sparse_kronecker_multiplication_tools_python.x_gets_subset_of_A_kron_B_times_v(w, X2, X1.T, colind, rowind) #choose support vectors here? K1 = self.resource_pool['kmatrix1'] K2 = self.resource_pool['kmatrix2'] ddim = len(rowind) def mv(v): return sparse_kronecker_multiplication_tools_python.x_gets_C_times_M_kron_N_times_B_times_v(v, K2, K1, rowind, colind, rowind, colind) def rv(v): return sparse_kronecker_multiplication_tools_python.x_gets_C_times_M_kron_N_times_B_times_v(v, K2, K1, rowind, colind, rowind, colind) K = LinearOperator((ddim, ddim), matvec=mv, rmatvec=rv, dtype=np.float64) #A = lsmr(K, P, maxiter=100)[0] A = cg(K, P, maxiter=100)[0] return KernelPairwiseModel(A, rowind, colind)
def mv(v): v_after = sparse_kronecker_multiplication_tools_python.x_gets_subset_of_A_kron_B_times_v(v, X1, X2.T, label_row_inds, label_col_inds) v_after = sparse_kronecker_multiplication_tools_python.x_gets_A_kron_B_times_sparse_v(v_after, X1.T, X2, label_row_inds, label_col_inds) + regparam * v return v_after