File size: 2,895 Bytes
478112e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import gradio as gr
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn import linear_model

def plot(seed, num_points):
	# Error handling of non-numeric seeds
    if seed and not seed.isnumeric():
      raise gr.Error("Invalid seed")
	  
	# Setting the seed
    if seed:
      seed = int(seed)
      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 last 10 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
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.Textbox(label="Seed", info="Leave empty to generate new random points each run ",value=None)
        num_points = gr.Slider(label="Number of Points", value="20", minimum=5, maximum=100, step=2)
        btn = gr.Button("Run")
      out = gr.Plot()
    btn.click(fn=plot, inputs=[seed,num_points] , outputs=out)
demo.launch()