returns samples according to the KDE
		
			Parameters
			----------
				sample_inices: list of ints
					Indices into the training data used as centers for the samples
				
				num_samples: int
					if samples_indices is None, this specifies how many samples
					are drawn.

def sample(self, sample_indices=None, num_samples=1):
		""" returns samples according to the KDE
		
			Parameters
			----------
				sample_inices: list of ints
					Indices into the training data used as centers for the samples
				
				num_samples: int
					if samples_indices is None, this specifies how many samples
					are drawn.
				
		"""
		if sample_indices is None:
			sample_indices = np.random.choice(self.data.shape[0], size=num_samples)
		samples = self.data[sample_indices]

		samples = samples.squeeze()
		
		if self.num_values == 1:
			# handle cases where there is only one value!
			return(samples)
		
		probs = self.bw * np.ones(self.num_values)/(self.num_values-1)
		probs[0] = 1-self.bw
		
		delta = np.random.choice(self.num_values, size=num_samples, p = probs)
		samples = np.mod(samples + delta, self.num_values)	

		return(samples)