机器学习 BP神经网络(Python实现)

机器学习 BP神经网络(Python实现)一个神经元即一个感知机模型,由多个神经元相互连接形成的网络,即神经网络。这里我们只讨论单隐层前馈神经网络,其连接形式入下:神经网络模型的待估参数即,每个神经元的阈值,以及神经元之间的连接权重。对于该模型有如下定义:训练集:D={(x1,y1),(x2,y2),……,(xm,ym)},x具有d个属性值,y具有k个可能取值则我们的神经网络(单隐层前馈神经网络…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

一个神经元即一个感知机模型,由多个神经元相互连接形成的网络,即神经网络。

这里我们只讨论单隐层前馈神经网络,其连接形式入下:

机器学习 BP神经网络(Python实现)

神经网络模型的待估参数即,每个神经元的阈值,以及神经元之间的连接权重。

对于该模型有如下定义:

训练集:D={(x1, y1), (x2, y2), ……, (xm, ym)},x具有d个属性值,y具有k个可能取值

则我们的神经网络(单隐层前馈神经网络)应该是具有d个输入神经元,q个隐层神经元,k个输出层神经元的神经网络 ,我们默认输入层只是数据的输入,不对数据做处理,即输入层没有阈值。

阈值函数使用对数几率函数:

机器学习 BP神经网络(Python实现)

有如下定义:

输出层第j个神经元的阈值为:θj

隐层第h个神经元的阈值为:γh(γ是Gamma)

输入层第i个神经元与隐层第h个神经元的连接权重为:vih

隐层第h个神经元与输出层第j个神经元的连接权重为:ωhj

由上述定义我们可以得到:

隐层第h个神经元接收到输入:

机器学习 BP神经网络(Python实现)

 隐层第h个神经元的输出:

机器学习 BP神经网络(Python实现)

输出层第j个神经元接收到的输入:

机器学习 BP神经网络(Python实现)

现在我们定义好了所有的参数,接下来我们要求这些模型。

对参数进行估计,需要有优化方向,我们继续使用欧式距离,或者均方误差来作为优化目标:

机器学习 BP神经网络(Python实现)

我们使用梯度下降的策略对参数进行迭代优化,所以任意一个参数的变化大小为(θ代表任意参数):

机器学习 BP神经网络(Python实现)

 下面根据这个更新公式,我们来求各个参数的更新公式:

对数几率函数的导数如下:

机器学习 BP神经网络(Python实现)

输出层第j个神经元的阈值θj:

机器学习 BP神经网络(Python实现)

机器学习 BP神经网络(Python实现)

机器学习 BP神经网络(Python实现)

机器学习 BP神经网络(Python实现)

机器学习 BP神经网络(Python实现)

机器学习 BP神经网络(Python实现)

 

 隐层第h个神经元的阈值γh:

机器学习 BP神经网络(Python实现)

机器学习 BP神经网络(Python实现)

机器学习 BP神经网络(Python实现)

机器学习 BP神经网络(Python实现)

机器学习 BP神经网络(Python实现)

机器学习 BP神经网络(Python实现)

机器学习 BP神经网络(Python实现)

机器学习 BP神经网络(Python实现)

 

输入层第i个神经元与隐层第h个神经元的连接权重vih :

机器学习 BP神经网络(Python实现)

机器学习 BP神经网络(Python实现)

机器学习 BP神经网络(Python实现)

机器学习 BP神经网络(Python实现)

机器学习 BP神经网络(Python实现)

机器学习 BP神经网络(Python实现)

机器学习 BP神经网络(Python实现)

机器学习 BP神经网络(Python实现)

 

隐层第h个神经元与输出层第j个神经元的连接权重ωhj:

机器学习 BP神经网络(Python实现)

机器学习 BP神经网络(Python实现)

机器学习 BP神经网络(Python实现)

机器学习 BP神经网络(Python实现)

机器学习 BP神经网络(Python实现)

机器学习 BP神经网络(Python实现)

 

现在四个参数的更新规则都计算出来了,我们可以开始编码实现了。

现在有一个问题:在二分类任务中,输出层神经元有几个?

                             一个:如果只有1个,那么输出0表示反例,1表示正例

                             二个:那么输出(1,0)表示反例,(0,1)表示正例

一下实例我们使用第一种:

 

我们使用一个二分类数据集:马疝病数据集

UCI下载地址为:http://archive.ics.uci.edu/ml/datasets/Horse+Colic

代码和数据集,我已经上传到我的资源:https://download.csdn.net/download/qq_41398808/11231315

 

数据读取:

def loaddataset(filename):
	fp = open(filename)

	#存放数据
	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

 

初始化各个参数:

#x为输入层神经元个数,y为隐层神经元个数,z输出层神经元个数
def parameter_initialization(x, y, z):

	#隐层阈值
	value1 = np.random.randint(-5, 5, (1, y)).astype(np.float64)

	#输出层阈值
	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:输出层阈值
'''
def trainning(dataset, labelset, weight1, weight2, value1, value2):
	#x为步长
	x = 0.01
	for i in range(len(dataset)):
		#输入数据
		inputset = np.mat(dataset[i]).astype(np.float64)
		#数据标签
		outputset = np.mat(labelset[i]).astype(np.float64)
		#隐层输入
		input1 = np.dot(inputset, weight1).astype(np.float64)
		#隐层输出
		output2 = sigmoid(input1 - value1).astype(np.float64)
		#输出层输入
		input2 = np.dot(output2, weight2).astype(np.float64)
		#输出层输出
		output3 = sigmoid(input2 - value2).astype(np.float64)

		#更新公式由矩阵运算表示
		a = np.multiply(output3, 1 - output3)
		g = np.multiply(a, outputset - output3)
		b = np.dot(g, np.transpose(weight2))
		c = np.multiply(output2, 1 - output2)
		e = np.multiply(b, c)

		value1_change = -x * e
		value2_change = -x * g
		weight1_change = x * np.dot(np.transpose(inputset), e)
		weight2_change = x * np.dot(np.transpose(output2), g)

		#更新参数
		value1 += value1_change
		value2 += value2_change
		weight1 += weight1_change
		weight2 += weight2_change
	return weight1, weight2, value1, value2

 

测试:

def testing(dataset, labelset, weight1, weight2, value1, value2):
	#记录预测正确的个数
	rightcount = 0
	for i in range(len(dataset)):
		#计算每一个样例通过该神经网路后的预测值
		inputset = np.mat(dataset[i]).astype(np.float64)
		outputset = np.mat(labelset[i]).astype(np.float64)
		output2 = sigmoid(np.dot(inputset, weight1) - value1)
		output3 = sigmoid(np.dot(output2, weight2) - value2)

		#确定其预测标签
		if output3 > 0.5:
			flag = 1
		else:
			flag = 0
		if labelset[i] == flag:
			rightcount += 1
		#输出预测结果
		print("预测为%d   实际为%d"%(flag, labelset[i]))
	#返回正确率
	return rightcount / len(dataset)

主函数:

if __name__ == '__main__':
	dataset, labelset = loaddataset('基于神经网络的马疝病死亡预测/horseColicTraining.txt')
	weight1, weight2, value1, value2 = parameter_initialization(len(dataset[0]), len(dataset[0]), 1)
	for i in range(1500):
		weight1, weight2, value1, value2 = trainning(dataset, labelset, weight1, weight2, value1, value2)
	rate = testing(dataset, labelset, weight1, weight2, value1, value2)
	print("正确率为%f"%(rate))

 

结果:

正确率为0.769231
[Finished in 68.2s]

上述实例只是一个测试我们模型是否推导正确的实例,在数据集上的学习效果并不好,有许多的细节没有考虑。

 

完整代码如下:

import numpy as np

def loaddataset(filename):
	fp = open(filename)

	#存放数据
	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


#x为输入层神经元个数,y为隐层神经元个数,z输出层神经元个数
def parameter_initialization(x, y, z):

	#隐层阈值
	value1 = np.random.randint(-5, 5, (1, y)).astype(np.float64)

	#输出层阈值
	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

def sigmoid(z):
	return 1 / (1 + np.exp(-z))

'''
weight1:输入层与隐层的连接权重
weight2:隐层与输出层的连接权重
value1:隐层阈值
value2:输出层阈值
'''
def trainning(dataset, labelset, weight1, weight2, value1, value2):
	#x为步长
	x = 0.01
	for i in range(len(dataset)):
		#输入数据
		inputset = np.mat(dataset[i]).astype(np.float64)
		#数据标签
		outputset = np.mat(labelset[i]).astype(np.float64)
		#隐层输入
		input1 = np.dot(inputset, weight1).astype(np.float64)
		#隐层输出
		output2 = sigmoid(input1 - value1).astype(np.float64)
		#输出层输入
		input2 = np.dot(output2, weight2).astype(np.float64)
		#输出层输出
		output3 = sigmoid(input2 - value2).astype(np.float64)

		#更新公式由矩阵运算表示
		a = np.multiply(output3, 1 - output3)
		g = np.multiply(a, outputset - output3)
		b = np.dot(g, np.transpose(weight2))
		c = np.multiply(output2, 1 - output2)
		e = np.multiply(b, c)

		value1_change = -x * e
		value2_change = -x * g
		weight1_change = x * np.dot(np.transpose(inputset), e)
		weight2_change = x * np.dot(np.transpose(output2), g)

		#更新参数
		value1 += value1_change
		value2 += value2_change
		weight1 += weight1_change
		weight2 += weight2_change
	return weight1, weight2, value1, value2

def testing(dataset, labelset, weight1, weight2, value1, value2):
	#记录预测正确的个数
	rightcount = 0
	for i in range(len(dataset)):
		#计算每一个样例通过该神经网路后的预测值
		inputset = np.mat(dataset[i]).astype(np.float64)
		outputset = np.mat(labelset[i]).astype(np.float64)
		output2 = sigmoid(np.dot(inputset, weight1) - value1)
		output3 = sigmoid(np.dot(output2, weight2) - value2)

		#确定其预测标签
		if output3 > 0.5:
			flag = 1
		else:
			flag = 0
		if labelset[i] == flag:
			rightcount += 1
		#输出预测结果
		print("预测为%d   实际为%d"%(flag, labelset[i]))
	#返回正确率
	return rightcount / len(dataset)

if __name__ == '__main__':
	dataset, labelset = loaddataset('基于神经网络的马疝病死亡预测/horseColicTraining.txt')
	weight1, weight2, value1, value2 = parameter_initialization(len(dataset[0]), len(dataset[0]), 1)
	for i in range(1500):
		weight1, weight2, value1, value2 = trainning(dataset, labelset, weight1, weight2, value1, value2)
	rate = testing(dataset, labelset, weight1, weight2, value1, value2)
	print("正确率为%f"%(rate))

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/194987.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 如何绘制qq图_python画图

    如何绘制qq图_python画图Q-Q图主要可以用来回答这些问题:两组数据是否来自同一分布PS:当然也可以用KS检验,利用python中scipy.stats.ks_2samp函数可以获得差值KSstatistic和P值从而实现判断。两组数据的尺度范围是否一致两组数据是否有类似的分布形状前面两个问题可以用样本数据集在Q-Q图上的点与参考线的距离判断;而后者则是用点的拟合线的斜率判断。用Q-Q图来分析分布的好处都有啥?(谁说对了…

    2022年8月10日
    12
  • stringtokenizer是什么意思_string getbytes

    stringtokenizer是什么意思_string getbytesStringTokenizer是一个用来分隔String的应用类。构造函数publicStringTokenizer(Stringstr)publicStringTokenizer(Stringstr,Stringdelim)publicStringTokenizer(Stringstr,Stringdelim,booleanreturnDelims)第一个参

    2022年8月11日
    8
  • 死链接检测 java,【死链接检测】工具查询方法及死链接处理方法

    死链接检测 java,【死链接检测】工具查询方法及死链接处理方法【死链接检测】工具查询方法及死链接处理方法死链接不但影响用户的体验,而且影响网站的跳出率,网站的跳出率直接关系到网站的排名。网站死链接量达到一定的程度,甚至网站会降权或者被K站,站长们应改高度的重视。死链接404页面1.网站死连接的查找。在360浏览器里——找到扩展——查找输入死链接,安装好插件。安装好以后,浏览器的上面就有一个这样的图标。打开你的网站,点击网页链接检查。出现下面的图片。然后收集死…

    2022年7月22日
    11
  • ATM(异步传输模式)是什么?

    ATM(异步传输模式)是什么?异步传输模式(ATM)也称为信元中继(在固定大小的信元中传输数据),通过光纤或双绞线电缆(高速交换)在OSI模型的数据链路层(第2层)运行基于ITU-T宽带综合业务数字网络(B-ISDN)标准的网络技术,该标准是电信业开发的自动取款机可以同时传输各种流量:语音、视频和数据,速度高达每秒155兆比特。它将语音和视频数据转换成数据包,并通过相同的介质传输大数据包数据。自动取款机和TCP。由于两个端点之间使用固定通道路由协议路由,所以/IP是不同的。实时低延迟应用程序,如VoIP和视频,在ATM网络上..

    2022年9月21日
    6
  • C3P0连接池详解及配置「建议收藏」

    C3P0连接池详解及配置「建议收藏」C3P0连接池详解及配置数据库连接是一个耗费大量资源且相当慢的操作,所以为了提高性能和连接速度,诞生了连接池这样的概念。在多用户并发操作过程中,连接池尤为重要。它是将那些已连接的数据库连接存放在一个容器里(连接池),这样以后别人要连接数据库的时候,将不会重新建立数据库连接(这样蜗牛的慢动作谁都受不了的),他会直接从连接池里取出可用的连接,用户使用完毕后,连接又重新回到连接池

    2022年5月9日
    46
  • Linux云服务器挖矿病毒(crypto和pnscan)导致CPU占用100%问题解决方案「建议收藏」

    Linux云服务器挖矿病毒(crypto和pnscan)导致CPU占用100%问题解决方案「建议收藏」木马攻击问题由来阐述我买了三年的阿里云服务器(在阿里云官网买的),已经使用了一年多了,平时拿来搭建网站,有时也拿来学习技术和开发测试,一直使用很稳定。直到近期我服务器上安装了docker并部署了springboot+mysql+nginx项目,就被攻击了。但就在今年的5月14号,我的服务器被木马攻击,然后被拿去挖矿了。我服务器的cpu持续维持在CPU100%.后果是直接导致我网站无法正常请求和响应。而且Linux服务器的root权限被窃取了。黑客在服务器/root/.ssh目录下生成了连root用户

    2022年5月1日
    57

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号