Spaces:
Running
on
CPU Upgrade
Running
on
CPU Upgrade
from sklearn.decomposition import PCA | |
import matplotlib | |
matplotlib.use("Agg") | |
import matplotlib.pyplot as plt | |
import numpy as np | |
from scipy import stats | |
import gradio as gr | |
e = np.exp(1) | |
np.random.seed(4) | |
def pdf(x): | |
return 0.5 * (stats.norm(scale=0.25 / e).pdf(x) + stats.norm(scale=4 / e).pdf(x)) | |
y = np.random.normal(scale=0.5, size=(30000)) | |
x = np.random.normal(scale=0.5, size=(30000)) | |
z = np.random.normal(scale=0.1, size=len(x)) | |
density = pdf(x) * pdf(y) | |
pdf_z = pdf(5 * z) | |
density *= pdf_z | |
a = x + y | |
b = 2 * y | |
c = a - b + z | |
norm = np.sqrt(a.var() + b.var()) | |
a /= norm | |
b /= norm | |
def plot_figs(fig_num, elev, azim): | |
fig = plt.figure() | |
plt.clf() | |
ax = fig.add_subplot(111, projection="3d", elev=elev, azim=azim) | |
ax.set_position([0, 0, 0.95, 1]) | |
ax.scatter(a[::10], b[::10], c[::10], c=density[::10], marker="+", alpha=0.4) | |
Y = np.c_[a, b, c] | |
# Using SciPy's SVD, this would be: | |
# _, pca_score, Vt = scipy.linalg.svd(Y, full_matrices=False) | |
pca = PCA(n_components=3) | |
pca.fit(Y) | |
V = pca.components_.T | |
x_pca_axis, y_pca_axis, z_pca_axis = 3 * V | |
x_pca_plane = np.r_[x_pca_axis[:2], -x_pca_axis[1::-1]] | |
y_pca_plane = np.r_[y_pca_axis[:2], -y_pca_axis[1::-1]] | |
z_pca_plane = np.r_[z_pca_axis[:2], -z_pca_axis[1::-1]] | |
x_pca_plane.shape = (2, 2) | |
y_pca_plane.shape = (2, 2) | |
z_pca_plane.shape = (2, 2) | |
ax.plot_surface(x_pca_plane, y_pca_plane, z_pca_plane) | |
ax.xaxis.set_ticklabels([]) | |
ax.yaxis.set_ticklabels([]) | |
ax.zaxis.set_ticklabels([]) | |
plt.savefig(f"{fig_num}.png") | |
return fig | |
def make_plot(plot_type): | |
if plot_type == "Very flat direction": | |
elev = -40 | |
azim = -80 | |
fig_num = 1 | |
else: | |
elev = 30 | |
azim = 20 | |
fig_num = 2 | |
plot_figs(fig_num, elev, azim) | |
title = "Principal components analysis (PCA)" | |
with gr.Blocks(title=title) as demo: | |
gr.Markdown(f"## {title}") | |
gr.Markdown("These figures aid in illustrating how a point cloud can be \ | |
very flat in one direction–which is where PCA comes in to choose a direction that is not flat.") | |
button = gr.Radio(label="Plot type", | |
choices=['Very flat direction', 'Not flat direction'], value='Very flat direction') | |
plot = gr.Plot(label="Plot") | |
button.change(make_plot, inputs=button, outputs=[plot]) | |
demo.load(make_plot, inputs=[button], outputs=[plot]) | |
demo.launch() |