1.问题描述:实现一个简单的只有输入层和输出层的前馈神经网络,输入数据与输出数据有下面的对应关系
[0,0,1]->0
[0,1,1]->1
[1,0,1]->0
[1,1,1]->1
从数据可以看出 输入层只有三个神经元 输出层只有一个神经元
由下图可以看出 随着训练次数的增加 误差在逐渐减小并收敛
代码如下
import numpy as np def sigmoid(x): return (1/(1+np.exp(-x))) def dsigmoid(y): return y*(1-y) x=np.array([[0,0,1], [0,1,1], [1,0,1], [1,1,1]]) y=np.array([0,1,0,1]).T w0=np.random.random((3,4)) print(w0) b0=0.5 lrate=0.3 for epochs in range(20): inx=x outy=sigmoid(np.dot(inx,w0)+b0) w0+=lrate*np.dot(inx.T,2*(y-outy)*dsigmoid(outy)) b0+=lrate*2*(y-outy)*dsigmoid(outy) err=(y-outy)*(y-outy) print("epochs=",epochs+1,"error is",err.T)
2:使用神经网络感知器算法进行鸢尾花分类
问题描述:定义一个神经网络算法 对鸢尾花进行分类,使用iris数据集中的花瓣长度和花萼长度两个特征
要求:构造神经网络类,学习率为0.2,初始权重和截距为0,利用误差反向传播算法,对权重和截距进行更新
可视化和结果如下
输出结果显示 算法迭代四次以后,得到一个比较稳定的权重参数[1.4,-3.68]这个权重参数保持不变一直到第十次迭代 同样大家可以修改学习率和迭代次数来观察结果变化
代码如下
import numpy as np import pandas as pd import matplotlib.pyplot as plt class ANNnet(object): def __init__(self,lrate=0.2,epochs=10): self.lrate=lrate self.epochs=epochs def train(self,x,y): self.weight=np.zeros(x.shape[1]) print('initial weight',self.weight) self.b=0 for i in range(self.epochs): for x,y in zip(x,y): delta=self.lrate*(y-self.predict(x)) self.weight[:]+=delta*x self.b+=delta print('weight after',i+1,'epochs',self.weight) def net_input(self,x): return x def predict(self,x): y=np.dot(x,self.weight[:])+self.b return np.where(y>=0,1,-1) print('step1 加载数据') df=pd.read_csv(r'iris.csv',header=None) print('step 2 可视化') y=df.loc[0:,4].values y=np.where(y=='setosa',1,-1) x=df.iloc[0:,[0,2]].values plt.scatter(x[:50,0],x[:50,1],color="red",marker='o',label='Setosa') plt.scatter(x[50:,0],x[50:,1],color="blue",marker='o',label='Vresicolor or Virginica') plt.xlabel("petal length") plt.ylabel("sepal length") plt.legend(loc='upper left') plt.show() print('step3 构建神经网络') pr=ANNnet() print('step4:fitting') pr.train(x,y) print('step5 predicting') print('iris1 result',pr.predict([5.1,1.4])) print('iris2 result',pr.predict([7,4.7])) print('iris3 result',pr.predict([5.9,5.1]))