def mean_var(self, x): phi_new = utility.compute_RBF(self.basis, x, self.length_scale) print phi_new intermediate = phi_new.T*self.A_inv mean = intermediate*self.phi_mat*self.Y var = self.noise*intermediate*phi_new return mean, var
def add_data(self, x, y): """ x is R ^ {1 * k} y is in R """ if self.n == 0: self.basis = array([x]) self.points = array([x]) self.phi_mat = mat( utility.compute_RBF(self.basis, x, self.length_scale)) # NOTE: self.A = mat(self.noise + self.phi_mat**2) self.A_inv = 1/self.A self.Y = mat([y]) self.k += 1 else: phi_new = utility.compute_RBF(self.basis, x, self.length_scale) vec = self.A_inv*phi_new var = phi_new.T*vec self.A_inv = self.A_inv - vec*vec.T/(1+var) if self.noise*var <= self.vu: """ Not adding basis. """ print var self.A = self.A + phi_new*phi_new.T self.phi_mat = hstack([self.phi_mat, phi_new]) else: """ Add basis. """ phi_new_2 = utility.compute_RBF(self.points, x, self.length_scale) self.k += 1 d = utility.compute_RBF([x], x, self.length_scale) left_vec = self.phi_mat*phi_new_2 + float(d)*phi_new last = phi_new_2.T*phi_new_2 + d**2 + self.noise vec = self.A_inv*left_vec var = left_vec.T*vec common_factor = 1.0/(last - var) # Update A self.A = vstack([hstack([self.A + phi_new*phi_new.T, left_vec ]), hstack([left_vec.T, last])]) # Update A_inv self.A_inv = vstack([hstack([self.A_inv + (vec*vec.T)*float(common_factor), -float(common_factor)*vec]), hstack([-float(common_factor)*vec.T, common_factor])]) # Update self.phi_mat self.phi_mat = vstack([hstack([self.phi_mat, phi_new]), hstack([phi_new_2.T, d])]) # Add to basis self.basis = r_[self.basis, [x]] #print linalg.norm(linalg.inv(self.phi_mat*self.phi_mat.T+self.noise*eye(self.n+1)) - linalg.inv(self.A)) #print linalg.norm(linalg.inv(self.A) - self.A_inv) # Add to points self.points = r_[self.points, [x]] # Add to self.Y self.Y = vstack([self.Y, mat([y])]) self.n += 1