def predictWithKernelMatrices(self, K1pred, K2pred, row_inds = None, col_inds = None): """Computes predictions for test examples. Parameters ---------- K1pred: {array-like, sparse matrix}, shape = [n_samples1, n_basis_functions1] the first part of the test data matrix K2pred: {array-like, sparse matrix}, shape = [n_samples2, n_basis_functions2] the second part of the test data matrix Returns ---------- P: array, shape = [n_samples1, n_samples2] predictions """ if row_inds == None: P = sparse_kronecker_multiplication_tools_python.x_gets_A_kron_B_times_sparse_v(self.A, K1pred, K2pred.T, self.label_row_inds, self.label_col_inds) P = P.reshape((K1pred.shape[0], K2pred.shape[0]), order='F') else: P = sparse_kronecker_multiplication_tools_python.x_gets_C_times_M_kron_N_times_B_times_v( self.A, K2pred, K1pred, np.array(row_inds, dtype = np.int32), np.array(col_inds, dtype = np.int32), self.label_row_inds, self.label_col_inds) P = np.array(P) return P
def predictWithKernelMatrices(self, K1pred, K2pred, row_inds=None, col_inds=None): """Computes predictions for test examples. Parameters ---------- K1pred: {array-like, sparse matrix}, shape = [n_samples1, n_basis_functions1] the first part of the test data matrix K2pred: {array-like, sparse matrix}, shape = [n_samples2, n_basis_functions2] the second part of the test data matrix Returns ---------- P: array, shape = [n_samples1, n_samples2] predictions """ if row_inds == None: P = sparse_kronecker_multiplication_tools_python.x_gets_A_kron_B_times_sparse_v( self.A, K1pred, K2pred.T, self.label_row_inds, self.label_col_inds) P = P.reshape((K1pred.shape[0], K2pred.shape[0]), order='F') else: P = sparse_kronecker_multiplication_tools_python.x_gets_C_times_M_kron_N_times_B_times_v( self.A, K2pred, K1pred, np.array(row_inds, dtype=np.int32), np.array(col_inds, dtype=np.int32), self.label_row_inds, self.label_col_inds) return P
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 solve_linear(self, regparam): self.regparam = regparam X1 = self.resource_pool['xmatrix1'] X2 = self.resource_pool['xmatrix2'] self.X1, self.X2 = X1, X2 if 'maxiter' in self.resource_pool: maxiter = int(self.resource_pool['maxiter']) else: maxiter = None x1tsize, x1fsize = X1.shape #m, d x2tsize, x2fsize = X2.shape #q, r lsize = len(self.label_row_inds) #n kronfcount = x1fsize * x2fsize label_row_inds = np.array(self.label_row_inds, dtype=np.int32) label_col_inds = np.array(self.label_col_inds, dtype=np.int32) 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 mvr(v): raise Exception('You should not be here!') return None def cgcb(v): self.W = v.reshape((x1fsize, x2fsize), order='F') self.callback() G = LinearOperator((kronfcount, kronfcount), matvec=mv, rmatvec=mvr, dtype=np.float64) v_init = np.array(self.Y).reshape(self.Y.shape[0]) v_init = sparse_kronecker_multiplication_tools_python.x_gets_A_kron_B_times_sparse_v( v_init, X1.T, X2, label_row_inds, label_col_inds) v_init = np.array(v_init).reshape(kronfcount) if self.resource_pool.has_key('warm_start'): x0 = np.array(self.resource_pool['warm_start']).reshape(kronfcount, order='F') else: x0 = None self.W = bicgstab(G, v_init, x0=x0, maxiter=maxiter, callback=cgcb)[0].reshape((x1fsize, x2fsize), order='F') self.model = LinearPairwiseModel(self.W, X1.shape[1], X2.shape[1]) self.finished()
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 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 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 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 solve_linear(self, regparam): self.regparam = regparam X1 = self.resource_pool['xmatrix1'] X2 = self.resource_pool['xmatrix2'] self.X1, self.X2 = X1, X2 if 'maxiter' in self.resource_pool: maxiter = int(self.resource_pool['maxiter']) else: maxiter = None x1tsize, x1fsize = X1.shape #m, d x2tsize, x2fsize = X2.shape #q, r lsize = len(self.label_row_inds) #n kronfcount = x1fsize * x2fsize label_row_inds = np.array(self.label_row_inds, dtype = np.int32) label_col_inds = np.array(self.label_col_inds, dtype = np.int32) 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 mvr(v): raise Exception('You should not be here!') return None def cgcb(v): self.W = v.reshape((x1fsize, x2fsize), order = 'F') self.callback() G = LinearOperator((kronfcount, kronfcount), matvec = mv, rmatvec = mvr, dtype = np.float64) v_init = np.array(self.Y).reshape(self.Y.shape[0]) v_init = sparse_kronecker_multiplication_tools_python.x_gets_A_kron_B_times_sparse_v(v_init, X1.T, X2, label_row_inds, label_col_inds) v_init = np.array(v_init).reshape(kronfcount) if self.resource_pool.has_key('warm_start'): x0 = np.array(self.resource_pool['warm_start']).reshape(kronfcount, order = 'F') else: x0 = None self.W = bicgstab(G, v_init, x0 = x0, maxiter = maxiter, callback = cgcb)[0].reshape((x1fsize, x2fsize), order='F') self.model = LinearPairwiseModel(self.W, X1.shape[1], X2.shape[1]) self.finished()
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