利用numpy实现Logistic回归模型——总结(4)

内容提要

上一篇写道了深度学习的计算过程包括3个过程

第一个过程:正向传播-forward propagation

第二个过程:反向传播-backward propagation

第三个过程:梯度下降

1.参数更新函数

上一篇定义了一个计算成本和梯度的正向传播和反向传播函数,计算出了cost和梯度dw,db
有了w,b和dw,db后需要更新一下w,b,继续算成本值
这一篇总结一下一次参数更新函数
w = w − a d w (公式1) w=w-adw \tag{公式1} w=wadw(1)
b = b − a d b (公式2) b=b-adb\tag{公式2} b=badb(2)

def update_parameters(X,Y,W,b,learning_rate):
	"""
	args: 传入的值也是X,Y,W,b,learning_rate
	return:W,b
	这里的learning_rate是需要自己设定的值,
	"""
	#上面写的公式1和公式2,要用到dw和db,这就要引用 上一篇里面的正向传播和反向传播方法,他的返回值是grad和cost
	grads,cost=forward_and_backward_propagate(X,Y,W,b)
	dW=grads["dW"]
	db=grads["db"]
	W=W-learning_rate*dW
	b=b-learning_rate*db
	return W,b,cost	

上面的这段代码就更新了一次W,b,不断的执行这一个代码就会算出一个cost值,更新一遍权重和偏置
所有logistic回归模型要使用的方法到这里基本上全部写出来了,(想必大家也都理解了吧,哈哈)
接下来就是写一个训练函数了

2.训练函数train

上面说到,不断的调用更新参数函数就能起到训练的效果,那么问题来了,怎么样不断的调用更新参数函数呢?

2.1怎么样调用“更新参数函数”呢?

这个很简单了,就写一个循环嘛,给定一个次数,做一个for循环,循环多少次就是训练多少次,看一下成本值cost,并拿出一个测试集里面的图片检验一下这个权重w和偏置b的正确与否,这样不就行了吗。(哈哈,太聪明了 ,就是这样)
那么这个次数我们定义为迭代次数iteration_nums,还有一个需要注意,我们每一次迭代就会产生一个cost值,我们这里建一个数组costs,每100次迭代就把cost值放进costs数组中,这样可以用作后面的matplotlib画图分析

def train(X,Y,W,b,iteration_nums,learning_rate):
	"""
	args:
	return:W,b
	"""
	costs=[]#定义一个数组保存cost值
	#比如这里让iteration_nums等于1000,每100次输出一次,直到运行1000次更新函数才停止
	for i in range(iteration_nums):
		W,b,cost=update_parameters(X,Y,W,b,learning_rate)
		#判断是否执行了100次
		if i%100==0:
			costs.append(cost)
			#输出一下现在的次数和cost值
			print("Iteration %d,cost %f" %(i,cost))
	#返回W,b,定义一个字典格式的参数变量
	params={
	"W":W,
	"b":b
	}
	return params,costs	

认真看完上面的代码就能明白了,这个训练过程就完成了,训练完成后给出了训练后的权重和成本值
接下来就计算一下这个训练后的结果Y,看看对于训练样本集来说这个Y和真实的Y能差多少。

3.计算预测函数

迭代了这么多次计算出了权重W和偏置b,那么把X的数据代入进去,计算出来预测值到底准确吗?
先不说测试集,就是训练集训练出来的结果是不是准确的呢?准确率又是多少呢?
这两个问题就来了,那就把X值代入,看看真实值和预测值有什么区别。
那这样用程序怎么写呢?
首先看X有多少数据X.shape[1],
还是那几个数学公式,我在这里再写一遍
Z = n p . d o t ( W . T × X ) + b (线性变换公式) Z=np.dot(W.T\times X)+b \tag{线性变换公式} Z=np.dot(W.T×X)+b(线)
A = s i g m o i d ( Z ) (非线性变换公式) A=sigmoid(Z) \tag{非线性变换公式} A=sigmoid(Z)(线)

def predict_image(W,b,X)
	"""
	args:传入值是训练后的W,b,训练集的参数X,
	这里没有Y,是因为我们要预测Y,
	return:Y
	"""
	#定义一个数组存放预测值
	predictions=[]
	#首先W是data_dim行1列的数组
	
	data_dim=X.shape[0]
	#其次是数据集X的数量m
	m=X.shape[1]
	#给W重新组织一下格式
	W=W.reshape(data_dim,1)
	#现在可以用上面的两个公式:线性变换公式和非线性变换公式了,算出预测结果A
	A=sigmoid(np.dot(W.T,X)+b)
	#循环看预测值是多少并存到predictions里面
	for i in range(m):
		if A[0,i]>=0.5:#如果预测值大于等于0.5就说明是猫,预测值数组里面就加一个1
			predictions.append(1)
		elif A[0,i]<0.5:#如果是预测值小于0.5,就不是猫
			predictions.append(0)
	#最后返回数组predictions
	return predictions

里面的sigmoid()函数我们之前定义过

4.现在出来了预测值,那么准确率是多少呢?

现在是知道了预测值predictions和真实值Y,那么怎么看看他预测的准确率是多少呢?
是百分之百,还是百分之90,我们用这个logistic回归模型取预测有价值吗?
这一系列问题就出来了,那么下面就统计一下这个预测的准确率
定义一个calc_accuracy计算准确率的函数
先走一下思路
第一:现在有了predictions和Y,这两个列表,每一个列表都是1行m列
第二:如果predictions的第i列和Y的第i列都是0或者都是1,那么就是预测对的,对于预测对的相减肯定为0
那么现在就看看prediction里面有多少是预测对的

def calc_accuracy(predictions,Y):
	#第一步处理一下传入的参数Y
	Y=np.squeeze(Y)#可以取查一下squeeze这个方法是干嘛用的,Y不是X,我们开始从hdf5里面弄出来并没有处理这是处理一下
	#定义一个变量right准确的个数初始化为0
	right=0
	#判断预测值是否等于真实值,如果相等就让right加1
	for i in range(len(predictions)):
		if predictions[i]==Y[i]:
			right+=1
	#这样一个循环下来就算出了有多少个样本预测正确了
	accuracy=(right/float(len(predictions)))*100
	return accuracy#返回准确率

到此除了用matplotlib画出cost的曲线图没有定义,所有要用到的方法都定义出来了。
下一篇总结一下main()函数,让整个过程运行起来
(哈哈,加油)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

yuejich

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

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

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

打赏作者

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

抵扣说明:

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

余额充值