Clustering#
Clustering seeks to group data into clusters based on their properties and then allow us to predict which cluster a new member belongs.
import numpy as np
import matplotlib.pyplot as plt
We’ll use a dataset generator that is part of scikit-learn called make_moons. This generates data that falls into 2 different sets with a shape that looks like half-moons.
from sklearn import datasets
def generate_data():
xvec, val = datasets.make_moons(200, noise=0.2)
# encode the output to be 2 elements
x = []
v = []
for xv, vv in zip(xvec, val):
x.append(np.array(xv))
v.append(vv)
return np.array(x), np.array(v)
x, v = generate_data()
Let’s look at a point and it’s value
print(f"x = {x[0]}, value = {v[0]}")
x = [ 1.38213337 -0.38387933], value = 1
Now let’s plot the data
def plot_data(x, v):
xpt = [q[0] for q in x]
ypt = [q[1] for q in x]
fig, ax = plt.subplots()
ax.scatter(xpt, ypt, s=40, c=v, cmap="viridis")
ax.set_aspect("equal")
return fig
fig = plot_data(x, v)
We want to partition this domain into 2 regions, such that when we come in with a new point, we know which group it belongs to.
First we setup and train our network
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation, Input
from keras.optimizers import RMSprop
model = Sequential()
model.add(Input(shape=(2,)))
model.add(Dense(50, activation="relu"))
model.add(Dense(20, activation="relu"))
model.add(Dense(1, activation="sigmoid"))
rms = RMSprop()
model.compile(loss='binary_crossentropy',
optimizer=rms, metrics=['accuracy'])
model.summary()
Model: "sequential"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓ ┃ Layer (type) ┃ Output Shape ┃ Param # ┃ ┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩ │ dense (Dense) │ (None, 50) │ 150 │ ├─────────────────────────────────┼────────────────────────┼───────────────┤ │ dense_1 (Dense) │ (None, 20) │ 1,020 │ ├─────────────────────────────────┼────────────────────────┼───────────────┤ │ dense_2 (Dense) │ (None, 1) │ 21 │ └─────────────────────────────────┴────────────────────────┴───────────────┘
Total params: 1,191 (4.65 KB)
Trainable params: 1,191 (4.65 KB)
Non-trainable params: 0 (0.00 B)
We seem to need a lot of epochs here to get a good result
epochs = 200
results = model.fit(x, v, batch_size=50, epochs=epochs, verbose=2)
Epoch 1/200
4/4 - 0s - 5ms/step - accuracy: 0.4000 - loss: 0.7086
Epoch 2/200
4/4 - 0s - 5ms/step - accuracy: 0.5800 - loss: 0.6690
Epoch 3/200
4/4 - 0s - 5ms/step - accuracy: 0.7750 - loss: 0.6429
Epoch 4/200
4/4 - 0s - 5ms/step - accuracy: 0.7750 - loss: 0.6202
Epoch 5/200
4/4 - 0s - 5ms/step - accuracy: 0.7800 - loss: 0.6003
Epoch 6/200
4/4 - 0s - 6ms/step - accuracy: 0.7800 - loss: 0.5831
Epoch 7/200
4/4 - 0s - 6ms/step - accuracy: 0.7850 - loss: 0.5668
Epoch 8/200
4/4 - 0s - 5ms/step - accuracy: 0.7850 - loss: 0.5511
Epoch 9/200
4/4 - 0s - 5ms/step - accuracy: 0.7900 - loss: 0.5361
Epoch 10/200
4/4 - 0s - 5ms/step - accuracy: 0.7950 - loss: 0.5220
Epoch 11/200
4/4 - 0s - 5ms/step - accuracy: 0.7900 - loss: 0.5082
Epoch 12/200
4/4 - 0s - 5ms/step - accuracy: 0.7950 - loss: 0.4950
Epoch 13/200
4/4 - 0s - 5ms/step - accuracy: 0.8000 - loss: 0.4820
Epoch 14/200
4/4 - 0s - 5ms/step - accuracy: 0.8000 - loss: 0.4689
Epoch 15/200
4/4 - 0s - 5ms/step - accuracy: 0.8000 - loss: 0.4570
Epoch 16/200
4/4 - 0s - 5ms/step - accuracy: 0.8150 - loss: 0.4446
Epoch 17/200
4/4 - 0s - 5ms/step - accuracy: 0.8200 - loss: 0.4324
Epoch 18/200
4/4 - 0s - 5ms/step - accuracy: 0.8200 - loss: 0.4211
Epoch 19/200
4/4 - 0s - 5ms/step - accuracy: 0.8300 - loss: 0.4097
Epoch 20/200
4/4 - 0s - 5ms/step - accuracy: 0.8350 - loss: 0.3991
Epoch 21/200
4/4 - 0s - 5ms/step - accuracy: 0.8400 - loss: 0.3893
Epoch 22/200
4/4 - 0s - 5ms/step - accuracy: 0.8450 - loss: 0.3802
Epoch 23/200
4/4 - 0s - 5ms/step - accuracy: 0.8600 - loss: 0.3718
Epoch 24/200
4/4 - 0s - 5ms/step - accuracy: 0.8550 - loss: 0.3644
Epoch 25/200
4/4 - 0s - 5ms/step - accuracy: 0.8550 - loss: 0.3569
Epoch 26/200
4/4 - 0s - 5ms/step - accuracy: 0.8650 - loss: 0.3503
Epoch 27/200
4/4 - 0s - 5ms/step - accuracy: 0.8550 - loss: 0.3450
Epoch 28/200
4/4 - 0s - 5ms/step - accuracy: 0.8600 - loss: 0.3384
Epoch 29/200
4/4 - 0s - 5ms/step - accuracy: 0.8600 - loss: 0.3336
Epoch 30/200
4/4 - 0s - 6ms/step - accuracy: 0.8650 - loss: 0.3291
Epoch 31/200
4/4 - 0s - 6ms/step - accuracy: 0.8700 - loss: 0.3255
Epoch 32/200
4/4 - 0s - 5ms/step - accuracy: 0.8700 - loss: 0.3212
Epoch 33/200
4/4 - 0s - 5ms/step - accuracy: 0.8700 - loss: 0.3177
Epoch 34/200
4/4 - 0s - 5ms/step - accuracy: 0.8700 - loss: 0.3152
Epoch 35/200
4/4 - 0s - 5ms/step - accuracy: 0.8700 - loss: 0.3120
Epoch 36/200
4/4 - 0s - 5ms/step - accuracy: 0.8700 - loss: 0.3091
Epoch 37/200
4/4 - 0s - 5ms/step - accuracy: 0.8700 - loss: 0.3082
Epoch 38/200
4/4 - 0s - 5ms/step - accuracy: 0.8700 - loss: 0.3046
Epoch 39/200
4/4 - 0s - 5ms/step - accuracy: 0.8750 - loss: 0.3041
Epoch 40/200
4/4 - 0s - 5ms/step - accuracy: 0.8650 - loss: 0.3023
Epoch 41/200
4/4 - 0s - 5ms/step - accuracy: 0.8800 - loss: 0.3003
Epoch 42/200
4/4 - 0s - 5ms/step - accuracy: 0.8750 - loss: 0.2993
Epoch 43/200
4/4 - 0s - 5ms/step - accuracy: 0.8750 - loss: 0.2988
Epoch 44/200
4/4 - 0s - 5ms/step - accuracy: 0.8800 - loss: 0.2964
Epoch 45/200
4/4 - 0s - 5ms/step - accuracy: 0.8700 - loss: 0.2951
Epoch 46/200
4/4 - 0s - 5ms/step - accuracy: 0.8850 - loss: 0.2945
Epoch 47/200
4/4 - 0s - 5ms/step - accuracy: 0.8750 - loss: 0.2926
Epoch 48/200
4/4 - 0s - 5ms/step - accuracy: 0.8850 - loss: 0.2915
Epoch 49/200
4/4 - 0s - 5ms/step - accuracy: 0.8750 - loss: 0.2905
Epoch 50/200
4/4 - 0s - 5ms/step - accuracy: 0.8750 - loss: 0.2907
Epoch 51/200
4/4 - 0s - 5ms/step - accuracy: 0.8800 - loss: 0.2896
Epoch 52/200
4/4 - 0s - 5ms/step - accuracy: 0.8800 - loss: 0.2873
Epoch 53/200
4/4 - 0s - 5ms/step - accuracy: 0.8800 - loss: 0.2885
Epoch 54/200
4/4 - 0s - 5ms/step - accuracy: 0.8800 - loss: 0.2860
Epoch 55/200
4/4 - 0s - 5ms/step - accuracy: 0.8800 - loss: 0.2866
Epoch 56/200
4/4 - 0s - 5ms/step - accuracy: 0.8800 - loss: 0.2847
Epoch 57/200
4/4 - 0s - 5ms/step - accuracy: 0.8800 - loss: 0.2837
Epoch 58/200
4/4 - 0s - 5ms/step - accuracy: 0.8800 - loss: 0.2834
Epoch 59/200
4/4 - 0s - 5ms/step - accuracy: 0.8800 - loss: 0.2834
Epoch 60/200
4/4 - 0s - 5ms/step - accuracy: 0.8800 - loss: 0.2818
Epoch 61/200
4/4 - 0s - 5ms/step - accuracy: 0.8800 - loss: 0.2807
Epoch 62/200
4/4 - 0s - 5ms/step - accuracy: 0.8800 - loss: 0.2814
Epoch 63/200
4/4 - 0s - 5ms/step - accuracy: 0.8800 - loss: 0.2785
Epoch 64/200
4/4 - 0s - 5ms/step - accuracy: 0.8800 - loss: 0.2774
Epoch 65/200
4/4 - 0s - 5ms/step - accuracy: 0.8800 - loss: 0.2766
Epoch 66/200
4/4 - 0s - 5ms/step - accuracy: 0.8800 - loss: 0.2756
Epoch 67/200
4/4 - 0s - 5ms/step - accuracy: 0.8800 - loss: 0.2749
Epoch 68/200
4/4 - 0s - 5ms/step - accuracy: 0.8800 - loss: 0.2745
Epoch 69/200
4/4 - 0s - 5ms/step - accuracy: 0.8800 - loss: 0.2739
Epoch 70/200
4/4 - 0s - 5ms/step - accuracy: 0.8800 - loss: 0.2727
Epoch 71/200
4/4 - 0s - 5ms/step - accuracy: 0.8800 - loss: 0.2711
Epoch 72/200
4/4 - 0s - 5ms/step - accuracy: 0.8800 - loss: 0.2714
Epoch 73/200
4/4 - 0s - 5ms/step - accuracy: 0.8800 - loss: 0.2716
Epoch 74/200
4/4 - 0s - 5ms/step - accuracy: 0.8800 - loss: 0.2693
Epoch 75/200
4/4 - 0s - 5ms/step - accuracy: 0.8800 - loss: 0.2687
Epoch 76/200
4/4 - 0s - 5ms/step - accuracy: 0.8800 - loss: 0.2686
Epoch 77/200
4/4 - 0s - 5ms/step - accuracy: 0.8800 - loss: 0.2687
Epoch 78/200
4/4 - 0s - 5ms/step - accuracy: 0.8800 - loss: 0.2671
Epoch 79/200
4/4 - 0s - 5ms/step - accuracy: 0.8800 - loss: 0.2656
Epoch 80/200
4/4 - 0s - 5ms/step - accuracy: 0.8800 - loss: 0.2649
Epoch 81/200
4/4 - 0s - 5ms/step - accuracy: 0.8800 - loss: 0.2633
Epoch 82/200
4/4 - 0s - 5ms/step - accuracy: 0.8800 - loss: 0.2636
Epoch 83/200
4/4 - 0s - 5ms/step - accuracy: 0.8800 - loss: 0.2624
Epoch 84/200
4/4 - 0s - 6ms/step - accuracy: 0.8850 - loss: 0.2618
Epoch 85/200
4/4 - 0s - 5ms/step - accuracy: 0.8850 - loss: 0.2603
Epoch 86/200
4/4 - 0s - 5ms/step - accuracy: 0.8850 - loss: 0.2594
Epoch 87/200
4/4 - 0s - 5ms/step - accuracy: 0.8800 - loss: 0.2585
Epoch 88/200
4/4 - 0s - 5ms/step - accuracy: 0.8900 - loss: 0.2580
Epoch 89/200
4/4 - 0s - 5ms/step - accuracy: 0.8900 - loss: 0.2594
Epoch 90/200
4/4 - 0s - 6ms/step - accuracy: 0.8950 - loss: 0.2569
Epoch 91/200
4/4 - 0s - 5ms/step - accuracy: 0.8850 - loss: 0.2569
Epoch 92/200
4/4 - 0s - 5ms/step - accuracy: 0.9000 - loss: 0.2539
Epoch 93/200
4/4 - 0s - 5ms/step - accuracy: 0.9000 - loss: 0.2531
Epoch 94/200
4/4 - 0s - 5ms/step - accuracy: 0.8950 - loss: 0.2523
Epoch 95/200
4/4 - 0s - 5ms/step - accuracy: 0.9000 - loss: 0.2531
Epoch 96/200
4/4 - 0s - 5ms/step - accuracy: 0.9000 - loss: 0.2510
Epoch 97/200
4/4 - 0s - 5ms/step - accuracy: 0.9000 - loss: 0.2503
Epoch 98/200
4/4 - 0s - 5ms/step - accuracy: 0.9000 - loss: 0.2485
Epoch 99/200
4/4 - 0s - 5ms/step - accuracy: 0.9000 - loss: 0.2484
Epoch 100/200
4/4 - 0s - 5ms/step - accuracy: 0.9000 - loss: 0.2467
Epoch 101/200
4/4 - 0s - 5ms/step - accuracy: 0.9000 - loss: 0.2457
Epoch 102/200
4/4 - 0s - 5ms/step - accuracy: 0.9050 - loss: 0.2446
Epoch 103/200
4/4 - 0s - 5ms/step - accuracy: 0.9000 - loss: 0.2438
Epoch 104/200
4/4 - 0s - 5ms/step - accuracy: 0.9000 - loss: 0.2435
Epoch 105/200
4/4 - 0s - 5ms/step - accuracy: 0.9000 - loss: 0.2417
Epoch 106/200
4/4 - 0s - 5ms/step - accuracy: 0.9050 - loss: 0.2421
Epoch 107/200
4/4 - 0s - 5ms/step - accuracy: 0.9000 - loss: 0.2392
Epoch 108/200
4/4 - 0s - 5ms/step - accuracy: 0.9000 - loss: 0.2377
Epoch 109/200
4/4 - 0s - 5ms/step - accuracy: 0.9000 - loss: 0.2374
Epoch 110/200
4/4 - 0s - 5ms/step - accuracy: 0.9050 - loss: 0.2358
Epoch 111/200
4/4 - 0s - 5ms/step - accuracy: 0.9000 - loss: 0.2345
Epoch 112/200
4/4 - 0s - 5ms/step - accuracy: 0.9050 - loss: 0.2329
Epoch 113/200
4/4 - 0s - 5ms/step - accuracy: 0.9000 - loss: 0.2321
Epoch 114/200
4/4 - 0s - 5ms/step - accuracy: 0.9050 - loss: 0.2293
Epoch 115/200
4/4 - 0s - 5ms/step - accuracy: 0.9050 - loss: 0.2292
Epoch 116/200
4/4 - 0s - 5ms/step - accuracy: 0.9000 - loss: 0.2277
Epoch 117/200
4/4 - 0s - 5ms/step - accuracy: 0.9050 - loss: 0.2263
Epoch 118/200
4/4 - 0s - 5ms/step - accuracy: 0.9100 - loss: 0.2247
Epoch 119/200
4/4 - 0s - 5ms/step - accuracy: 0.9150 - loss: 0.2237
Epoch 120/200
4/4 - 0s - 5ms/step - accuracy: 0.9050 - loss: 0.2229
Epoch 121/200
4/4 - 0s - 5ms/step - accuracy: 0.9100 - loss: 0.2215
Epoch 122/200
4/4 - 0s - 5ms/step - accuracy: 0.9100 - loss: 0.2215
Epoch 123/200
4/4 - 0s - 5ms/step - accuracy: 0.9100 - loss: 0.2199
Epoch 124/200
4/4 - 0s - 5ms/step - accuracy: 0.9150 - loss: 0.2171
Epoch 125/200
4/4 - 0s - 5ms/step - accuracy: 0.9150 - loss: 0.2169
Epoch 126/200
4/4 - 0s - 5ms/step - accuracy: 0.9100 - loss: 0.2147
Epoch 127/200
4/4 - 0s - 5ms/step - accuracy: 0.9150 - loss: 0.2153
Epoch 128/200
4/4 - 0s - 6ms/step - accuracy: 0.9100 - loss: 0.2136
Epoch 129/200
4/4 - 0s - 5ms/step - accuracy: 0.9150 - loss: 0.2114
Epoch 130/200
4/4 - 0s - 5ms/step - accuracy: 0.9150 - loss: 0.2110
Epoch 131/200
4/4 - 0s - 5ms/step - accuracy: 0.9100 - loss: 0.2109
Epoch 132/200
4/4 - 0s - 5ms/step - accuracy: 0.9150 - loss: 0.2079
Epoch 133/200
4/4 - 0s - 5ms/step - accuracy: 0.9150 - loss: 0.2075
Epoch 134/200
4/4 - 0s - 5ms/step - accuracy: 0.9150 - loss: 0.2053
Epoch 135/200
4/4 - 0s - 5ms/step - accuracy: 0.9150 - loss: 0.2055
Epoch 136/200
4/4 - 0s - 5ms/step - accuracy: 0.9150 - loss: 0.2030
Epoch 137/200
4/4 - 0s - 5ms/step - accuracy: 0.9150 - loss: 0.2029
Epoch 138/200
4/4 - 0s - 5ms/step - accuracy: 0.9200 - loss: 0.2006
Epoch 139/200
4/4 - 0s - 5ms/step - accuracy: 0.9200 - loss: 0.1994
Epoch 140/200
4/4 - 0s - 5ms/step - accuracy: 0.9200 - loss: 0.1983
Epoch 141/200
4/4 - 0s - 5ms/step - accuracy: 0.9200 - loss: 0.1993
Epoch 142/200
4/4 - 0s - 6ms/step - accuracy: 0.9200 - loss: 0.1961
Epoch 143/200
4/4 - 0s - 5ms/step - accuracy: 0.9200 - loss: 0.1952
Epoch 144/200
4/4 - 0s - 5ms/step - accuracy: 0.9200 - loss: 0.1939
Epoch 145/200
4/4 - 0s - 5ms/step - accuracy: 0.9200 - loss: 0.1928
Epoch 146/200
4/4 - 0s - 5ms/step - accuracy: 0.9200 - loss: 0.1919
Epoch 147/200
4/4 - 0s - 6ms/step - accuracy: 0.9200 - loss: 0.1920
Epoch 148/200
4/4 - 0s - 5ms/step - accuracy: 0.9250 - loss: 0.1888
Epoch 149/200
4/4 - 0s - 5ms/step - accuracy: 0.9200 - loss: 0.1882
Epoch 150/200
4/4 - 0s - 5ms/step - accuracy: 0.9200 - loss: 0.1867
Epoch 151/200
4/4 - 0s - 5ms/step - accuracy: 0.9200 - loss: 0.1856
Epoch 152/200
4/4 - 0s - 5ms/step - accuracy: 0.9200 - loss: 0.1871
Epoch 153/200
4/4 - 0s - 5ms/step - accuracy: 0.9250 - loss: 0.1824
Epoch 154/200
4/4 - 0s - 5ms/step - accuracy: 0.9250 - loss: 0.1812
Epoch 155/200
4/4 - 0s - 5ms/step - accuracy: 0.9200 - loss: 0.1813
Epoch 156/200
4/4 - 0s - 5ms/step - accuracy: 0.9250 - loss: 0.1789
Epoch 157/200
4/4 - 0s - 5ms/step - accuracy: 0.9250 - loss: 0.1789
Epoch 158/200
4/4 - 0s - 5ms/step - accuracy: 0.9250 - loss: 0.1762
Epoch 159/200
4/4 - 0s - 5ms/step - accuracy: 0.9200 - loss: 0.1762
Epoch 160/200
4/4 - 0s - 5ms/step - accuracy: 0.9300 - loss: 0.1748
Epoch 161/200
4/4 - 0s - 5ms/step - accuracy: 0.9250 - loss: 0.1746
Epoch 162/200
4/4 - 0s - 5ms/step - accuracy: 0.9250 - loss: 0.1717
Epoch 163/200
4/4 - 0s - 5ms/step - accuracy: 0.9350 - loss: 0.1700
Epoch 164/200
4/4 - 0s - 6ms/step - accuracy: 0.9300 - loss: 0.1696
Epoch 165/200
4/4 - 0s - 5ms/step - accuracy: 0.9400 - loss: 0.1679
Epoch 166/200
4/4 - 0s - 5ms/step - accuracy: 0.9300 - loss: 0.1671
Epoch 167/200
4/4 - 0s - 6ms/step - accuracy: 0.9350 - loss: 0.1656
Epoch 168/200
4/4 - 0s - 6ms/step - accuracy: 0.9300 - loss: 0.1654
Epoch 169/200
4/4 - 0s - 6ms/step - accuracy: 0.9350 - loss: 0.1638
Epoch 170/200
4/4 - 0s - 5ms/step - accuracy: 0.9350 - loss: 0.1624
Epoch 171/200
4/4 - 0s - 5ms/step - accuracy: 0.9400 - loss: 0.1607
Epoch 172/200
4/4 - 0s - 5ms/step - accuracy: 0.9350 - loss: 0.1599
Epoch 173/200
4/4 - 0s - 5ms/step - accuracy: 0.9450 - loss: 0.1580
Epoch 174/200
4/4 - 0s - 5ms/step - accuracy: 0.9400 - loss: 0.1589
Epoch 175/200
4/4 - 0s - 5ms/step - accuracy: 0.9450 - loss: 0.1566
Epoch 176/200
4/4 - 0s - 5ms/step - accuracy: 0.9400 - loss: 0.1545
Epoch 177/200
4/4 - 0s - 5ms/step - accuracy: 0.9350 - loss: 0.1556
Epoch 178/200
4/4 - 0s - 6ms/step - accuracy: 0.9400 - loss: 0.1528
Epoch 179/200
4/4 - 0s - 6ms/step - accuracy: 0.9400 - loss: 0.1528
Epoch 180/200
4/4 - 0s - 5ms/step - accuracy: 0.9500 - loss: 0.1506
Epoch 181/200
4/4 - 0s - 5ms/step - accuracy: 0.9400 - loss: 0.1517
Epoch 182/200
4/4 - 0s - 5ms/step - accuracy: 0.9400 - loss: 0.1501
Epoch 183/200
4/4 - 0s - 5ms/step - accuracy: 0.9500 - loss: 0.1488
Epoch 184/200
4/4 - 0s - 5ms/step - accuracy: 0.9450 - loss: 0.1479
Epoch 185/200
4/4 - 0s - 5ms/step - accuracy: 0.9500 - loss: 0.1452
Epoch 186/200
4/4 - 0s - 5ms/step - accuracy: 0.9500 - loss: 0.1456
Epoch 187/200
4/4 - 0s - 5ms/step - accuracy: 0.9450 - loss: 0.1450
Epoch 188/200
4/4 - 0s - 5ms/step - accuracy: 0.9500 - loss: 0.1432
Epoch 189/200
4/4 - 0s - 5ms/step - accuracy: 0.9550 - loss: 0.1412
Epoch 190/200
4/4 - 0s - 5ms/step - accuracy: 0.9550 - loss: 0.1414
Epoch 191/200
4/4 - 0s - 5ms/step - accuracy: 0.9500 - loss: 0.1407
Epoch 192/200
4/4 - 0s - 6ms/step - accuracy: 0.9600 - loss: 0.1404
Epoch 193/200
4/4 - 0s - 5ms/step - accuracy: 0.9550 - loss: 0.1382
Epoch 194/200
4/4 - 0s - 5ms/step - accuracy: 0.9550 - loss: 0.1375
Epoch 195/200
4/4 - 0s - 5ms/step - accuracy: 0.9550 - loss: 0.1351
Epoch 196/200
4/4 - 0s - 5ms/step - accuracy: 0.9550 - loss: 0.1371
Epoch 197/200
4/4 - 0s - 5ms/step - accuracy: 0.9550 - loss: 0.1340
Epoch 198/200
4/4 - 0s - 5ms/step - accuracy: 0.9550 - loss: 0.1343
Epoch 199/200
4/4 - 0s - 5ms/step - accuracy: 0.9550 - loss: 0.1331
Epoch 200/200
4/4 - 0s - 5ms/step - accuracy: 0.9600 - loss: 0.1308
score = model.evaluate(x, v, verbose=0)
print(f"score = {score[0]}")
print(f"accuracy = {score[1]}")
score = 0.12911249697208405
accuracy = 0.9599999785423279
Let’s look at a prediction. We need to feed in a single point as an array of shape (N, 2), where N is the number of points
res = model.predict(np.array([[-2, 2]]))
res
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 3ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 4ms/step
array([[1.3078371e-09]], dtype=float32)
We see that we get a floating point number. We will need to convert this to 0 or 1 by rounding.
Let’s plot the partitioning
M = 128
N = 128
xmin = -1.75
xmax = 2.5
ymin = -1.25
ymax = 1.75
xpt = np.linspace(xmin, xmax, M)
ypt = np.linspace(ymin, ymax, N)
To make the prediction go faster, we want to feed in a vector of these points, of the form:
[[xpt[0], ypt[0]],
[xpt[1], ypt[1]],
...
]
We can see that this packs them into the vector
pairs = np.array(np.meshgrid(xpt, ypt)).T.reshape(-1, 2)
pairs[0]
array([-1.75, -1.25])
Now we do the prediction. We will get a vector out, which we reshape to match the original domain.
res = model.predict(pairs, verbose=0)
res.shape = (M, N)
/tmp/ipykernel_3175/3968438749.py:2: DeprecationWarning: Setting the shape on a NumPy array has been deprecated in NumPy 2.5.
As an alternative, you can create a new view using np.reshape (with copy=False if needed).
res.shape = (M, N)
Finally, round to 0 or 1
domain = np.where(res > 0.5, 1, 0)
and we can plot the data
fig, ax = plt.subplots()
ax.imshow(domain.T, origin="lower",
extent=[xmin, xmax, ymin, ymax], alpha=0.25)
xpt = [q[0] for q in x]
ypt = [q[1] for q in x]
ax.scatter(xpt, ypt, s=40, c=v, cmap="viridis")
<matplotlib.collections.PathCollection at 0x7f8af9592490>