import numpy as np import urllib.request import matplotlib.pyplot as plt points=np.loadtxt('elemek.txt') # ha lementettük az adatokat # vagy: #points = np.loadtxt(urllib.request.urlopen('https://arato.inf.unideb.hu/baran.agnes/NH2017/elemek.txt')) ################################## # points[points[:,2]==-1,:2]+= 2 # Ha pl. a -1-gyel címkézett pontok mindkét koordinátájához hozzáadunk 2-t ################################## A=points[points[:,2]==1,:2] B=points[points[:,2]==-1,:2] ################################## eta = 1 R2=np.max(points[:,0]**2+points[:,1]**2) # max norma négyzet w = np.zeros((2,1)) # 0 kezdősúlyok b=0 k=0 x=points[:,:2] y=points[:,2] while True: corr=0 for i in range(400): if y[i]*(np.dot(x[i,].reshape(1,2),w)+b)<=0: w=(w.T+eta*y[i]*x[i,]).T b=b+eta*y[i]*(R2) k+=1 corr=1 if corr==0: break t = np.arange(-7.5,16.5, 0.2) # egyenes abrazoláshoz plt.plot(A[:,0],A[:,1],'bo') # +1-esek plt.plot(B[:,0],B[:,1],'r*') # -1-esek plt.plot(t,-w[0,]/w[1,]*t-b/w[1,],'g') plt.show() print("A szükséges korrekciók száma: ",k) print("Az eljárás végén kapott súlyok: w=",w) print("Az eljárás végén kapott torzítás: b=",b) ################################################ ################################################ # Ha ábrázolni szeretnénk a hiba alakulását az epochok függvényében: import numpy as np import urllib.request import matplotlib.pyplot as plt points=np.loadtxt('elemek.txt') ################################## #points[points[:,2]==-1,:2]+= 2 # Ha pl. a -1-gyel címkézett pontok mindkét koordinátájához hozzáadunk 2-t ################################## A=points[points[:,2]==1,:2] B=points[points[:,2]==-1,:2] ################################## eta = 1 R2=np.max(points[:,0]**2+points[:,1]**2) # max norma negyzet w = np.zeros((2,1)) # 0 kezdosulyok b=0 k=0 n = 200 # ha az epochok szamat maximalizálni akarjuk errors =np.empty(0) # kezdeti üres vektor, ebbe fogjuk belerakni minden epoch végén a hibát x=points[:,:2] y=points[:,2] while True: #for j in range(n): # előző sor helyett ez kell, ha maximalizálni akarjuk az epochok számát corr=0 for i in range(400): if y[i]*(np.dot(x[i,].reshape(1,2),w)+b)<=0: w=(w.T+eta*y[i]*x[i,]).T b=b+eta*y[i]*(R2) k+=1 corr=1 error=0 for i in range(400): error=error+(np.sign(np.dot(x[i,].reshape(1,2),w)+b)-y[i])**2 errors=np.append(errors,error) if corr==0: #if corr==0 or j==n: # előző sor helyett ez kell, ha maximalizálni akarjuk az epochok számát break # hiba alakulasa plt.plot(errors) plt.xlabel("Epochok száma") plt.ylabel("Hiba") plt.show() #print("A szükséges epochok száma: ",j+1) ################################################ ################################################ A scikit learn library beépített Perceptron függvényével is megoldhatjuk a feladatot: from sklearn.linear_model import Perceptron net=Perceptron() # hálózat elkészítése # opcionális argumentumok: n_iter=50, verbose=1 net.fit(x,y) # a hálózat illesztése, tanítás print(net.predict([[-5,0]])) # mit rendel hozzá a hálózat a (-5,0) ponthoz? w=net.coef_ # kapott súlyok b=net.intercept_ # kapott torzítás t = np.arange(-7.5,13, 0.2) # egyenes abrazolashoz plt.plot(A[:,0],A[:,1],'bo') # +1-esek plt.plot(B[:,0],B[:,1],'r*') # -1-esek plt.plot(t,-w2[:,0]/w2[:,1]*t-b2/w2[:,1],'g') plt.show() print(w) print(b)