File size: 3,343 Bytes
c0dea5b
3b612a0
c0dea5b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4fe5564
c0dea5b
 
3b612a0
c0dea5b
 
 
 
 
 
 
e8a36ef
c0dea5b
 
 
 
 
 
 
 
 
4fe5564
c0dea5b
 
 
d8fcce6
c0dea5b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3b612a0
d8fcce6
c0dea5b
 
3b612a0
c0dea5b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
cbb5768
c0dea5b
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
## 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)