平台型网站如何推广,网站开发软件 论文 摘要,建立一个团购网站需要多少钱,微信商城网站开发应用广泛
从人脸识别到网约车#xff0c;在生活中无处不在
未来可期
无人驾驶技术便利出行医疗健康改善民生
产业革命
第四次工业革命——人工智能
机器学习概念
机器学习不等价与人工智能20世纪50年代#xff0c;人工智能是说机器模仿人类行为的能力
符号人工智能
…应用广泛
从人脸识别到网约车在生活中无处不在
未来可期
无人驾驶技术便利出行医疗健康改善民生
产业革命
第四次工业革命——人工智能
机器学习概念
机器学习不等价与人工智能20世纪50年代人工智能是说机器模仿人类行为的能力
符号人工智能
基于符号将人类的知识声明为一种计算机可以处理的形式专家系统发展于人工智能模拟人类的决策缺点是依赖人类专家的知识解决问题的规则和认知是被编程的
机器学习
通俗讲机器从已有的数据中学习并对其他数据做预测
机器学习的基础条件
海量的数据存储能力强大的运算能力
刚开始科学家使用符号人工智能但是发现研究进展不顺随着计算机硬件的提升机器学习的基础条件得到满足后AI发展迎来春天。
机器学习算法
有监督分类
标记过的训练数据学习从输入变量映射到目标变量的规则例如降雨目标变量温度、时间、气压、风速等等就是输入变量
无监督分类
未经标记过的训练数据学习数据中的关联规则、模式及类别常见案例是聚类分析
监督分类的案例
区分两种动物兔子和大象收集到的数据有速度和体重兔子的特征是体重小速度快大象的特征是体重大速度慢机器学习算法的任务就是找到分割兔子和大象的区别生成决策边界线将海量的数据一分为二线就是决策边界。有了决策边界就可以对未知的数据集进行预测判断类型不同的学习算法会对最终的结果有影响
常用的机器学习方法包括
神经网络线性回归对数概率回归支持向量机决策树
机器学习的工作流程
输入数据 多个数据源数据预处理 数据整合数据编码数据换算和标准化补充缺失数据 均值替换缺失值基于存在数据预测缺失值训练测试数据分割数据分析 数据可视化探索性数据分析 特征工程领域知识加入机器学习模型构建 选择学习模型调参训练模型评估模型输出结果 输出未知数据集的预测结果
神经网络
模拟人类大脑神经元
单层神经网络——感知机
核心数学函数 过程输入运算输出
为什么神经网络好
通用函数逼近器
现实生活中的问题总能用数学函数来表征不论函数有多复杂神经网络都能对这个函数无限逼近前提理想的算力
可扩展性好且灵活
神经网络的不同堆叠方式和排列组合可以解决各种问题好的程序员对网络的编排更为熟悉。
神经网络的内部工作原理
输入层一个或者多个的隐藏层输出层每层之间包含权重W和偏差b为每个隐藏层所选择的激活函数σ
Python中训练神经网络
import numpy as npclass NeuralNetwork:def__init__(self,x,y):self.inputxself.weights1np.random.rand(self.input.shape[1],4)self.weights2np.random.rand(4,1)self.yyself.outputnp.zeros(self.y.shape) import numpy as np导入NumPy库并将其重命名为np用于处理数组和矩阵等数学运算。 class NeuralNetwork:定义了一个名为NeuralNetwork的类用于表示神经网络。 def __init__(self, x, y):定义了类的构造函数用于初始化神经网络的参数。 self.input x将输入数据x保存到类的属性input中。 self.weights1 np.random.rand(self.input.shape[1], 4)随机初始化输入层到隐藏层之间的权重矩阵矩阵大小为输入数据的特征数x的列数乘以隐藏层的神经元数这里设定为4。 self.weights2 np.random.rand(4, 1)随机初始化隐藏层到输出层之间的权重矩阵矩阵大小为隐藏层的神经元数4乘以输出值。 self.y y将输出数据y保存到类的属性y中。 self.output np.zeros(self.y.shape)初始化一个和输出数据y相同大小的零矩阵用于保存神经网络的输出值。
两层神经网络的数学内核 其中 是输入向量是第一个隐藏层的权重矩阵是第一个隐藏层的偏置向量是激活函数如 Sigmoid 函数是第二个隐藏层到输出层的权重矩阵 是输出层的偏置向量是神经网络的输出向量。
神经网络的训练包括2个步骤 前馈计算预测输出 反向传播Backward Propagation更新权重和偏差
前馈
进行前向传播计算假设偏差都为0
import numpy as npclass NeuralNetwork:def__init__(self,x,y):self.inputxself.weights1np.random.rand(self.input.shape[1],4)self.weights2np.random.rand(4,1)self.yyself.outputnp.zeros(self.y.shape)def feedforward(self):self.layer1sigmoid(np.dot(self.input,self.weights1))self.layer2sigmoid(np.dot(self.input,self.weights2))
1. self.layer1 sigmoid(np.dot(self.input, self.weights1))将输入数据 self.input 与第一层的权重矩阵 self.weights1 相乘并通过 Sigmoid 激活函数进行非线性变换得到第一层的输出 self.layer1。这一步表示输入数据经过第一层的处理后的输出。
2. self.layer2 sigmoid(np.dot(self.input, self.weights2))将输入数据 self.input 与第二层的权重矩阵 self.weights2 相乘并通过 Sigmoid 激活函数进行非线性变换得到第二层的输出 self.layer2。这一步表示第一层的输出经过第二层的处理后的输出。
这段代码的目的是计算神经网络的前向传播过程中各层的输出以便后续计算损失函数和进行反向传播更新权重。值得注意的是这里的 sigmoid 函数是一个自定义的激活函数用于将神经网络的输出限制在0到1之间。
损失函数
损失函数有多种目前以平方和误差为例 平方和误差就是对实际值和预测值之间的差值求和
目标是实现训练神经网络并找到是损失函数最小化的最优权重
反向传播
计算出预测结果的误差损失需要找到一种方法将误差在网络中反向传导以便更新权重和偏差。
要找合适的权重和偏差矫正量需要知道损失函数关于权重及偏差的导数
函数的导数就是函数的斜率
根据导数就可以根据导数的值增加或者减少导数值的方式来调节权重和偏差这种方法也称为梯度下降法
使用链式法则求损失函数的导数链式法则封装在keras等机器学习的库中
关键点由损失函数关于权重的导数斜率帮助调整权重
import numpy as npdef sigmoid(x):return 1.0/(1np.exp(-x))
def sigmoid_derivative(x):return x*(1.0-x)
class NeuralNetwork:def __init__(self,x,y):self.inputxself.weights1np.random.rand(self.input.shape[1],4)self.weights2np.random.rand(4,1)self.yyself.outputnp.zeros(self.y.shape)def feedforward(self):self.layer1sigmoid(np.dot(self.input,self.weights1))self.output sigmoid(np.dot(self.layer1,self.weights2))def backprop(self):#Find the derivative of the loss function with respect to weight2 and weight1 using the chain ruled_weights2np.dot(self.layer1.T,(2*(self.y-self.output)*sigmoid_derivative(self.output)))d_weights1np.dot(self.input.T,(np.dot(2*(self.y-self.output)*sigmoid_derivative(self.output),self.weights2.T)*sigmoid_derivative(self.layer1)))self.weights1 d_weights1self.weights2 d_weights2
if __name____main__:Xnp.array([[0,0,1],[0,1,1],[1,0,1],[1,1,1]])ynp.array([[0],[1],[1],[0]])nnNeuralNetwork(X,y)for i in range(1500):nn.feedforward()nn.backprop()print(nn.output)
这段代码实现了一个简单的神经网络包括一个输入层、一个隐藏层和一个输出层。以下是每个模块的描述 import numpy as np: 导入NumPy库用于处理数组和矩阵等数值计算。 def sigmoid(x): 定义sigmoid激活函数用于将输入值转换为0到1之间的值。 def sigmoid_derivative(x): 定义sigmoid激活函数的导数用于反向传播中计算梯度。 class NeuralNetwork: 定义神经网络类包括初始化方法__init__、前向传播方法feedforward和反向传播方法backprop。 __init__(self, x, y): 初始化神经网络包括输入数据x、目标输出y、第一层到第二层的权重weights1和第二层到输出层的权重weights2。 feedforward(self): 执行神经网络的前向传播计算输入经过权重后得到的输出。 backprop(self): 执行神经网络的反向传播根据损失函数的梯度更新权重以减小预测输出与实际输出之间的差距。 if __name____main__:主程序入口创建神经网络对象并进行训练。 创建输入数据X和目标输出y。 创建神经网络对象nn。 循环执行1500次训练迭代每次迭代包括前向传播和反向传播。 打印训练后的输出结果nn.output。
重要点Sigmoid是激活函数将函数值压缩到0~1对于二元问题就是将预测结果位于0~1
结果精度检验
x1x2x3Y0010011110111110
迭代神经网络1500次给出了最后的预测结果与真实值进行对照同时给出损失迭代-次数图
if __name____main__:Xnp.array([[0,0,1],[0,1,1],[1,0,1],[1,1,1]])ynp.array([[0],[1],[1],[0]])nnNeuralNetwork(X,y)losses [] # 用于记录每次迭代后的损失值for i in range(1500):nn.feedforward()nn.backprop()loss np.mean(np.square(nn.y - nn.output)) # 计算均方误差损失losses.append(loss)plt.plot(range(1, 1501), losses) # 绘制损失-迭代次数图plt.xlabel(Iterations)plt.ylabel(Loss)plt.title(Loss vs. Iterations)plt.show()
为什么要求平均不平均代码报错 在计算损失时我们通常会计算所有样本的损失值的平均值。这是因为损失是所有样本预测值与真实值之间差值的函数我们希望损失值能够反映整个数据集的预测准确程度而不仅仅是单个样本的准确程度。因此对所有样本的损失值取平均可以更好地衡量整个模型的性能。 预测值 实际值0.0092400.9725710.9720110.034340
由图片和图表可以看出来前馈和反向传播算法成功训练的神经网络且预测值收敛于真实值且预测值与真实值有一定的误差这个是在允许范围之内的。
最后 for i in range(1500):nn.feedforward()nn.backprop()loss np.mean(np.square(nn.y - nn.output)) # 计算均方误差损失losses.append(loss)
这块代码可以在类中进行分装代码简洁迁移性、可读性好
def train(self, epochs):for i in range(epochs):self.feedforward()self.backprop()loss np.mean(np.square(self.y - self.output)) # 计算均方误差损失self.losses.append(loss)
if __name____main__:Xnp.array([[0,0,1],[0,1,1],[1,0,1],[1,1,1]])ynp.array([[0],[1],[1],[0]])nnNeuralNetwork(X,y)nn.train(1500) # 进行1500次训练迭代plt.plot(range(1, 1501), nn.losses) # 绘制损失-迭代次数图plt.xlabel(Iterations)plt.ylabel(Loss)plt.title(Loss - Iterations)plt.show()