神经网络(线性神经网络、Delta学习规则)

线性神经网络

        线性神经网络在结构上与感知器非常相似,只是激活函数不同。在模型训练时把原来的sign函数改成了purelin函数:y = x

        除了sign和purelin,还有很多常用的激活函数:

 Delta学习规则

        \delta学习规则是一种利用梯度下降法的一般性的学习规则,也可以称为连续感知器学习规则。

        首先也要定义代价函数(损失函数),二次代价函数:

        误差E是权向量W的函数,我们可以使用梯度下降法来最小化E的值:

         对应的梯度下降法一维和二维情况如图所示:

        梯度下降法的问题:学习率难以选取,太大会产生震荡,太小收敛缓慢

                                        容易陷入局部最优解(局部极小值)

实战

        异或问题

        解决异或(非线性)问题,需要加入非线性项:

         第一步:导库、导数据、定义更新函数

import numpy as np
import matplotlib.pyplot as plt

#输入数据
X = np.array([[1,0,0,0,0,0],
              [1,0,1,0,0,1],
              [1,1,0,1,0,0],
              [1,1,1,1,1,1]])

#标签
Y = np.array([[1],
              [1],
              [-1],
              [-1]])

#权值初始化,6行1列,取值范围-1到1
W = (np.random.random([6,1])-0.5)*2

lr = 0.11
#神经网络输出
O = 0

def update():
    global X,Y,W,lr
    O = np.dot(X,W)
    W_C = lr*(X.T.dot(Y-O))/int(X.shape[0])
    W = W + W_C

        第二步:训练模型、可视化、结果

for i in range(100):
    update()#更新权值

#正样本
x1 = [0,1]
y1 = [1,0]
#负样本
x2 = [0,1]
y2 = [0,1]


def calculate(x,root):
    a=W[3]
    b=W[2]+x*W[4]
    c=W[0]+x*W[1]+x*x*W[3]
    if root==1:
        return (-b+np.sqrt(b*b-4*a*c))/(2*a)
    if root==2:
        return (-b-np.sqrt(b*b-4*a*c))/(2*a)


x_data=np.linspace(0,5)

plt.figure()
plt.plot(x_data,calculate(x_data,1),'r')
plt.plot(x_data,calculate(x_data,2),'r')

plt.scatter(x1,y1,c='bo')
plt.scatter(x2,y2,c='yo')
plt.show()

O=np.dot(X,W,T)
print(O)

         这是我学习 覃秉丰老师的《机器学习算法基础》的自学笔记,课程在B站中的地址为:

机器学习算法基础-覃秉丰_哔哩哔哩_bilibili

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在Python中,可以使用多种库来实现BP神经网络的多元非线性模型。其中,最常用的是NumPy和Keras。 以下是一个使用NumPy实现的BP神经网络示例: ``` import numpy as np # 定义sigmoid函数 def sigmoid(x): return 1 / (1 + np.exp(-x)) # 定义BP神经网络类 class BPNet: def __init__(self, layers): self.layers = layers self.weights = [] for i in range(1, len(layers)): self.weights.append(np.random.randn(layers[i-1], layers[i])) # 前向传播 def forward(self, x): a = x for w in self.weights: z = np.dot(a, w) a = sigmoid(z) return a # 反向传播 def backward(self, x, y, learning_rate): a = x activations = [a] zs = [] for w in self.weights: z = np.dot(a, w) zs.append(z) a = sigmoid(z) activations.append(a) delta = (activations[-1] - y) * activations[-1] * (1 - activations[-1]) for i in range(len(self.weights)-1, -1, -1): delta = np.dot(delta, self.weights[i].T) * activations[i] * (1 - activations[i]) grad = np.dot(activations[i].T, delta) self.weights[i] -= learning_rate * grad # 训练模型 def train(self, x, y, learning_rate, epochs): for i in range(epochs): self.backward(x, y, learning_rate) # 测试模型 x = np.array([[0, 0], [0, 1], [1, 0], [1, 1]]) y = np.array([[0], [1], [1], [0]]) bpnet = BPNet([2, 4, 1]) bpnet.train(x, y, 0.1, 10000) print(bpnet.forward(x)) ``` 另外,使用Keras库也可以很方便地实现BP神经网络。以下是一个使用Keras实现的BP神经网络示例: ``` from keras.models import Sequential from keras.layers import Dense # 定义BP神经网络模型 model = Sequential() model.add(Dense(units=4, input_dim=2, activation='sigmoid')) model.add(Dense(units=1, activation='sigmoid')) model.compile(loss='binary_crossentropy', optimizer='sgd') # 训练模型 model.fit(x, y, epochs=10000, batch_size=4) # 测试模型 print(model.predict(x)) ``` 以上两个示例都是实现了一个简单的BP神经网络,用于解决XOR问题。在实际应用中,需要根据具体问题来选择网络结构和参数,并进行更复杂的训练和测试。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NPU_Li

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值