jiehou's picture
Update app.py
e8a36ef verified
## CSCI4750/5750-SLU
# Jie Hou, Jan, 2024
import gradio as gr
import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
import matplotlib.colors as colors
import itertools
from scipy.stats import norm
from scipy import stats
from sklearn.naive_bayes import GaussianNB
def gaussian(x, n, u, s):
#u = x.mean()
#s = x.std()
# divide [x.min(), x.max()] by n
x = np.linspace(x.min(), x.max(), n)
a = ((x - u) ** 2) / (2 * (s ** 2))
y = 1 / (s * np.sqrt(2 * np.pi)) * np.exp(-a)
return x, y, u, s
def plot_figure(N, u1, std1, show_dist):
#N = 100
import numpy as np
import matplotlib.pyplot as pp
pp.style.use('default')
val = 0. # this is the value where you want the data to appear on the y-axis.
points_class1 = [stats.norm.rvs(loc=u1, scale = std1) for x in range(N)]
pd_class1 = pd.DataFrame({'Feature 1 (X)': points_class1})
pd_all = pd_class1
import numpy as np
X_data= pd_all['Feature 1 (X)'].to_numpy().reshape((len(pd_all),1))
# define x, y limits
x_min, x_max = X_data[:, 0].min() - 1, X_data[:, 0].max() + 1
y_min, y_max = 0-0.5, 1
fig = pp.figure(figsize=(8, 6)) # figure size in inches
fig.subplots_adjust(left=0, right=1, bottom=0, top=1, hspace=0.3, wspace=0.05)
pp.tick_params(left = False, right = False , labelleft = False ,
labelbottom = True, bottom = False)
#reference = [stats.uniform.rvs(loc=1, scale = 1) for x in range(N)]
pp.plot(points_class1, np.zeros_like(points_class1) + val, 'x', label = 'Feature', markersize = 10)
if show_dist:
x = np.arange(x_min, x_max, 0.01) # define range of x
x, y, u, s = gaussian(x, 10000, np.mean(points_class1), np.std(points_class1) )
pp.plot(x, y)
#pp.plot(x, y, label=r'$Gaussian (\mu=%.2f,\ \sigma=%.2f)$' % (u, s))
pp.xlim([x_min, x_max])
pp.ylim([y_min, y_max])
pp.xlabel("Feature 1 (X1)", size=20)
pp.xticks(fontsize=20)
pp.ylabel("Density")
pp.legend(loc='upper right', borderpad=0, handletextpad=0, fontsize = 20)
pp.savefig('plot.png')
return 'plot.png', pd_all
set_mean_class1 = gr.Slider(-20, 20, step=0.5, label = 'Mean (Feature)')
set_std_class1 = gr.Slider(1, 10, step=0.5, label = 'Standard Deviation (Feature)')
# 3. Define the number of data points
set_number_points = gr.Slider(100, 1000, step=5, label = 'Number of samples')
# 4. show distribution or not
set_show_dist = gr.Checkbox(label="Show data distribution")
# 6. define output imagem model
set_out_plot_images = gr.Image(label="Data visualization")
set_out_plot_table = gr.Dataframe(type='pandas', label ='Simulated Dataset')
### configure gradio, detailed can be found at https://www.gradio.app/docs/#i_slider
interface = gr.Interface(fn=plot_figure,
inputs=[set_number_points,set_mean_class1,set_std_class1, set_show_dist],
outputs=[set_out_plot_images,set_out_plot_table],
examples_per_page = 2,
#examples = get_sample_data(10),
title="CSCI4750/5750 Demo: Web Application for Practicing Gaussian Distribution",
description= "Click examples below for a quick demo",
theme = 'huggingface',live=True
)
interface.launch(debug=True)