In een binair classificatieprobleem is het de bedoeling om een inputvector $$\mathbf{x}$$ (een vector met $$M$$ reële componenten) toe te wijzen aan een klasse $$0$$ of $$1$$. Aan de hand van een aantal voorbeelden, $$\mathbf{x_0}$$, $$\mathbf{x_1}$$, ... $$\mathbf{x_{D-1}}$$ waarvoor de bijhorende klassen gegeven zijn, namelijk $$y_0$$, ... $$y_{D-1}$$, zoeken we een zo goed mogelijk functievoorschrift $$f(\mathbf{x})$$ dat gegeven een nieuwe, niet-gekende inputvector, de juiste klasse bepaalt.
In deze oefening bekijken we een 1-laags neuraal netwerk (ook wel "1-laags perceptron genoemd"). We veronderstellen onderstaande gedaante voor de functie $$f(x)$$:
$$f(x) =\begin{cases}1, \mathbf{w.x} + b \gt 0\\0, \mathbf{w.x} + b \le 0\end{cases}$$
In deze uitdrukking zijn de vector $$\mathbf{w}$$ (bestaande uit $$M$$ componenten) en het getal $$b$$ te zoeken parameters, zodat voor zoveel mogelijk gevallen geldt dat $$f(\mathbf{x_i)} = y_i$$. De uitdrukking $$\mathbf{w.x}$$ staat voor het scalair product tussen de vectoren $$\mathbf{w}$$ en $$\mathbf{x}$$.
Hiertoe gebruiken we volgend algoritme:
We gebruikten volgende notaties:
Schrijf de functie bin_perceptron()
met als argumenten
x
: een 2D NumPy-tabel, bestaande uit $$D$$ rijen en $$M$$ kolommen. Elke rij stelt hierbij een voorbeeldvector $$\mathbf{x_i}$$ voory
: een 1D NumPy-rij met bijhorende klassen. De klasse die hoort bij de vector op rij $$i$$ uit x
is y[i]
. Deze rij bevat dus $$D$$ gehele getallen, allen 0 of 1.r
: leersnelheid (zie hoger), reëel en tussen 0 en 1 (grenzen niet inbegrepen)k
: maximaal toegelaten fractie classificatiefoutenDe functie levert als resultaat een tuple van 2 componenten, namelijk:
x = np.array([[2.6718429151610934, -3.2600020835638275, 14.303510545077257, 3.5160637495557627], [5.529463092190546, 6.055352031401841, -7.3185285295244755, -1.3230126010697514], [0.10106923202788325, -0.1233178436971208, 0.54106654919364, 0.13300402539093675], [-11.843917522078396, -12.970353329306901, 15.676033430639375, 2.833846951591257], [1.990094885801176, -2.4281792306679777, 10.6538236298391, 2.618904145313476]]) y = np.array([0, 1, 0, 1, 0]) w, b = bin_perceptron(x, y, 0.1, 0.1) print(w)#[-2.273889 -0.68668844 -2.19144238 -0.66739113] print(b)#1.4