当前位置: 首页 > news >正文

本地拖拽网站建设wordpress条件判断

本地拖拽网站建设,wordpress条件判断,动漫网站设计模板,永州网站建设包括哪些目录 一、理论知识回顾 1、神经网络模型 2、明确任务以及参数 1#xff09;待估参数#xff1a; 2#xff09;超参数#xff1a; 3#xff09;任务 3、神经网络数学模型定义 1#xff09;激活函数 ​ 2#xff09;各层权重、阈值定义 3#xff09;各层输入输…目录 一、理论知识回顾 1、神经网络模型 2、明确任务以及参数 1待估参数 2超参数 3任务 3、神经网络数学模型定义 1激活函数 ​ 2各层权重、阈值定义 3各层输入输出定义 4、优化问题的目标函数与迭代公式 1目标函数 2待估参数的优化迭代公式 二、python编程 1、编程步骤 2、数据准备、数据处理、数据划分 1数据下载 2关键代码 3、初始化待估参数 1关键代码 2np.random.randint(a,b,(m,n))函数 3astype(np.float64) 4、创建激活函数 5、参数迭代更新 1关键代码 2dot、multiply 3难点 6、测试模型 7、主函数运行 三、总结 1、几个循环 2、问题集锦 1若是有多个输出怎么办 2BP算法为什么叫做后向传播 四、完整代码 坚持嗑完这篇文章一定会明白神经网络BP算法的精髓所在的以及各层之间误差的互相影响以及传播 一、理论知识回顾 参考文章 《机器学习——人工神经网络之发展历史神经元数学模型、感知器算法》 《机器学习——人工神经网络之多层神经网络多层与三层》 《机器学习——人工神经网络之后向传播算法BP算法》 《机器学习——人工神经网络之参数设置BP算法》 1、神经网络模型 一个神经元即一个感知机模型由多个神经元相互连接形成的网络即神经网络。 这里我们只讨论单隐层前馈神经网络其连接形式入下 2、明确任务以及参数 1待估参数 每个神经元的阈值b或者value以及神经元之间的连接权重weight。 2超参数 超参数就是求解不出来需要用户自己定义的参数如在神经网络中超参数有 神经网络隐层的层数一般只考虑隐层的层数因为输入层和输出层一般默认为一层 每一层神经网络的神经元个数神经元的个数直接影响着待估参数的个数假设隐层第m层有k个神经元第m1层有l个神经元那么这两层之间的权重系数weight的个数为k*l个一般组成k,l矩阵的形式每一层的阈值或者叫做偏置的个数和神经元个数相同 神经网络可能这个听起来比较抽象但是这就是需要自己进行定义的具体见代码主要是指定神经网络层数每层神经元的个数确定待估参数的初始值就基本上将神经网络给定义好了 3任务 通过训练样本将定义的神经网络模型进行不断的优化将待测参数进行不断的迭代直到满足条件为止条件理论上是目标函数E对所有的待测参数的偏导为0但是计算机没有绝对的0值因此一般通过迭代次数和偏导的最小值来作为迭代的终止条件 3、神经网络数学模型定义 对于该模型有如下定义 训练集D{(x1, y1), (x2, y2), ......, (xm, ym)}x具有d个属性值y具有k个可能取值 则我们的神经网络单隐层前馈神经网络应该是具有d个输入神经元q个隐层神经元k个输出层神经元的神经网络 我们默认输入层只是数据的输入不对数据做处理即输入层没有阈值。 1激活函数 2各层权重、阈值定义 输出层第j个神经元的阈值为θj 隐层第h个神经元的阈值为γhγ是Gamma 输入层第i个神经元与隐层第h个神经元的连接权重为vih 隐层第h个神经元与输出层第j个神经元的连接权重为ωhj 3各层输入输出定义 输入层的输入和输出一样就是样本数据 隐层第h个神经元的输入 隐层第h个神经元的输出 输出层第j个神经元的输入 输出层的输出跟隐层的输出类似 4、优化问题的目标函数与迭代公式 1目标函数 对参数进行估计需要有优化方向我们继续使用欧式距离或者均方误差来作为优化目标 2待估参数的优化迭代公式 我们使用梯度下降的策略对参数进行迭代优化所以任意一个参数的变化大小为θ代表任意参数 下面根据这个更新公式我们来求各个参数的更新公式 对数几率函数的导数如下 输出层第j个神经元的阈值θj 隐层第h个神经元的阈值γh 输入层第i个神经元与隐层第h个神经元的连接权重vih   隐层第h个神经元与输出层第j个神经元的连接权重ωhj  现在四个参数的更新规则都计算出来了我们可以开始编码实现了。  现在有一个问题在二分类任务中输出层神经元有几个 一个如果只有1个那么输出0表示反例1表示正例 二个那么输出1,0表示反例0,1表示正例 以下实例我们使用第一种即输出层的神经元只有一个 二、python编程 1、编程步骤 数据准备通过读取数据文件获取 数据处理读取的数据是字符串形式需要将其转换为浮点数或者整型 数据划分将特征和标签分割开 初始化待估参数通过自定义超参数每层神经元的个数来进行初始化待估参数——这里不需要定义层数因为这里只有一个隐层 参数迭代更新用初始化的待估参数去对样本数据进行逐一训练并且不断地迭代更新最后得到最优的待估参数——这里和上一步其实就基本上将整个神经网络的框架已经搭建好了 测试模型利用上面得到的参数对测试样本集进行测试查看准确率 2、数据准备、数据处理、数据划分 1数据下载 我们使用一个二分类数据集马疝病数据集 UCI下载地址为http://archive.ics.uci.edu/ml/datasets/HorseColic 或者 以下是用户《9527----到》提供的可见文章《基于tensorflow的logistics回归--数据集为 horseColicTest and horseColicTraining.txt文章底部附数据集链接》文末 测试集 https://pan.baidu.com/s/1h1t0LLxZlESPPdfn1zxTXQ 训练集 https://pan.baidu.com/s/1IVO2opIQ0e66_AEchw_X4Q 2关键代码 #创建加载数据读取数据以及划分数据集的函数返回数据特征集以及数据标签集 def loaddataset(filename):fp open(filename)#29922# 存放数据dataset []# 存放标签labelset []for i in fp.readlines():#按照行来进行读取每次读取一行一行的数据作为一个元素存放在了类别中a i.strip().split()#去掉每一行数据的空格以及按照默认的分隔符进行划分# 每个数据行的最后一个是标签dataset.append([float(j) for j in a[:len(a) - 1]])#读取每一行中除最后一个元素的前面的元素并且将其转换为浮点数labelset.append(int(float(a[-1])))#读取每一行的最后一个数据作为标签数据return dataset, labelset#dataset是299,21的列表labelset是299,1的列表3、初始化待估参数 1关键代码 # x为输入层神经元个数y为隐层神经元个数z输出层神经元个数 #创建的是参数初始化函数参数有各层间的权重weight和阈值即偏置value就是b #本例的x,ylen(dataset[0])22z1 def parameter_initialization(x, y, z):# 隐层阈值value1 np.random.randint(-5, 5, (1, y)).astype(np.float64)#随机生成-55之间的整数组成1y的数组然后再将其转为浮点数显示# 输出层阈值value2 np.random.randint(-5, 5, (1, z)).astype(np.float64)# 输入层与隐层的连接权重weight1 np.random.randint(-5, 5, (x, y)).astype(np.float64)# 隐层与输出层的连接权重weight2 np.random.randint(-5, 5, (y, z)).astype(np.float64)return weight1, weight2, value1, value2 weight1:输入层与隐层的连接权重 weight2:隐层与输出层的连接权重 value1:隐层阈值 value2:输出层阈值 权重和阈值的个数和神经网络的隐层层数有关若隐层为n则权重和阈值的个数为n12np.random.randint(a,b,(m,n))函数 np.random.randint(a,b,(m,n)) #在指定的范围内随机生成整数 #a区间上限b区间下限sizem,nab #表示生成m,n的数组数组元素为a,b间的整数 import numpy as np a np.random.randint(-5,5,size(2,4)) print(a) print(type(a))[[-1 3 -5 3][-3 1 -4 4]] class numpy.ndarray 3astype(np.float64) 将元素转化为指定的类型进行显示 import numpy as np a np.random.randint(-5,5,size(2,4)).astype(np.float64) print(a) print(type(a))[[-1. -2. -3. 3.][ 3. -2. -2. -3.]] class numpy.ndarray 4、创建激活函数 #创建激活函数sigmoid def sigmoid(z):return 1 / (1 np.exp(-z))5、参数迭代更新 这里是对所有的样本逐一进行训练一轮的函数即对整个训练样本进行了一次迭代若要循环迭代则需要在外层再套一层循环来表示迭代的次数本例将其直接放在了主函数中进行迭代的不断循环 1关键代码 #创建训练样本的函数返回训练完成后的参数weight和value这里的函数是经过一次迭代后的参数即所有的样本经过一次训练后的参数 #具体参数的值可以通过设置迭代次数和允许误差来进行确定 def trainning(dataset, labelset, weight1, weight2, value1, value2):# x为步长x 0.01#学习率for i in range(len(dataset)):#依次读取数据特征集中的元素一个元素即为一个样本所含有的所有特征数据# 输入数据#1,21inputset np.mat(dataset[i]).astype(np.float64)#每次输入一个样本将样本的特征转化为矩阵以浮点数显示# 数据标签#11outputset np.mat(labelset[i]).astype(np.float64)#输入样本所对应的标签# 隐层输入隐层的输入是由输入层的权重决定的wx#input1121.2121121input1 np.dot(inputset, weight1).astype(np.float64)# 隐层输出由隐层的输入和阈值以及激活函数决定的这里的阈值也可以放在输入进行计算#sigmoid121-121121output2 sigmoid(input1 - value1).astype(np.float64)# 输出层输入由隐层的输出#121.21111input2 np.dot(output2, weight2).astype(np.float64)# 输出层输出由输出层的输入和阈值以及激活函数决定的这里的阈值也可以放在输出层输入进行计算# 11.1111output3 sigmoid(input2 - value2).astype(np.float64)# 更新公式由矩阵运算表示#a:(1,1)a np.multiply(output3, 1 - output3)#输出层激活函数求导后的式子multiply对应元素相乘dot矩阵运算#g:(1,1)g np.multiply(a, outputset - output3)#outputset - output3实际标签和预测标签差#weight2:(21,1),np.transpose(weight2):(1,21),b:(1,21)b np.dot(g, np.transpose(weight2))#(1,21)c np.multiply(output2, 1 - output2)#隐层输出激活函数求导后的式子multiply对应元素相乘dot矩阵运算#(1,21)e np.multiply(b, c)value1_change -x * e#121value2_change -x * g#11weight1_change x * np.dot(np.transpose(inputset), e)#2121weight2_change x * np.dot(np.transpose(output2), g)#211# 更新参数权重与阈值的迭代公式value1 value1_changevalue2 value2_changeweight1 weight1_changeweight2 weight2_changereturn weight1, weight2, value1, value22dot、multiply dot:两个矩阵按照行列相乘组成新的矩阵 multiply两个矩阵和得到结果的矩阵的维度是一样的对应位置的元素进行相乘得到新矩阵对应位置的元素值 3难点 这一部分最大的难点就是在于读懂相关数学表达式的含义。建议将前面的理论部分之《待估参数的优化迭代公式》自己推导一遍然后弄清楚这一部分中参数的维数基本上就可以读懂了代码中注释已经将所有参数的维数变化进行了标注。 6、测试模型 将最后得到的待估参数的值作为最终的神经网络的参数对测试样本进行测试 #创建测试样本数据的函数 def testing(dataset1, labelset1, weight1, weight2, value1, value2):# 记录预测正确的个数rightcount 0for i in range(len(dataset1)):# 计算每一个样例的标签通过上面创建的神经网络模型后的预测值inputset np.mat(dataset1[i]).astype(np.float64)outputset np.mat(labelset1[i]).astype(np.float64)output2 sigmoid(np.dot(inputset, weight1) - value1)output3 sigmoid(np.dot(output2, weight2) - value2)# 确定其预测标签if output3 0.5:flag 1else:flag 0if labelset1[i] flag:rightcount 1# 输出预测结果print(预测为%d 实际为%d % (flag, labelset1[i]))# 返回正确率return rightcount / len(dataset1)7、主函数运行 def main():#读取训练样本数据并且进行样本划分dataset, labelset loaddataset(./horseColicTraining.txt)#读取测试样本数据并且进行样本划分dataset1, labelset1 loaddataset(./horseColicTest.txt)#得到初始化的待估参数的值weight1, weight2, value1, value2 parameter_initialization(len(dataset[0]), len(dataset[0]), 1)#迭代次数为1500次迭代次数一般越大准确率越高但是其运行时间也会增加for i in range(1500):#获得对所有训练样本训练迭代一次后的待估参数weight1, weight2, value1, value2 trainning(dataset, labelset, weight1, weight2, value1, value2)#对测试样本进行测试并且得到正确率rate testing(dataset1, labelset1, weight1, weight2, value1, value2)print(正确率为%f % (rate))if __name__ __main__:main() 三、总结 1、几个循环 在本例中单隐层可以分为以下几个循环 ***通过行来遍历每一个样本的特征集和标签 for i in range(len(dataset)):#依次读取数据特征集中的元素一个元素即为一个样本所含有的所有特征数据 ***迭代次数的循环通过迭代次数来控制迭代的终止条件当然也可以用while循环来进行迭代用误差来控制迭代的终止 for i in range(1500):#获得对所有训练样本训练迭代一次后的待估参数weight1, weight2, value1, value2 trainning(dataset, labelset, weight1, weight2, value1, value2) 若是多隐层的话还多一层循环 ***通过循环来遍历所有的隐层一般遍历只是为了获得每一隐层的神经元的个数因此只需要通过字典定义好每一隐层的神经元个数然后通过遍历的方式获得神经元个数即可注意神经元个数和权重、阈值个数的关系。或者如果隐层的层数比较少可以通过多添加几组待测参数即可,设有k层 def parameter_initialization(x1,x2,...,xi,..., xk):# 隐层阈值value1 np.random.randint(-5, 5, (x1, x2)).astype(np.float64)#随机生成-55之间的整数组成1y的数组然后再将其转为浮点数显示# 输出层阈值value2 np.random.randint(-5, 5, (x1, x3)).astype(np.float64).........valuei np.random.randint(-5, 5, (x1, xi)).astype(np.float64).........valuek np.random.randint(-5, 5, (x1, xk1)).astype(np.float64)# 输入层与隐层的连接权重weight1 np.random.randint(-5, 5, (x1, x2)).astype(np.float64)# 隐层与输出层的连接权重weight2 np.random.randint(-5, 5, (x2, x3)).astype(np.float64)........weighti np.random.randint(-5, 5, (xi,xi1)).astype(np.float64)........return weight1, weight2,...,weighti,...,weightk, value1, value2,...,valuei,...,valuek 2、问题集锦 1若是有多个输出怎么办 若是有多个输出的话只需要在主函数中修改输出层的神经元个数即可神经元个数等于输出的个数设有i个输出输出的增多也意味着输出的归类判断会更加的复杂 weight1, weight2, value1, value2 parameter_initialization(len(dataset[0]), len(dataset[0]), i) 2BP算法为什么叫做后向传播 因为从目标函数对待测参数求偏导可以看出目标函数对越往前的神经网络的参数进行求导其要经过的层数就会越多即要想求得目标函数对前面的参数的偏导就必须先知道该层神经网络后面的层数中目标函数对待测参数的偏导因为链式法则。而且在求对阈值的偏导的时候我们需要注意的是对该层阈值的偏导受下一层所有神经元的影响如下图就知道每一层的神经元都互相有关系所有每一层的神经元的阈值的偏导也和相邻层神经元有关 四、完整代码 #导入模块 import numpy as np#创建加载数据读取数据以及划分数据集的函数返回数据特征集以及数据标签集 def loaddataset(filename):fp open(filename)#29922# 存放数据dataset []# 存放标签labelset []for i in fp.readlines():#按照行来进行读取每次读取一行一行的数据作为一个元素存放在了类别中a i.strip().split()#去掉每一行数据的空格以及按照默认的分隔符进行划分# 每个数据行的最后一个是标签dataset.append([float(j) for j in a[:len(a) - 1]])#读取每一行中除最后一个元素的前面的元素并且将其转换为浮点数labelset.append(int(float(a[-1])))#读取每一行的最后一个数据作为标签数据return dataset, labelset#dataset是299,21的列表labelset是299,1的列表# x为输入层神经元个数y为隐层神经元个数z输出层神经元个数 #创建的是参数初始化函数参数有各层间的权重weight和阈值即偏置value就是b #本例的x,ylen(dataset[0])22z1 def parameter_initialization(x, y, z):# 隐层阈值value1 np.random.randint(-5, 5, (1, y)).astype(np.float64)#随机生成-55之间的整数组成1y的数组然后再将其转为浮点数显示# 输出层阈值value2 np.random.randint(-5, 5, (1, z)).astype(np.float64)# 输入层与隐层的连接权重weight1 np.random.randint(-5, 5, (x, y)).astype(np.float64)# 隐层与输出层的连接权重weight2 np.random.randint(-5, 5, (y, z)).astype(np.float64)return weight1, weight2, value1, value2#创建激活函数sigmoid def sigmoid(z):return 1 / (1 np.exp(-z)) weight1:输入层与隐层的连接权重 weight2:隐层与输出层的连接权重 value1:隐层阈值 value2:输出层阈值 权重和阈值的个数和神经网络的隐层层数有关若隐层为n则权重和阈值的个数为n1 #创建训练样本的函数返回训练完成后的参数weight和value这里的函数是经过一次迭代后的参数即所有的样本经过一次训练后的参数 #具体参数的值可以通过设置迭代次数和允许误差来进行确定 def trainning(dataset, labelset, weight1, weight2, value1, value2):# x为步长x 0.01#学习率for i in range(len(dataset)):#依次读取数据特征集中的元素一个元素即为一个样本所含有的所有特征数据# 输入数据#1,21inputset np.mat(dataset[i]).astype(np.float64)#每次输入一个样本将样本的特征转化为矩阵以浮点数显示# 数据标签#11outputset np.mat(labelset[i]).astype(np.float64)#输入样本所对应的标签# 隐层输入隐层的输入是由输入层的权重决定的wx#input1121.2121121input1 np.dot(inputset, weight1).astype(np.float64)# 隐层输出由隐层的输入和阈值以及激活函数决定的这里的阈值也可以放在输入进行计算#sigmoid121-121121output2 sigmoid(input1 - value1).astype(np.float64)# 输出层输入由隐层的输出#121.21111input2 np.dot(output2, weight2).astype(np.float64)# 输出层输出由输出层的输入和阈值以及激活函数决定的这里的阈值也可以放在输出层输入进行计算# 11.1111output3 sigmoid(input2 - value2).astype(np.float64)# 更新公式由矩阵运算表示#a:(1,1)a np.multiply(output3, 1 - output3)#输出层激活函数求导后的式子multiply对应元素相乘dot矩阵运算#g:(1,1)g np.multiply(a, outputset - output3)#outputset - output3实际标签和预测标签差#weight2:(21,1),np.transpose(weight2):(1,21),b:(1,21)b np.dot(g, np.transpose(weight2))#(1,21)c np.multiply(output2, 1 - output2)#隐层输出激活函数求导后的式子multiply对应元素相乘dot矩阵运算#(1,21)e np.multiply(b, c)value1_change -x * e#121value2_change -x * g#11weight1_change x * np.dot(np.transpose(inputset), e)#2121weight2_change x * np.dot(np.transpose(output2), g)#211# 更新参数权重与阈值的迭代公式value1 value1_changevalue2 value2_changeweight1 weight1_changeweight2 weight2_changereturn weight1, weight2, value1, value2#创建测试样本数据的函数 def testing(dataset1, labelset1, weight1, weight2, value1, value2):# 记录预测正确的个数rightcount 0for i in range(len(dataset1)):# 计算每一个样例的标签通过上面创建的神经网络模型后的预测值inputset np.mat(dataset1[i]).astype(np.float64)outputset np.mat(labelset1[i]).astype(np.float64)output2 sigmoid(np.dot(inputset, weight1) - value1)output3 sigmoid(np.dot(output2, weight2) - value2)# 确定其预测标签if output3 0.5:flag 1else:flag 0if labelset1[i] flag:rightcount 1# 输出预测结果print(预测为%d 实际为%d % (flag, labelset1[i]))# 返回正确率return rightcount / len(dataset1)def main():#读取训练样本数据并且进行样本划分dataset, labelset loaddataset(./horseColicTraining.txt)#读取测试样本数据并且进行样本划分dataset1, labelset1 loaddataset(./horseColicTest.txt)#得到初始化的待估参数的值weight1, weight2, value1, value2 parameter_initialization(len(dataset[0]), len(dataset[0]), 1)#迭代次数为1500次迭代次数一般越大准确率越高但是其运行时间也会增加for i in range(1500):#获得对所有训练样本训练迭代一次后的待估参数weight1, weight2, value1, value2 trainning(dataset, labelset, weight1, weight2, value1, value2)#对测试样本进行测试并且得到正确率rate testing(dataset1, labelset1, weight1, weight2, value1, value2)print(正确率为%f % (rate))if __name__ __main__:main() 参考《机器学习 BP神经网络(Python实现)》写的很详细
http://www.pierceye.com/news/370846/

相关文章:

  • 企业如何建自己的网站自己网站的登录api怎么做
  • 专业的网站建设企业微信小程序服务器一年多少钱
  • 关于网站建设的句子苏州实力做网站公司有哪些
  • 网页制作与网站建设》在线作业 答案wordpress信息量几百万
  • 代刷网站系统怎么做wordpress数据库连接
  • 邢台网站改版开发开封美食网站建设规划
  • 网站建设佰金手指科杰二五国内网站推广
  • wordpress 多站点 用户天津经济持续恢复
  • 做网站邯郸怎样建立平台
  • 网站中捕获鼠标位置mip wordpress 评论
  • 室内设计资料网站discuz是什么东西
  • 网站建设方向论文提纲网页作品制作的一般过程
  • 生道网站建设平台高端商品网站
  • 网站维护计划商标注册号查询入口官网
  • 个人怎样申请网站网站整站html
  • 网站规则购房网官网
  • 苏州市吴江区住房和城乡建设局网站西安市今天发生的重大新闻
  • 网站需求建设关系书赚钱软件学生
  • 长春做网站4435怎么做手机网站
  • 电子政务网站系统微信扫码登录wordpress
  • 设计网站一般要多少钱方维服务公司服务范围
  • 济南外贸网站制作做网站推广每天加班
  • 网站开发虚拟主机系统做网站的新闻
  • 黄骅港信息吧windows优化大师好用吗
  • 网站编辑怎么做哪些知名网站用wordpress
  • 兰州网站seo收费标准小程序和wordpress
  • 北京市网站设计h5制作平台免费推荐
  • 青岛网站设计企业网络营销个人感悟小结
  • 酒店网站源码宁夏网站制作哪家好
  • 租个网站服务器多少钱电子商务网站的建设流程