|
|
|
|
|
|
|
|
|
|
|
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): |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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, u2, std2, show_dist, classifier=None): |
|
|
|
|
|
import numpy as np |
|
|
import matplotlib.pyplot as pp |
|
|
pp.style.use('default') |
|
|
val = 0. |
|
|
|
|
|
points_class1 = [stats.norm.rvs(loc=u1, scale = std1) for x in range(N)] |
|
|
points_class2 = [stats.norm.rvs(loc=u2, scale = std2) for x in range(N)] |
|
|
|
|
|
pd_class1 = pd.DataFrame({'Feature 1 (X)': points_class1, 'Label (Y)': np.repeat(0,len(points_class1))}) |
|
|
pd_class2 = pd.DataFrame({'Feature 1 (X)': points_class2, 'Label (Y)': np.repeat(1,len(points_class2))}) |
|
|
|
|
|
|
|
|
pd_all = pd.concat([pd_class1, pd_class2]).reset_index(drop=True) |
|
|
|
|
|
import numpy as np |
|
|
X_data= pd_all['Feature 1 (X)'].to_numpy().reshape((len(pd_all),1)) |
|
|
y_labels= pd_all['Label (Y)'] |
|
|
|
|
|
|
|
|
|
|
|
x_min, x_max = X_data[:, 0].min() - 1, X_data[:, 0].max() + 1 |
|
|
y_min, y_max = 0-1, 1 + 1 |
|
|
|
|
|
fig = pp.figure(figsize=(8, 6)) |
|
|
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) |
|
|
|
|
|
|
|
|
pp.plot(points_class1, np.zeros_like(points_class1) + val, 'x', label = 'Class 1', markersize = 10) |
|
|
pp.plot(points_class2, np.zeros_like(points_class2) + val, 'o', label = 'Class 2', markersize = 10) |
|
|
|
|
|
|
|
|
if show_dist: |
|
|
x = np.arange(x_min, x_max, 0.01) |
|
|
x, y, u, s = gaussian(x, 10000, np.mean(points_class1), np.std(points_class1) ) |
|
|
pp.plot(x, y) |
|
|
|
|
|
|
|
|
|
|
|
x = np.arange(x_min, x_max, 0.01) |
|
|
x, y, u, s = gaussian(x, 10000, np.mean(points_class2), np.std(points_class2) ) |
|
|
pp.plot(x, y) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import numpy as np |
|
|
from matplotlib import pyplot as plt |
|
|
from sklearn import neighbors, datasets |
|
|
from matplotlib.colors import ListedColormap |
|
|
|
|
|
|
|
|
cmap_light = ListedColormap(['#FFAAAA', '#AAFFAA']) |
|
|
cmap_bold = ListedColormap(['#FF0000', '#00FF00']) |
|
|
|
|
|
|
|
|
xx, yy = np.meshgrid(np.linspace(x_min, x_max, 100), |
|
|
np.linspace(y_min, y_max, 100)) |
|
|
|
|
|
|
|
|
if classifier == 'LDA': |
|
|
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis |
|
|
model_sk = LinearDiscriminantAnalysis() |
|
|
model_sk.fit(X_data,y_labels) |
|
|
zz = model_sk.predict(np.c_[xx.ravel()]) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Z = zz.reshape(xx.shape) |
|
|
|
|
|
pp.pcolormesh(xx, yy, Z, cmap=cmap_light, alpha=0.2) |
|
|
elif classifier == 'QDA': |
|
|
from sklearn.discriminant_analysis import QuadraticDiscriminantAnalysis |
|
|
model_sk = QuadraticDiscriminantAnalysis() |
|
|
model_sk.fit(X_data,y_labels) |
|
|
|
|
|
model_sk.fit(X_data,y_labels) |
|
|
zz = model_sk.predict(np.c_[xx.ravel()]) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Z = zz.reshape(xx.shape) |
|
|
|
|
|
print("Z: ",Z) |
|
|
pp.pcolormesh(xx, yy, Z, cmap=cmap_light, alpha=0.2) |
|
|
elif classifier == 'NaiveBayes': |
|
|
from sklearn.naive_bayes import GaussianNB |
|
|
model_sk = GaussianNB(priors = None) |
|
|
model_sk.fit(X_data,y_labels) |
|
|
Z = model_sk.predict(np.c_[xx.ravel()]) |
|
|
Z = Z.reshape(xx.shape) |
|
|
|
|
|
pp.pcolormesh(xx, yy, Z, cmap=cmap_light, alpha=0.2) |
|
|
|
|
|
|
|
|
|
|
|
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("Feature 2 (X2)") |
|
|
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, default=1, label = 'Mean (Class 1)') |
|
|
set_std_class1 = gr.Slider(0, 10, step=0.5, default=1.5, label = 'Standard Deviation (Class 1)') |
|
|
|
|
|
|
|
|
|
|
|
set_mean_class2 = gr.Slider(-20, 20, step=0.5, default=10, label = 'Mean (Class 2)') |
|
|
set_std_class2 = gr.Slider(0, 10, step=0.5, default=1.5, label = 'Standard Deviation (Class 2)') |
|
|
|
|
|
|
|
|
set_number_points = gr.Slider(10, 100, step=5, default=20, label = 'Number of samples in each class') |
|
|
|
|
|
|
|
|
set_show_dist = gr.Checkbox(label="Show data distribution") |
|
|
|
|
|
|
|
|
set_classifier = gr.Dropdown(["None", "LDA", "QDA", "NaiveBayes"]) |
|
|
|
|
|
|
|
|
set_out_plot_images = gr.Image(label="Data visualization") |
|
|
|
|
|
set_out_plot_table = gr.Dataframe(type='pandas', label ='Simulated Dataset') |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
interface = gr.Interface(fn=plot_figure, |
|
|
inputs=[set_number_points,set_mean_class1,set_std_class1,set_mean_class2,set_std_class2, set_show_dist, set_classifier], |
|
|
outputs=[set_out_plot_images,set_out_plot_table], |
|
|
examples_per_page = 2, |
|
|
|
|
|
title="CSCI4750/5750 Demo: Web Application for Probabilistic Classifier (Single feature)", |
|
|
description= "Click examples below for a quick demo", |
|
|
theme = 'huggingface', |
|
|
layout = 'vertical' |
|
|
) |
|
|
interface.launch(debug=True) |
|
|
|