鱼C论坛

 找回密码
 立即注册
查看: 1801|回复: 4

[已解决]吴恩达逻辑回归作业用梯度下降算法和高级优化算法实现

[复制链接]
发表于 2019-3-15 11:40:29 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. import numpy as np
  2. import pandas as pd
  3. import matplotlib.pyplot as plt

  4. data=pd.read_csv('ex2data1.txt',header=None,names=['Exam1','Exam2','Class'])

  5. positive=data[ data.Class.isin(['1']) ]
  6. negative=data[ data.Class.isin(['0']) ]

  7. data.insert(0,'Ones',1)
  8. X=data.iloc[:,0:3]
  9. y=data.iloc[:,3]

  10. X=np.array(X.values) #ndarray, (100,3)
  11. y=np.array(y.values) #ndarray, (100,)  
  12. theta=np.zeros(3) #ndarray, (3,)

  13. def sigmoid(theta,X):
  14.     z=X@theta
  15.     return 1/(1+np.exp(-z))

  16. originalhypothesis=sigmoid(theta,X) #ndarray,shape为(100,),初始值中元素值均为0.5

  17. def cost(theta,X,y):
  18.     hypothesis=sigmoid(theta,X)
  19.     a=y*np.log(hypothesis) + (1-y)*np.log(1-hypothesis) #ndarray (100,) 计算初始成本下,a中每个元素都是-0.6931
  20.     return (-1./len(X))*np.sum(a)  

  21. originalcost= cost(theta,X,y) #0.69314718056, <class 'numpy.float64'> ()
复制代码
上面的代码是数据准备和函数准备 屏幕快照 2019-03-15 上午11.31.34.png 屏幕快照 2019-03-15 上午11.33.19.png


之后我【分别】用梯度下降算法和高级优化算法实现该逻辑回归问题的求解,出现了几个疑问

(1)梯度下降算法用于逻辑回归的求解会报Runtimewarning,以及allcost出现nan值问题;

(2)为什么用梯度下降算法和高级优化算法的得到的最小成本和最终的theta相差这么多,是因为我的梯度下降收敛到局部最小值了吗........那什么时候该用什么样的算法呢。


  1. '''梯度下降算法好像不是很适合用在逻辑回归的求解里
  2. 现象1:执行cost函数中的a=y*np.log(hypothesis) + (1-y)*np.log(1-hypothesis)时报RuntimeWarning,错误包括divide by zero encountered in log, invalid value encountered in multiply
  3. 现象2:allcost里迭代记录每3次出现一次nan(not a number)
  4. 然而我并不知道原因
  5. '''
  6. def gradientdescent(X,y,theta,alpha,epochs):
  7.     temp=np.ones(3)
  8.     allcost=np.zeros(epochs)
  9.     for i in range(epochs):
  10.         error=sigmoid(theta,X)-y #ndarray (100,)  
  11.         temp=theta-(alpha/len(X))* X.T@error
  12.         theta=temp
  13.         allcost[i]=cost(theta,X,y)
  14.     return theta,allcost

  15. alpha=0.01
  16. epochs=1000
  17. finaltheta,allcost=gradientdescent(X,y,theta,alpha,epochs)
  18. #print (finaltheta)  # finaltheta [-0.76754116  0.35868899 -0.11012487]
  19. #print (allcost)   # allcost[-1]为4.76424858314
复制代码
屏幕快照 2019-03-15 上午11.35.04.png

记录成本时每迭代3次就出现nan

记录成本时每迭代3次就出现nan

  1. def gradient(theta,X,y):
  2.     error=sigmoid(theta,X)-y #(100,)
  3.     return (1.0/len(X))*X.T@error #(3,)
  4. #print (gradient(theta,X,y)) #[ -0.1  -12.00921659  -11.26284221]

  5. import scipy.optimize as opt

  6. res=opt.minimize(fun=cost,x0=theta,args=(X,y),method='TNC',jac=gradient)
  7. print (res)
  8. #fun: 0.20349770158947456 即最小成本
  9. #jac: array([9.12848998e-09, 9.69677383e-08, 4.84144623e-07]) 即求得finaltheta前的偏导
  10. # x: array([-25.16131865,   0.20623159,   0.20147149]) 即finaltheta
复制代码




最佳答案
2019-3-19 13:20:59
出现nan可能是学习率问题,学习率过大会导致你收敛的步伐很大,从而跳过局部最小值,极端情况还可能会让cost越来越大。
要么就是你数据没处理好,数据没有归一化,算cost会走很多弯路。

对于所说的高级优化算法,其实只是对数据有优化,不止对数据有预处理,而且对每层算出来的Z,都会进行归一化处理,当然不止这些处理,不过本质上还是用的梯度下降的算法。这些优化算法一般多用于深度网络,回归问题好像没必要这么复杂。

当然我也是乱bb,回归我早就忘了,纯属个人见解。

这一讲里面吴恩达开始讲优化,包括后面的几周课程,会说到数据归一化和Adam之类的优化算法,应该会对你有帮助。
https://www.coursera.org/learn/d ... /normalizing-inputs
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-3-15 12:31:37 | 显示全部楼层
warning只是警告,一般可以先无视,nan是你数据没有先处理好
代码完全没看,建议使用机器学习库实现,SGD,adam等梯度下降方法处理有可能跳出局部最小点
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-3-19 11:12:10 | 显示全部楼层
塔利班 发表于 2019-3-15 12:31
warning只是警告,一般可以先无视,nan是你数据没有先处理好
代码完全没看,建议使用机器学习库实现,SGD, ...

不好意思,这两天没上鱼C~请问“数据没有先处理好”,那我应该怎么处理数据呢~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-19 11:44:23 | 显示全部楼层
teribsandy 发表于 2019-3-19 11:12
不好意思,这两天没上鱼C~请问“数据没有先处理好”,那我应该怎么处理数据呢~

你打印下你最开始的y看看是啥,data三列,特征应该是exam1,exam2, 标签是Class
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-19 13:20:59 | 显示全部楼层    本楼为最佳答案   
出现nan可能是学习率问题,学习率过大会导致你收敛的步伐很大,从而跳过局部最小值,极端情况还可能会让cost越来越大。
要么就是你数据没处理好,数据没有归一化,算cost会走很多弯路。

对于所说的高级优化算法,其实只是对数据有优化,不止对数据有预处理,而且对每层算出来的Z,都会进行归一化处理,当然不止这些处理,不过本质上还是用的梯度下降的算法。这些优化算法一般多用于深度网络,回归问题好像没必要这么复杂。

当然我也是乱bb,回归我早就忘了,纯属个人见解。

这一讲里面吴恩达开始讲优化,包括后面的几周课程,会说到数据归一化和Adam之类的优化算法,应该会对你有帮助。
https://www.coursera.org/learn/d ... /normalizing-inputs
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-27 00:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表