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

内容提要

上2篇博客写的内容:
1,加载数据
2,整理数据
3,数据归一
4,初始化权重w和b
所有的已知量都知道了,接下来就要开始写梯度了,写出来这个logistic模型的算法。现在所有的数学公式都可以用现在已知的量表达出来了。

1.数据集标签y的格式和内容是什么?

先看看数据集标签y的格式和内容是什么?
之前说的都是数据集的变量x,没有写y的格式和内容,为了便于理解,把这个y的内容也补上。
在这里插入图片描述
加上一个图片,如上图所示,加载了数据后,返回接收了x和y,这一次我们打印出来y的各个属性看看y的格式和内容。
可以看出y是一个1行50列(测试样本有50个数据)的一个行向量,内容不是0就是1,也就是cat或者no-cat,他的类型也是一个ndarray。
————————————————————————
这样就接到上一篇中的内容了,
上一篇结尾的时候写到:
y y y= W W W. T T TX X X X+ b b b
这个公式,现在看看就能理解为什么这个测试集的y标签是1行50列了。W的转置乘以X,得到的是一个值,X的每一列是一个图片的信息,有n列,这样这个公式向量化的话就会得到y是一个1行n列的一个行向量。(这样说脑海里面能不能有画面感。
在这里插入图片描述
画个图片,如上图这样,这也是线性代数里面的矩阵的运算的知识(我早就说过numpy就是线性代数)
显然这里得出的结果和y不一样,因为还要进行sigmoid()函数的转换转换成0和1.

2.计算成本函数和梯度函数(W,b,x,y)

回到百度这本书《飞桨PaddlePaddle深度学习实战》,这本书中说到典型的深度学习的计算过程包含3个过程,正向传播过程,反向传播过程,梯度下降过程。
现在定义一个函数来计算成本和梯度,这个函数的名称为正向传播和反向传播函数:

J ( w , b ) = 1 m ∑ L ( y ˇ , i y i ) J(w,b)= \frac{1} {m} \sum L(\check{y} \overset{i}, y^i ) J(w,b)=m1L(yˇ,iyi)
这个公式我们知道L是单个样本的损失函数
把L的公式带入进去
J ( w , b ) = 1 m ∑ L ( y ˇ , i y i ) = − 1 m ∑ [ y i l o g y ˇ ( i ) + ( 1 − y ( i ) ) l o g ( 1 − y ˇ ( i ) ) ] J(w,b)= \frac{1} {m} \sum L(\check{y} \overset{i}, y^i )=- \frac{1} {m} \sum [y^ilog\check{y}^{(i)}+(1-y^{(i)})log(1-\check{y}^{(i)})] J(w,b)=m1L(yˇ,iyi)=m1[yilogyˇ(i)+(1y(i))log(1yˇ(i))]
这个就是这个损失函数,i是样本数量,一对(w,b,一个样本数据x)可以算出一个损失值,i个样本数据X,就可以算出i个损失值,假设有m个样本数据,就是m个损失值,m个损失值相加求平均就是成本值

总结

下面的步骤就是这个过程:

第一:对J成本函数求偏导得dW,db,
第二:初始化函数得到的w,b通过下面的公式算新的w,b
w = w − a d w w=w-adw w=wadw
b = b − a d b b=b-adb b=badb
第三:新得的w,b计算出新的成本值cost
第四:通过下面的梯度公式更新w,b值,
w = w − a d w w=w-adw w=wadw
b = b − a d b b=b-adb b=badb
第五:更新的w,b计算出新的成本值



这个过程就是这样了,按照这个logistic模型来说这个cost值是收敛的,会慢慢的变小,每更新100次,我们输出一下cost的值,看看cost是多大,最后也是用matplotlib画出图看看这个变化。

公式知道了,现在就要求梯度了
d w = 1 m X d Z T dw= \frac{1} {m} XdZ^T dw=m1XdZT
d b = 1 m ∑ d z ( i ) = 1 m n u m p y . s u m ( d Z ) db= \frac{1} {m} \sum dz^{(i)}=\frac{1}{m} numpy.sum(dZ) db=m1dz(i)=m1numpy.sum(dZ)

解释一下这里的z,z是线性变换后的预测值,之前用y预测表示,现在用z表示,让后以z为变量,做非线性变换
A = s i g m o i d ( Z ) A=sigmoid(Z) A=sigmoidZ
然后a这个函数对z求导
可以算出dz=A-Y
(具体的数学变换过程不写了)
在下面插入代码看看:

#propagate是传播的意思
def forward_and_backard_propagate(W,b,X,Y):
	"""
	计算成本cost和梯度grads
		args:
			W:权重,(num_px*num_px*3,1)维的numpy数组,第一组我们在初始化参数里面给猜出
			b:偏置bias,标量,在初始化参数里面给猜出
			X:数据,形状为(num_px*num_px*3,number of examples),在加载数据的时候做了转置,X的每一列是一个图片的信息
			Y:数据,形状为(1,number of examples)维的numpy数组
		return:
			cost:逻辑回归的损失函数
			dW:cost的对参数W的梯度,形状和参数W一样
			db:cost对参数b的梯度,形状和参数b一样
	"""
	#通过上面的描述,第一个应该是m的大小
	#这里应该是shape[1],因为X这个矩阵我们开始时候转置了,一列是一个图片,有m列,shape1是返回的是列的数量
	#如果用换一种表示比如W.shape[0],因为W是1列m行,w转置后和x乘
	m=X.shape[1]
	#正向传播计算成本函数
	Z=np.dot(W.T,X)+b#线性变换,得出预测值Z
	A=sigmoid(Z)#非线性变换,映射到0-1
	#对Z求偏导
	dZ=A-Y
	cost=np.sum(-(Y*np.log(A)+(1-Y)*np.log(1-A)))/m
	#反向传播
	dW=np.dot(X,dz.T)/m
	db=np.sum(dz)/m
	cost=np.squeeze(cost)
	grads={
			"dW":dW,
			"db":db
		}
	return grads,cost
	

上面的程序可以看出就是我总结的整个过程
先写到这里,下一篇写w和b梯度后更新:
w = w − a d w w=w-adw w=wadw
b = b − a d b b=b-adb b=badb

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

yuejich

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

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

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

打赏作者

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

抵扣说明:

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

余额充值