鱼C论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 48|回复: 4

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

[复制链接]
最佳答案
0 
发表于 5 天前 | 显示全部楼层 |阅读模式

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

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

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
复制代码




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

不好意思,这两天没上鱼C~请问“数据没有先处理好”,那我应该怎么处理数据呢~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
最佳答案
1497 
发表于 昨天 11:44 | 显示全部楼层
teribsandy 发表于 2019-3-19 11:12
不好意思,这两天没上鱼C~请问“数据没有先处理好”,那我应该怎么处理数据呢~

你打印下你最开始的y看看是啥,data三列,特征应该是exam1,exam2, 标签是Class
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
最佳答案
18 
发表于 昨天 13:20 | 显示全部楼层
出现nan可能是学习率问题,学习率过大会导致你收敛的步伐很大,从而跳过局部最小值,极端情况还可能会让cost越来越大。
要么就是你数据没处理好,数据没有归一化,算cost会走很多弯路。

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

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

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

本版积分规则

关闭

小甲鱼强烈推荐上一条 /1 下一条

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号

GMT+8, 2019-3-20 05:38

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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