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:

  1. Start met $$\mathbf{w} = \mathbf{0}$$ en $$b = 0$$
  2. Voor elk voorbeeld $$\mathbf{x_i}$$:
    • bepaal je $$y'[i] = f(\mathbf{x_i})$$
    • pas $$w[j]$$ aan volgens: $$w[j] \leftarrow w[j] + r(y[i] - y'[i])x[i,j]$$. Doe dit voor elke component $$w[j]$$ van de vector $$\mathbf{w}$$.
    • pas $$b$$ aan volgens: $$b \leftarrow b + r(y[i] - y'[i])$$
  3. Herhaal stap 2 tot het aantal classificatiefouten strikt kleiner is dan $$k\cdot D$$

We gebruikten volgende notaties:

Schrijf de functie bin_perceptron() met als argumenten

De functie levert als resultaat een tuple van 2 componenten, namelijk:

Voorbeeld

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