我制作了一些图以显示S型感知器的拟合(一次输入一个),并绘制了相应的contouf图,但是很难将图转换为gif。
SimoidNueron是模型的结构。plot_sn函数创建相应的轮廓线图。最低的代码部分训练模型
class SigmoidNeuron:
def __init__(self):
self.w = None
self.b = None
self.wb=[]
def perceptron(self, x):
return np.dot(x, self.w.T) + self.b
def perceptronIN(self, x,i):
return np.dot(x, (self.wb[i][0]).T) + self.wb[i][1]
def sigmoid(self, x):
return 1.0 / (1.0 + np.exp(-x))
def predict(self, X):
yp = []
for x in X:
ypt=(self.sigmoid(self.perceptron(x)))
yp.append(ypt)
return yp
def grad_w(self, x, y):
y_pred = self.sigmoid(self.perceptron(x))
return (y_pred - y) * y_pred * (1 - y_pred) * x
def grad_b(self, x, y):
y_pred = self.sigmoid(self.perceptron(x))
return (y_pred - y) * y_pred * (1 - y_pred)
def fit(self,X,Y,
epochs=1,
learning_rate=1,
initialise=True,
do_plot=False,
):
if do_plot:
loss={}
if initialise:
self.w = np.random.randn(1, len(X))
self.b = 0
self.wb.append([self.w,self.b])
for i in range(epochs):
dw = 0
db = 0
dw += self.grad_w(x, y)
db += self.grad_b(x, y)
self.w -= learning_rate * dw
self.b -= learning_rate * db
self.wb.append([self.w,self.b])
if do_plot:
loss[i]=mean_squared_error(self.sigmoid(self.perceptron(X)),Y)
if do_plot:
plt.plot(loss.values())
plt.xlabel('Epochs')
plt.ylabel('Error')
plt.show()
def plot_sn(X,Y,sn,ax):
X1=np.linspace(-10,10,100)
X2=np.linspace(-10,10,100)
XX1,XX2=np.meshgrid(X1,X2)
YY=np.zeros(XX1.shape)
for i in range(X2.size):
for j in range(X1.size):
YY[i,j]=sn.sigmoid(sn.perceptron(np.asarray([X1[j],X2[i]])))
ax.contourf(XX1,XX2,YY,cmap=my_cmap,alpha=0.6)
ax.scatter(X[:,0],X[:,1],c=Y,cmap=my_cmap)
ax.plot()
plt.figure(figsize=(10,20*6*5))
sn.fit([2.5,2.5],1,1,5,True,False)
ci=0
for i in range(20):
#ci=0
for (x,y) in zip(X,Y):
ci+=1
ax=plt.subplot(20*6,1,ci)
sn.fit(x,y,1,0.5,False,False)
plot_sn(X,Y,sn,ax)