机器学习日志——史上最白话的神经网络教程

这篇博客详细介绍了神经网络的基础,包括多层向前神经网络的结构、神经元的工作原理、如何设计神经网络,以及BP算法的详细步骤。通过实例解释了权重和偏置的更新过程,并探讨了神经网络在分类和回归问题中的应用。最后,提到了神经网络的Python实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先贴出BP神经网络代码如下:

class NeuralNetwork:
    def __init__(self, layers, activation='tanh'):
        if activation == 'logistic':
            self.activation = logistic
            self.activation_deriv = logistic_derivative
        elif activation == 'tanh':
            self.activation = tanh
            self.activation_deriv = tanh_deriv
        self.weights = []
        for i in range(1, len(layers) - 1):
            self.weights.append((2*np.random.random((layers[i - 1] + 1, layers[i] + 1))-1)*0.25)#i指当前层神经元
            self.weights.append((2*np.random.random((layers[i] + 1, layers[i + 1]))-1)*0.25)
    def fit(self, X, y, learning_rate=0.2, epochs=10000):
        X = np.atleast_2d(X) 
        temp = np.ones([X.shape[0], X.shape[1]+1])
        temp[:, 0:-1] = X 
        X = temp
        y = np.array(y)
        for k in range(epochs):
            i = np.random.randint(X.shape[0])
            a = [X[i]]
            for l in range(len(self.weights)):
                a.append(self.activation(np.dot(a[l], self.weights[l])))
            error = y[i] - a[-1]
            deltas = [error * self.activation_deriv(a[-1])]
            for l in range(len(a) - 2, 0, -1):
                deltas.append(deltas[-1].dot(self.weights[l].T)*self.activation_deriv(a[l]))
            deltas.reverse()
            for i in range(len(self.weights)):
                layer = np.atleast_2d(a[i])
                delta = np.atleast_2d(deltas[i])
                self.weights[i] += learning_rate * layer.T.dot(delta)
    def predict(self, x):
        x = np.array(x)
        temp = np.ones(x.shape[0]+1)
        temp[0:-1] = x
        a = temp
        for l in range(0, len(self.weights)):
            a = self.activation(np.dot(a, self.weights[l]))
        return a

 

接下来,我将在具体的数学模型中描述上面代码的数学模型

 

在此之前,先介绍几个概念:

一、背景

 

     1.1以人脑中的神经网络为启发,历史上出现过很多不同版本

     1.2最著名的算法是1980年的 backpropagation(反向传播)

 

二、多层向前神经网络( Multilayer Feed- Forward Neural Network)

 

  (1) 每层由单元(units)组成
  (2) 输入层(input layer)是由训练集的实例特征向量传入
  (3) 经过连接结点的权重(weight)传入下一层,一层的输出是下一层的输入
  (4) 隐藏层的个数是任意的,输出层和输入层只有一个
  (5) 每个单元(unit)也可以被称作神经结点,根据生物学来源定义
  (6) 上图称为2层的神经网络(输入层不算)
  (7) 一层中加权的求和,然后根据非线性的方程转化输出
  (8) 作为多层向前神经网络,理论上,如果有足够多的隐藏层(hidden layers)和足够大的训练集,可以模拟出任何方程

三、设计一个神经网络

 

  3.1使用神经网络训练数据之前,必须确定神经网络层数,以及每层单元个数
    3.2特征向量在被传入输入层时通常被先标准化(normalize)和0和1之间(为了加强学习过程)
    3.3离散型变量可以被编码成每一个输入单元对应一个特征可能赋的值
        比如:特征值A可能取三个值(a0,a1,a2),可以使用三个输入单元来代表A
                    如果A=a0,那么代表a0的单元值就取1,其他取0

                    如果A=a1,那么代表a1的单元值就取1,其他取0,以此类推

        例如输出值为【0,9】,那么0就是0.1,1就是0.01,2就是0.001,3就是0.003.。。。。以此类推
    3.4神经网络即可以用来做分类(classification)问题,也可以解决回归(regression)问题
  &nbs

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值