File size: 3,105 Bytes
478112e
 
 
 
 
ef6ac2d
478112e
ef6ac2d
478112e
 
 
 
 
 
 
 
 
 
 
ef6ac2d
478112e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ef6ac2d
478112e
 
 
 
 
 
 
ef6ac2d
478112e
631c162
478112e
631c162
 
 
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
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()