def plot_combined(p, x=None, y=None, indexes=None, k=iso_levels.DEFAULT_K): """Plot both, contour level stats and the actual contour plots for different values of k""" p, x, y = _validate_infer_indexes(p, x, y, indexes) # generate levels try: pdf_lvls = [] prob_lvls = [] prob_hori_lvls = [] for ki in k: pdf_lvls.append(iso_levels.equi_value(p, ki)) prob_lvls.append(iso_levels.equi_prob_per_level(p, ki)) prob_hori_lvls.append( iso_levels.equi_horizontal_prob_per_level(p, ki)) except TypeError: pdf_lvls = [iso_levels.equi_value(p, k)] prob_lvls = [iso_levels.equi_prob_per_level(p, k)] prob_hori_lvls = [iso_levels.equi_horizontal_prob_per_level(p, k)] k = [k] # plot for i, ki in enumerate(k): levels = [pdf_lvls[i], prob_lvls[i], prob_hori_lvls[i]] plot_contour_levels_stats( levels, len(levels) * [p], labels=[ s.format(ki) for s in ['old (k={})', 'vertical (k={})', 'horizonal (k={})'] ]) for i, ki in enumerate(k): contour_comparision_plot_2d( [pdf_lvls[i], prob_lvls[i], prob_hori_lvls[i]], p, x, y, labels=[ s.format(ki) for s in ['old (k={})', 'vertical (k={})', 'horizonal (k={})'] ])
def plateau(k=5): factor = 2.3 mu = np.array([-0.5, 1, 3.5, 7, 6]) - 3 sigma = np.array([0.05, 0.5, 0.2, 2, 0.3]) * 1.2 weights = np.array([0.2, 1, 0.4, 1, 3]) indexes_2d = utils.normalize_to_indexes(low=[-10, -10], high=[10, 10], n=100) # mu = [0] # sigma = [1] # weights = [1] # indexes_2d = utils.normalize_to_indexes(low=[-4, -4], high=[4, 4], n=100) p = support_mixed_gaussian_2d(indexes_2d, mu, sigma, weights) # raise p value p_raised = p + np.max(p) * factor # apply a circular 0--1 function for ix, x in enumerate(indexes_2d[0]): for iy, y in enumerate(indexes_2d[1]): if x * x + y * y > 32: p_raised[ix][iy] = 0 # plot #plotting.plot_combined(p_raised, indexes=indexes_2d, k=[3,7,10]) levels = iso_levels.equi_prob_per_level(p_raised, k=k) levels2 = iso_levels.equi_value(p_raised, k=k) slice_ = utils.get_slice(p_raised, indexes_2d, 'y', 0) fig, ax = plt.subplots(2, 3, figsize=(3 * 5, 8)) plotting.combined_2d(p_raised, levels2, x=indexes_2d[0], y=indexes_2d[1], slice_=slice_, ax=ax[0]) plotting.combined_2d(p_raised, levels, x=indexes_2d[0], y=indexes_2d[1], slice_=slice_, ax=ax[1]) fig.show() return fig
def data_file_with_kde(filepath, kernel_bandwidth=None, k=7, usecols=None, index_col=None): # get data df = pd.read_csv(filepath, index_col=index_col, usecols=usecols) data = df.values.transpose() # derive pdf mykernel = pdf_kernel(data, kernel_bandwidth=kernel_bandwidth) # get support indexes = utils.normalize_to_indexes(data=data) p = support_kde(mykernel, indexes) # plot #plotting.plot_combined(p, indexes[0], indexes[1], k=[3, 5, 7, 10]) levels = iso_levels.equi_prob_per_level(p, k=k) levels2 = iso_levels.equi_value(p, k=k) # get index of max max_idx = np.unravel_index(np.argmax(p, axis=None), p.shape) slice_ = utils.get_slice(p, indexes, 'y', indexes[1][max_idx[0]]) #slice_ = utils.get_slice(p, indexes, 'y', 68) # print('old embrace ratio: {}'.format(stats.embrace_ratio(levels2, p))) # print('new embrace ratio: {}'.format(stats.embrace_ratio(levels, p))) fig, ax = plt.subplots(2, 3, figsize=(3 * 5, 8)) plotting.combined_2d(p, levels2, x=indexes[0], y=indexes[1], slice_=slice_, ax=ax[0]) plotting.combined_2d(p, levels, x=indexes[0], y=indexes[1], slice_=slice_, ax=ax[1]) fig.show() return fig
def broad_and_normal_gaussians(k=5): # works well! # mu = np.array([0, -5.5, 0, 5.5]) # sigma = np.array([1, 10, 6, 10]) # weights = np.array([1, 1, 0.5, 1]) # more complex and still works well mu = np.array([[0, 0], [-5.5, -1], [0, 0], [5.5, 2], [-3, 4]]) sigma = np.array([1, 10, 6, 10, 9]) sigma = [[[s, 0], [0, s]] for s in sigma] weights = np.array([1, 1, 0.5, 1, 1]) indexes_2d = utils.normalize_to_indexes(low=[-12, -10], high=[12, 10], n=100) p = support_mixed_gaussian_2d(indexes_2d, mu, sigma, weights, from_scalar=False) levels = iso_levels.equi_prob_per_level(p, k=k) levels2 = iso_levels.equi_value(p, k=k) slice_ = utils.get_slice(p, indexes_2d, 'y', 0) fig, ax = plt.subplots(2, 3, figsize=(3 * 5, 8)) plotting.combined_2d(p, levels2, x=indexes_2d[0], y=indexes_2d[1], slice_=slice_, ax=ax[0]) plotting.combined_2d(p, levels, x=indexes_2d[0], y=indexes_2d[1], slice_=slice_, ax=ax[1]) fig.show() return fig
def iris_kde(kernel_bandwidth=None, k=6): # get data from sklearn import datasets iris = datasets.load_iris() data = iris.data[:, :2].transpose() # derive pdf mykernel = pdf_kernel(data, kernel_bandwidth=kernel_bandwidth) # get support indexes = utils.normalize_to_indexes(data=data) p = support_kde(mykernel, indexes) # plot #plotting.plot_combined(p, indexes[0], indexes[1], k=[3, 5, 10]) levels = iso_levels.equi_prob_per_level(p, k=k) levels2 = iso_levels.equi_value(p, k=k) slice_ = utils.get_slice(p, indexes, 'y', 3) #slice_ = None fig, ax = plt.subplots(2, 3, figsize=(3 * 5, 8)) plotting.combined_2d(p, levels2, x=indexes[0], y=indexes[1], slice_=slice_, ax=ax[0]) plotting.combined_2d(p, levels, x=indexes[0], y=indexes[1], slice_=slice_, ax=ax[1]) fig.show() return fig
def basic_idea(): """Creates plot for initial explanatory and motivating example for paper. Also provide some search capabilities, i.e. allows to play with parameters to find exemplary distributions. """ mu = [0, 1, 3.5, 7] sigma = [0.05, 0.5, 0.7, 2] weights = [0.6, 1, 0.7, 1] index_1d = utils.normalize_to_indexes(low=[-1], high=[10], n=2500, d=1)[0] p_single_1d = [ support_gaussian_1d(index_1d, m, s) for m, s in zip(mu, sigma) ] p_mixture_1d = sum(map(operator.mul, weights, p_single_1d)) levels = iso_levels.equi_prob_per_level(p_mixture_1d, k=7) levels2 = iso_levels.equi_value(p_mixture_1d, k=7) # I used this i identify suitable mu, sigma and weights # figure = plt.figure(figsize=(9, 4)) # ax = figure.add_subplot(121) # plotting.density(levels, gp1d, ax=ax) # ax = figure.add_subplot(122) # plotting.density(levels2, gp1d, ax=ax) fig1d, ax = plt.subplots(2, 3, figsize=(3 * 5, 8)) plotting.combined_1d(p_mixture_1d, levels2, index_1d, ax[0]) plotting.combined_1d(p_mixture_1d, levels, index_1d, ax[1]) fig1d.show() indexes_2d = utils.normalize_to_indexes(low=[-1, -3], high=[10, 3], n=100) p_mixture_2d = support_mixed_gaussian_2d(indexes_2d, mu, sigma, weights) levels = iso_levels.equi_prob_per_level(p_mixture_2d, k=7) levels2 = iso_levels.equi_value(p_mixture_2d, k=7) slice_idx = int(len(indexes_2d[1]) / 2) slice_val = indexes_2d[1][slice_idx] slice_ = utils.get_slice(p_mixture_2d, indexes_2d, 'y', slice_val) print('old embrace ratio: {}'.format( stats.embrace_ratio(levels2, p_mixture_2d))) print('new embrace ratio: {}'.format( stats.embrace_ratio(levels, p_mixture_2d))) # I used this to identify k=7 as particularly interesting #plotting.plot_combined(gp2d, indexes=gindex, k=list(range(2,10))) #plotting.plot_combined(gp2d, indexes=gindex, k=[7]) fig2d, ax = plt.subplots(2, 3, figsize=(3 * 5, 8)) plotting.combined_2d(p_mixture_2d, levels2, x=indexes_2d[0], y=indexes_2d[1], slice_=slice_, ax=ax[0]) plotting.combined_2d(p_mixture_2d, levels, x=indexes_2d[0], y=indexes_2d[1], slice_=slice_, ax=ax[1]) fig2d.show() return fig1d, fig2d