2.3 实现一个单层神经网络

用NumPy对两个非线性可分的类进行分类:

程序:

#1) 导入函数库和数据集
import numpy as np
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt

#解决中文乱码问题
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号

#使用scikit-learn中的make_circles函数
from sklearn.datasets import make_circles

SEED=2017

#2)将导入的数据进行分组
#创建内圈和外圈
x,y=make_circles(n_samples=400,factor=.3,noise=.05,random_state=2017)
outer=y==0
inner=y==1

#3)绘制数据的分布来显示两个类
plt.title('2 circles')
plt.plot(x[outer,0],x[outer,1],"ro")
plt.plot(x[inner,0],x[inner,1],"bo")
plt.show()

#4) 标准化数据,确保两个圆的圆心是(1,1)
x=x+1

#5) 为了确保算法性能,对数据进行分割
x_train,x_val,y_train,y_val=train_test_split(x,y,test_size=0.2,random_state=SEED)

#6) 线性激活函数不起作用,使用sigmoid函数
def sigmoid(x):
    return 1/(1+np.exp(-x))

#7) 定义超参数
n_hidden=50#隐层神经元数目
n_epochs=1000
learning_rate=1

#8) 初始化权重和其他变量
#初始化权值
weights_hidden=np.random.normal(0.0,size=(x_train.shape[1],n_hidden))
weights_output=np.random.normal(0.0,size=(n_hidden))

hist_loss=[]
hist_accuracy=[]

#9) 运行单层神经网络并输出统计信息
for i in range(n_epochs):
   del_w_hidden=np.zeros(weights_hidden.shape)
   del_w_output = np.zeros(weights_output.shape)

   #按批量1循环加载训练数据
   for x_,y_ in zip(x_train,y_train):
       #前向计算
       hidden_input=np.dot(x_,weights_hidden)
       hidden_output=sigmoid(hidden_input)
       output=sigmoid(np.dot(hidden_output,weights_output))
       #向后计算
       error=y_-output
       output_error=error*output*(1-output)
       hidden_error=np.dot(output_error,weights_output)*hidden_output*(1-hidden_output)

       del_w_output+=output_error*hidden_output
       del_w_hidden+=hidden_error*x_[:,None]


       #更新权值
       weights_hidden += learning_rate * del_w_hidden / x_train.shape[0]
       weights_output += learning_rate * del_w_output / x_train.shape[0]

       #输出状态
       if i %100==0:
           hidden_output=sigmoid(np.dot(x_val,weights_hidden))
           out=sigmoid(np.dot(hidden_output,weights_output))
           loss=np.mean((out-y_val)**2)

           #最终预测值基于阈值0.5
           predictions=out>0.5
           accuracy=np.mean(predictions==y_val)
           print("epoch: ",'{:>4}'.format(i),
                 "; validation loss: ",'{:>6}'.format(loss.round(4)),
                 "; validation accuracy: ",
                 '{:>6}'.format(accuracy.round(4)))

结果:
在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 当然,我可以为您提供一个单层神经网络的Python代码,如下所示: ``` import numpy as np class NeuralNetwork: def __init__(self, input_dim, output_dim): self.weights = np.random.randn(input_dim, output_dim) self.bias = np.zeros((1, output_dim)) def forward(self, x): z = np.dot(x, self.weights) + self.bias return z # 使用示例 input_dim = 3 output_dim = 2 x = np.array([[1, 2, 3]]) nn = NeuralNetwork(input_dim, output_dim) z = nn.forward(x) print(z) ``` 这个代码实现一个单层神经网络,它具有指定的输入和输出维度。该神经网络使用随机初始化的权重和零偏置,在前向传播过程中,它将输入乘以权重并加上偏置,然后输出结果。在这个示例中,我们将一个长度为3的输入向量传递给神经网络,并输出一个长度为2的向量。 ### 回答2: 单层神经网络是一种最简单的神经网络,也被称为感知器。它由输入层和输出层组成,没有隐藏层。下面是一个使用Python编写的单层神经网络的示例代码。 ```python import numpy as np # 定义神经网络类 class SingleLayerNeuralNetwork: def __init__(self, input_size, output_size): self.weights = np.random.randn(input_size, output_size) # 初始化权重 self.bias = np.zeros(output_size) # 初始化偏置 def forward(self, inputs): self.output = np.dot(inputs, self.weights) + self.bias # 前向传播计算输出 def backward(self, inputs, targets, learning_rate): error = targets - self.output # 计算误差 self.weights += np.dot(inputs.T, error) * learning_rate # 更新权重 self.bias += np.sum(error, axis=0) * learning_rate # 更新偏置 def train(self, inputs, targets, learning_rate, epochs): for _ in range(epochs): self.forward(inputs) self.backward(inputs, targets, learning_rate) # 创建示例数据 inputs = np.array([[1, 1], [0, 1], [1, 0], [0, 0]]) targets = np.array([[1], [0], [0], [0]]) # 创建神经网络对象并进行训练 neural_network = SingleLayerNeuralNetwork(input_size=2, output_size=1) neural_network.train(inputs, targets, learning_rate=0.1, epochs=100) # 测试神经网络 test_input = np.array([[1, 1]]) neural_network.forward(test_input) print("网络输出:", neural_network.output) ``` 这段代码实现一个单层神经网络,用于解决简单的逻辑问题。它首先定义了一个神经网络类SingleLayerNeuralNetwork,包含了初始化权重、前向传播、反向传播和训练等方法。然后创建了示例数据inputs和targets,使用这些数据进行神经网络的训练。最后对神经网络进行测试,输出网络的预测结果。 ### 回答3: 单层神经网络是最简单的神经网络模型之一,它由一个输入层、一个隐藏层和一个输出层组成。下面是一个使用Python编写的单层神经网络的示例代码: ```python import numpy as np class SingleLayerNeuralNetwork: def __init__(self, input_size, output_size): self.input_size = input_size self.output_size = output_size self.weights = np.random.randn(input_size, output_size) self.bias = np.zeros((1, output_size)) def forward(self, X): self.z = np.dot(X, self.weights) + self.bias self.a = self.sigmoid(self.z) return self.a def backward(self, X, y, learning_rate): m = X.shape[0] dz = self.a - y dw = np.dot(X.T, dz) / m db = np.sum(dz, axis=0, keepdims=True) / m self.weights -= learning_rate * dw self.bias -= learning_rate * db def sigmoid(self, x): return 1 / (1 + np.exp(-x)) # 使用示例 X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]]) y = np.array([[0, 1, 1, 0]]).T nn = SingleLayerNeuralNetwork(input_size=2, output_size=1) for i in range(1000): nn.forward(X) nn.backward(X, y, learning_rate=0.1) # 预测 predictions = nn.forward(X) print(predictions) ``` 这是一个简单的实现了逻辑门XOR的单层神经网络。首先,我们定义了SingleLayerNeuralNetwork类,它具有初始化权重、向前传播和反向传播的功能。在主程序中,我们创建了一个XOR逻辑门的训练数据集,并初始化了神经网络对象。然后,通过多次迭代调用向前传播和反向传播来训练神经网络。最后,通过调用forward方法进行预测并打印输出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值