start exercise 4

main
Nikola Munder 2026-11-02 17:43:55 +01:00
parent 1b2bdad76a
commit 584b60c82e
5 changed files with 3213 additions and 2926 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,64 @@
{
"cells": [
{
"cell_type": "code",
"execution_count": 2,
"id": "a35b6bf3",
"metadata": {},
"outputs": [],
"source": [
"import numpy as np"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "ea7529b2",
"metadata": {},
"outputs": [],
"source": [
"iris = np.loadtxt(\"../supplement_files/iris.csv\",delimiter=',')\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "c3166860",
"metadata": {},
"outputs": [],
"source": [
"# 4d)\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "8f9a70f7",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "nnw (3.14.x)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.14.8"
}
},
"nbformat": 4,
"nbformat_minor": 5
}

View File

@ -0,0 +1,65 @@
# -*- coding: utf-8 -*-
# %%
import numpy as np
import nnwplot
import matplotlib.pyplot as plt
# %% ErrorRate
def ErrorRate(Y,T):
if Y.ndim==1 or Y.shape[0]==1:
errors=Y!=T # gibt boolsche Liste zurück
return errors.sum()/Y.size # summiert True als 1 in errors auf
else: # für mehrere Ausgaben in one-hot Kodierung:
errors=Y.argmax(0)!=T.argmax(0)
return errors.sum()/Y.shape[1]
# %%
class SLN:
def __init__(self, dIn, cOut): # Konstruktor
np.random.seed(42)
self._b=np.zeros((cOut,1))
self._W=np.random.randn(cOut,dIn)/np.sqrt(dIn+1)
def neuron(self, X):
N = X.shape[1]
net = np.zeros(N)
net = self._W @ X
# b verwenden ...
net = net - self._b
return net > 0 # threshold ....
def DeltaTrain(self, X, T, eta, maxIter, maxErrorRate):
N=X.shape[1] # Anzahl Trainingsdaten
plt.ion() # interactive mode on
for it in range(maxIter):
Y = self.neuron(X) # nur ein Aufruf
err = ErrorRate(Y, T)
if (it%20) == 0:
print('#{} err:{}\n{}\n{}'.format(it,err,self._W,self._b))
nnwplot.plotTwoFeatures(X, T, self.neuron)
plt.pause(0.05) # warte auf GUI event loop (je nach python Version notwendig oder nicht)
if err <= maxErrorRate:
break
Y = Y.astype(float)
# update _W
# X.shape = (2,4), T.shape = (1,4), Y.shape = (1,4)
self._W += eta * (T - Y) @ X.T / N
# update _b
self._b -= eta * (T - Y) @ np.ones((1,N)).T / N
print('#{} err:{}\n{}\n{}'.format(it,err,self._W,self._b))
nnwplot.plotTwoFeatures(X, T, self.neuron)
plt.pause(0.05) # warte auf GUI event loop (je nach python Version notwendig oder nicht)
input("Press Enter to continue...") # wenn gewünscht ...
# %%
# 3f)
X_AND = np.array([[0,0], [1,0], [0,1], [1,1]]).T
T_AND = np.array([[0],[0],[0],[1]]).T
sln = SLN(2, 1)
sln.DeltaTrain(X_AND, T_AND,0.5,10,0)
# %%

View File

@ -7,8 +7,8 @@ import matplotlib.pyplot as plt
# %% ErrorRate
def ErrorRate(Y,T):
if Y.ndim==1 or Y.shape[0]==1:
errors=Y!=T
return errors.sum()/Y.size
errors=Y!=T # gibt boolsche Liste zurück
return errors.sum()/Y.size # summiert True als 1 in errors auf
else: # für mehrere Ausgaben in one-hot Kodierung:
errors=Y.argmax(0)!=T.argmax(0)
return errors.sum()/Y.shape[1]
@ -24,37 +24,45 @@ class SLN:
N = X.shape[1]
net = np.zeros(N)
for n in range(0,N):
for j in range(0,X.shape[0]):
for n in range(N):
for j in range(X.shape[0]):
# print(self._W)
net[n]+= X[j,n] * self._W[j]
net[n]+= X[j,n] * self._W[0, j]
# b verwenden ...
net += self._b
net = net - self._b
return net > 0 # threshold ....
# def DeltaTrain(self, X, T, eta, maxIter, maxErrorRate):
# N=X.shape[1] # Anzahl Trainingsdaten
# plt.ion() # interactive mode on
# for it in range(maxIter):
# Y = ... # nur ein Aufruf
# err = ErrorRate(..., ...)
# if (it%20) == 0:
# print('#{} err:{}\n{}\n{}'.format(it,err,self._W,self._b))
# nnwplot.plotTwoFeatures(...)
# plt.pause(0.05) # warte auf GUI event loop (je nach python Version notwendig oder nicht)
# if err <= maxErrorRate:
# break
# # update _W
# ...
# # update _b
# ...
# print('#{} err:{}\n{}\n{}'.format(it,err,self._W,self._b))
# nnwplot.plotTwoFeatures(...)
# plt.pause(0.05) # warte auf GUI event loop (je nach python Version notwendig oder nicht)
#
# input("Press Enter to continue...") # wenn gewünscht ...
# %%
def DeltaTrain(self, X, T, eta, maxIter, maxErrorRate):
N=X.shape[1] # Anzahl Trainingsdaten
plt.ion() # interactive mode on
for it in range(maxIter):
Y = self.neuron(X) # nur ein Aufruf
err = ErrorRate(Y, T)
if (it%20) == 0:
print('#{} err:{}\n{}\n{}'.format(it,err,self._W,self._b))
nnwplot.plotTwoFeatures(X, T, self.neuron)
plt.pause(0.05) # warte auf GUI event loop (je nach python Version notwendig oder nicht)
if err <= maxErrorRate:
break
Y = Y.astype(float)
# update _W
# X.shape = (2,4), T.shape = (1,4), Y.shape = (1,4)
self._W += eta * (T - Y) @ X.T / N
# update _b
self._b -= eta * (T - Y) @ np.ones((1,N)).T / N
print('#{} err:{}\n{}\n{}'.format(it,err,self._W,self._b))
nnwplot.plotTwoFeatures(X, T, self.neuron)
plt.pause(0.05) # warte auf GUI event loop (je nach python Version notwendig oder nicht)
input("Press Enter to continue...") # wenn gewünscht ...
# %%
# 3f)
X_AND = np.array([[0,0], [1,0], [0,1], [1,1]]).T
T_AND = np.array([[0],[0],[0],[1]]).T
sln = SLN(2, 1)
sln.DeltaTrain(X_AND, T_AND,0.5,10,0)
# %%