def update(self,i=0): # Regenerate GMs merged_gauss_2d = GaussianMixture(weights, means, covariances, max_num_mixands=self.num_mixands) matlab_merged_gauss_2d = self.parent.matlab_gm(weights, means, covariances, max_num_mixands=self.num_mixands) # Replot GMs title = 'Python Merged GM ({} mixands)'.format(merged_gauss_2d.weights.size) if hasattr(self,'old_contour'): merged_gauss_2d.contourf = self.old_contour merged_gauss_2d.plot_remove() self.old_contour = merged_gauss_2d.plot(ax=self.axes[1], levels=self.levels, title=title) title = 'Matlab Merged GM ({} mixands)'.format(matlab_merged_gauss_2d.weights.size) if hasattr(self,'old_matlab_contour'): matlab_merged_gauss_2d.contourf = self.old_matlab_contour matlab_merged_gauss_2d.plot_remove() self.old_matlab_contour = matlab_merged_gauss_2d.plot(ax=self.axes[2], levels=self.levels, title=title) # Decrement mixands (with wrapping) if self.num_mixands == self.max_num_mixands: self.num_mixands = 1 elif np.int(self.num_mixands * self.mixand_rate) < self.max_num_mixands: self.num_mixands = np.int(self.num_mixands * self.mixand_rate) else: self.num_mixands = self.max_num_mixands
def update(self, i=0): # Regenerate GMs merged_gauss_2d = GaussianMixture( weights, means, covariances, max_num_mixands=self.num_mixands) matlab_merged_gauss_2d = self.parent.matlab_gm( weights, means, covariances, max_num_mixands=self.num_mixands) # Replot GMs title = 'Python Merged GM ({} mixands)'.format( merged_gauss_2d.weights.size) if hasattr(self, 'old_contour'): merged_gauss_2d.contourf = self.old_contour merged_gauss_2d.plot_remove() self.old_contour = merged_gauss_2d.plot(ax=self.axes[1], levels=self.levels, title=title) title = 'Matlab Merged GM ({} mixands)'.format( matlab_merged_gauss_2d.weights.size) if hasattr(self, 'old_matlab_contour'): matlab_merged_gauss_2d.contourf = self.old_matlab_contour matlab_merged_gauss_2d.plot_remove() self.old_matlab_contour = matlab_merged_gauss_2d.plot( ax=self.axes[2], levels=self.levels, title=title) # Decrement mixands (with wrapping) if self.num_mixands == self.max_num_mixands: self.num_mixands = 1 elif np.int(self.num_mixands * self.mixand_rate) < self.max_num_mixands: self.num_mixands = np.int(self.num_mixands * self.mixand_rate) else: self.num_mixands = self.max_num_mixands
def test_merging(self, num_mixands=100, max_num_mixands=10, spread=4, speak=False): if max_num_mixands is None: animate = True max_num_mixands = num_mixands else: animate = False # Generate the unmerged and merged gaussians weights, means, covariances = generate_random_params(num_mixands, ndims=2, spread=spread) unmerged_gauss_2d = GaussianMixture(weights.copy(), means.copy(), covariances.copy(), max_num_mixands=len(weights)) merged_gauss_2d = GaussianMixture(weights.copy(), means.copy(), covariances.copy(), max_num_mixands=max_num_mixands) matlab_merged_gauss_2d = self.matlab_gm(weights.copy(), means.copy(), covariances.copy(), max_num_mixands) mixtures = {'unmerged': unmerged_gauss_2d, 'merged': merged_gauss_2d, 'matlab merged': matlab_merged_gauss_2d } # Setup figure and levels fig = plt.figure(figsize=(18,6)) axes = [] _, max_1 = unmerged_gauss_2d.max_point_by_grid() _, max_2 = merged_gauss_2d.max_point_by_grid() _, max_3 = matlab_merged_gauss_2d.max_point_by_grid() max_prob = np.max((max_1, max_2, max_3)) levels = np.linspace(0, max_prob * 1.2, 50) # Plot all three ax = fig.add_subplot(131) axes.append(ax) title = 'Original GM ({} mixands)'\ .format(unmerged_gauss_2d.weights.size) unmerged_gauss_2d.plot(ax=ax, levels=levels, title=title) ax = fig.add_subplot(132) axes.append(ax) title = 'Python Merged GM ({} mixands)'\ .format(merged_gauss_2d.weights.size) merged_gauss_2d.plot(ax=ax, levels=levels, title=title) ax = fig.add_subplot(133) axes.append(ax) title = 'Matlab Merged GM ({} mixands)'\ .format(matlab_merged_gauss_2d.weights.size) matlab_merged_gauss_2d.plot(ax=ax, levels=levels, title=title) # Add a colorbar fig.subplots_adjust(right=0.85) cbar_ax = fig.add_axes([0.875, 0.1, 0.025, 0.8]) fig.colorbar(unmerged_gauss_2d.contourf, cax=cbar_ax) class GMAnimation(object): """docstring for merged_gm""" def __init__(self, parent, mixand_rate=2, levels=None, axes=None): self.max_num_mixands = mixtures['unmerged'].weights.size self.num_mixands = 1 self.mixand_rate = mixand_rate self.levels = levels self.axes = axes self.parent = parent def update(self,i=0): # Regenerate GMs merged_gauss_2d = GaussianMixture(weights, means, covariances, max_num_mixands=self.num_mixands) matlab_merged_gauss_2d = self.parent.matlab_gm(weights, means, covariances, max_num_mixands=self.num_mixands) # Replot GMs title = 'Python Merged GM ({} mixands)'.format(merged_gauss_2d.weights.size) if hasattr(self,'old_contour'): merged_gauss_2d.contourf = self.old_contour merged_gauss_2d.plot_remove() self.old_contour = merged_gauss_2d.plot(ax=self.axes[1], levels=self.levels, title=title) title = 'Matlab Merged GM ({} mixands)'.format(matlab_merged_gauss_2d.weights.size) if hasattr(self,'old_matlab_contour'): matlab_merged_gauss_2d.contourf = self.old_matlab_contour matlab_merged_gauss_2d.plot_remove() self.old_matlab_contour = matlab_merged_gauss_2d.plot(ax=self.axes[2], levels=self.levels, title=title) # Decrement mixands (with wrapping) if self.num_mixands == self.max_num_mixands: self.num_mixands = 1 elif np.int(self.num_mixands * self.mixand_rate) < self.max_num_mixands: self.num_mixands = np.int(self.num_mixands * self.mixand_rate) else: self.num_mixands = self.max_num_mixands def compare_results(): pass if animate: gm_ani = GMAnimation(self, mixand_rate=2, levels=levels, axes=axes) ani = animation.FuncAnimation(fig, gm_ani.update, interval=100, repeat=True, blit=False, ) else: self.diff(merged_gauss_2d, matlab_merged_gauss_2d) plt.show() self.check_diff()
def test_merging(self, num_mixands=100, max_num_mixands=10, spread=4, speak=False): if max_num_mixands is None: animate = True max_num_mixands = num_mixands else: animate = False # Generate the unmerged and merged gaussians weights, means, covariances = generate_random_params(num_mixands, ndims=2, spread=spread) unmerged_gauss_2d = GaussianMixture(weights.copy(), means.copy(), covariances.copy(), max_num_mixands=len(weights)) merged_gauss_2d = GaussianMixture(weights.copy(), means.copy(), covariances.copy(), max_num_mixands=max_num_mixands) matlab_merged_gauss_2d = self.matlab_gm(weights.copy(), means.copy(), covariances.copy(), max_num_mixands) mixtures = { 'unmerged': unmerged_gauss_2d, 'merged': merged_gauss_2d, 'matlab merged': matlab_merged_gauss_2d } # Setup figure and levels fig = plt.figure(figsize=(18, 6)) axes = [] _, max_1 = unmerged_gauss_2d.max_point_by_grid() _, max_2 = merged_gauss_2d.max_point_by_grid() _, max_3 = matlab_merged_gauss_2d.max_point_by_grid() max_prob = np.max((max_1, max_2, max_3)) levels = np.linspace(0, max_prob * 1.2, 50) # Plot all three ax = fig.add_subplot(131) axes.append(ax) title = 'Original GM ({} mixands)'\ .format(unmerged_gauss_2d.weights.size) unmerged_gauss_2d.plot(ax=ax, levels=levels, title=title) ax = fig.add_subplot(132) axes.append(ax) title = 'Python Merged GM ({} mixands)'\ .format(merged_gauss_2d.weights.size) merged_gauss_2d.plot(ax=ax, levels=levels, title=title) ax = fig.add_subplot(133) axes.append(ax) title = 'Matlab Merged GM ({} mixands)'\ .format(matlab_merged_gauss_2d.weights.size) matlab_merged_gauss_2d.plot(ax=ax, levels=levels, title=title) # Add a colorbar fig.subplots_adjust(right=0.85) cbar_ax = fig.add_axes([0.875, 0.1, 0.025, 0.8]) fig.colorbar(unmerged_gauss_2d.contourf, cax=cbar_ax) class GMAnimation(object): """docstring for merged_gm""" def __init__(self, parent, mixand_rate=2, levels=None, axes=None): self.max_num_mixands = mixtures['unmerged'].weights.size self.num_mixands = 1 self.mixand_rate = mixand_rate self.levels = levels self.axes = axes self.parent = parent def update(self, i=0): # Regenerate GMs merged_gauss_2d = GaussianMixture( weights, means, covariances, max_num_mixands=self.num_mixands) matlab_merged_gauss_2d = self.parent.matlab_gm( weights, means, covariances, max_num_mixands=self.num_mixands) # Replot GMs title = 'Python Merged GM ({} mixands)'.format( merged_gauss_2d.weights.size) if hasattr(self, 'old_contour'): merged_gauss_2d.contourf = self.old_contour merged_gauss_2d.plot_remove() self.old_contour = merged_gauss_2d.plot(ax=self.axes[1], levels=self.levels, title=title) title = 'Matlab Merged GM ({} mixands)'.format( matlab_merged_gauss_2d.weights.size) if hasattr(self, 'old_matlab_contour'): matlab_merged_gauss_2d.contourf = self.old_matlab_contour matlab_merged_gauss_2d.plot_remove() self.old_matlab_contour = matlab_merged_gauss_2d.plot( ax=self.axes[2], levels=self.levels, title=title) # Decrement mixands (with wrapping) if self.num_mixands == self.max_num_mixands: self.num_mixands = 1 elif np.int(self.num_mixands * self.mixand_rate) < self.max_num_mixands: self.num_mixands = np.int(self.num_mixands * self.mixand_rate) else: self.num_mixands = self.max_num_mixands def compare_results(): pass if animate: gm_ani = GMAnimation(self, mixand_rate=2, levels=levels, axes=axes) ani = animation.FuncAnimation( fig, gm_ani.update, interval=100, repeat=True, blit=False, ) else: self.diff(merged_gauss_2d, matlab_merged_gauss_2d) plt.show() self.check_diff()