import gradio as gr import numpy as np import matplotlib.pyplot as plt from sklearn import linear_model def plot(seed, num_points): # Setting the seed if seed != -1: np.random.seed(seed) num_points = int(num_points) #Ensuring the number of points is even if num_points%2 != 0: num_points +=1 half_num_points = int(num_points/2) X = np.r_[np.random.randn(half_num_points, 2) + [1, 1], np.random.randn(half_num_points, 2)] y = [1] * half_num_points + [-1] * half_num_points sample_weight = 100 * np.abs(np.random.randn(num_points)) # and assign a bigger weight to the second half of samples sample_weight[:half_num_points] *= 10 # plot the weighted data points xx, yy = np.meshgrid(np.linspace(-4, 5, 500), np.linspace(-4, 5, 500)) fig, ax = plt.subplots() ax.scatter( X[:, 0], X[:, 1], c=y, s=sample_weight, alpha=0.9, cmap=plt.cm.bone, edgecolor="black", ) # fit the unweighted model clf = linear_model.SGDClassifier(alpha=0.01, max_iter=100) clf.fit(X, y) Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()]) Z = Z.reshape(xx.shape) no_weights = ax.contour(xx, yy, Z, levels=[0], linestyles=["solid"]) # fit the weighted model clf = linear_model.SGDClassifier(alpha=0.01, max_iter=100) clf.fit(X, y, sample_weight=sample_weight) Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()]) Z = Z.reshape(xx.shape) samples_weights = ax.contour(xx, yy, Z, levels=[0], linestyles=["dashed"]) no_weights_handles, _ = no_weights.legend_elements() weights_handles, _ = samples_weights.legend_elements() ax.legend( [no_weights_handles[0], weights_handles[0]], ["no weights", "with weights"], loc="lower left", ) ax.set(xticks=(), yticks=()) return fig info = ''' # SGD: Weighted samples\n This is a demonstration of a modified version of [SGD](https://scikit-learn.org/stable/modules/sgd.html#id5) that takes into account the weights of the samples. Where the size of points is proportional to its weight.\n The algorithm is demonstrated using points sampled from the standard normal distribution, where the weighted class has a mean of one while the non-weighted class has a mean of zero.\n Created by [@Nahrawy](https://huggingface.co/Nahrawy) based on [scikit-learn docs](https://scikit-learn.org/stable/auto_examples/linear_model/plot_sgd_weighted_samples.html). ''' with gr.Blocks() as demo: gr.Markdown(info) with gr.Row(): with gr.Column(): seed = gr.Slider(label="Seed", minimum=-1, maximum=10000, step=1,info="Set to -1 to generate new random points each run ",value=-1) num_points = gr.Slider(label="Number of Points", value="20", minimum=5, maximum=100, step=2) #btn = gr.Button("Run") out = gr.Plot() seed.change(fn=plot, inputs=[seed,num_points] , outputs=out) num_points.change(fn=plot, inputs=[seed,num_points] , outputs=out) #btn.click(fn=plot, inputs=[seed,num_points] , outputs=out) demo.launch()