Die Lernregel von Perceptron ist eine Methode zum Ermitteln des Gewichts einer linearen Diskriminanzfunktion durch Lernen. Das Muster wird durch einen einzelnen Punkt im Feature-Space dargestellt. Ist es beispielsweise bei der Betrachtung von zwei Klassen möglich, die im Merkmalsraum verteilten Punkte durch die durch die lineare Diskriminanzfunktion erzeugte Superebene in zwei zu trennen? Um es in zwei Teile zu trennen, muss das Gewicht der linearen Diskriminanzfunktion angepasst werden. Die Anpassung wird zum Lernen. Mit anderen Worten, durch Lernen wird eine Superplane zum Trennen in zwei Teile erzeugt. Zunächst sei die Klasse Ci (i = 1 ... c), x das Eingabemuster und die Anzahl der Dimensionen d. Die lineare Diskriminanzfunktion gi (x) der Klasse Ci ist
g_i(x) = ω₀+\sum_{j=1}^{d} ω_jx_j
Dieses Mal werden wir der Einfachheit halber zwei Klassen betrachten und die Klassen C₁ und C₂ sein lassen. Wenn gi (x) maximal ist, wird angenommen, dass die Klasse, zu der x gehört, Ci ist (abhängig von der linearen Unterscheidungsfunktion kann das Minimum auch das Unterscheidungsergebnis sein, daher ist hier die Präambel, dass das Maximum das Unterscheidungsergebnis ist. tat). Zu diesem Zeitpunkt, wenn das Eingabemuster Klasse C₁ ist, ist g₁ (x)> g₂ (x). Und wenn das Eingabemuster Klasse C₂ ist, ist g₁ (x) <g₂ (x). Daher wird die Identifikationsfunktion gi (x) zu einer kombiniert.
g(x) = g_1(x)-g_2(x)
=ω'₀+\sum_{j=1}^{d} ω'_jx'_j
Auf diese Weise wird der Gewichtsvektor W erhalten. Die lineare Diskriminanzfunktion, die g (x) ersetzt, trennt den Merkmalsraum für jede Klasse durch eine Superebene. Es ist jedoch auf linear trennbare Verteilungen beschränkt, da die Lernregel von Perceptron lautet, dass die Gewichte konvergieren, wenn sie linear trennbar sind (Perceptrons Konvergenzsatz).
Erstens könnte der Merkmalsvektor des Lernmusters als Eingabe auf der Ausführungsseite verwendet werden, er wurde jedoch im Voraus festgelegt, da die Lernregeln von Perceptron nur angewendet werden können, wenn die Verteilung linear identifizierbar ist. Es ist wie folgt. Klasse C₁: x₁ = (1,1,1,1), x₂ = (1,0,1,1), x₃ = (1,1,0,1), x₄ = (1,1,1,0) Klasse C₂: x₅ = (1,0,0,0), x₆ = (1,1,0,0), x₇ = (1,0,1,0), x₈ = (1,0,0,1) Das 0. Element jedes Merkmalsvektors ist alle 1, was der mit ω₀ multiplizierte Wert der linearen Diskriminanzfunktion g (x) ist. In Wirklichkeit sind die drei Elemente nach dem ersten Element die Merkmalsvektoren, und der Merkmalsraum ist auch dreidimensional (genau genommen wird der vierdimensionale Vektor einschließlich des ersten Elements als erweiterter Merkmalsvektor bezeichnet. Ursprünglich ist der Merkmalsvektor ( (Ohne Erweiterung) bedeutet den ersten bis d-ten Vektor). Da es sich um einen dreidimensionalen Merkmalsraum handelt, ist es erfolgreich, wenn die beiden Klassen durch eine zweidimensionale Superebene getrennt sind. Der Lernkoeffizient in der Lernregel wurde auf 1 gesetzt. Zunächst werden die Merkmalsvektoren des Lernmusters wie folgt im Merkmalsraum verteilt. (Rot: Klasse C₁, Blau: Klasse C₂) Ich habe die Lernregeln in Python implementiert. Der Code lautet wie folgt.
perceptron_learning.py
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
#Lernmuster-Merkmalsvektor
x = np.array([[1, 1, 1, 1], [1, 0, 1, 1], [1, 1, 0, 1], [1, 1, 1, 0], [1, 0, 0, 0], [1, 1, 0, 0], [1, 0, 1, 0], [1, 0, 0, 1]])
#Gewichtsvektor
w = np.array([-5, 1, 1, 1])
#Perceptron-Lernregeln
while True:
judge = 0
count = 1;
for data in x:
print(w)
if count <= x.shape[0]/2:
if np.dot(data, w)<=0:
w += data
judge = 1
else:
if np.dot(data, w)>=0:
w -= data
judge = 1
count += 1
print()
if judge == 0:
break
#Lineare Diskriminanzfunktion
def f(x1, x2):
return (w[1]*x1+w[2]*x2+w[0])/(-w[3])
x1, x2 = np.mgrid[-1:2:0.1, -1:2:0.1]
x3 = f(x1, x2)
#Einstellungen für den Funktionsbereich
fig = plt.figure()
ax = fig.add_subplot(111, projection="3d", facecolor="w")
ax.set_xlabel('x1')
ax.set_ylabel('x2')
ax.set_zlabel('x3')
ax.set_title("feature space")
#Zeichnen einer linearen Diskriminanzfunktion
ax.plot_surface(x1, x2, x3, cmap='BuGn')
i = 1
#Lernmuster zeichnen
for point in x:
if i<=x.shape[0]/2:
ax.scatter(point[1], point[2], point[3], c='red')
else:
ax.scatter(point[1], point[2], point[3], c='blue')
i += 1
#Funktionsbereich anzeigen
plt.show()
Als Ergebnis der Ausführung ist der Merkmalsraum wie folgt. Wie in der obigen Abbildung gezeigt, sind die roten und blauen Punkte durch die grüne Fläche (Superebene) getrennt. Daher ist ersichtlich, dass das Gewicht durch die Lernregel erhalten wurde.
[1] Kenichiro Ishii, Nobuyoshi Ueda, Eisaku Maeda, Hiroshi Murase. "Leicht verständliche Mustererkennung 2. Auflage". Ohm, 2019.
Recommended Posts