马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
- import numpy as np
- import pandas as pd
- import matplotlib.pyplot as plt
- data=pd.read_csv('ex2data1.txt',header=None,names=['Exam1','Exam2','Class'])
- positive=data[ data.Class.isin(['1']) ]
- negative=data[ data.Class.isin(['0']) ]
- data.insert(0,'Ones',1)
- X=data.iloc[:,0:3]
- y=data.iloc[:,3]
- X=np.array(X.values) #ndarray, (100,3)
- y=np.array(y.values) #ndarray, (100,)
- theta=np.zeros(3) #ndarray, (3,)
- def sigmoid(theta,X):
- z=X@theta
- return 1/(1+np.exp(-z))
- originalhypothesis=sigmoid(theta,X) #ndarray,shape为(100,),初始值中元素值均为0.5
- def cost(theta,X,y):
- hypothesis=sigmoid(theta,X)
- a=y*np.log(hypothesis) + (1-y)*np.log(1-hypothesis) #ndarray (100,) 计算初始成本下,a中每个元素都是-0.6931
- return (-1./len(X))*np.sum(a)
- originalcost= cost(theta,X,y) #0.69314718056, <class 'numpy.float64'> ()
复制代码 上面的代码是数据准备和函数准备
之后我【分别】用梯度下降算法和高级优化算法实现该逻辑回归问题的求解,出现了几个疑问
(1)梯度下降算法用于逻辑回归的求解会报Runtimewarning,以及allcost出现nan值问题;
(2)为什么用梯度下降算法和高级优化算法的得到的最小成本和最终的theta相差这么多,是因为我的梯度下降收敛到局部最小值了吗........那什么时候该用什么样的算法呢。
- '''梯度下降算法好像不是很适合用在逻辑回归的求解里
- 现象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
- 现象2:allcost里迭代记录每3次出现一次nan(not a number)
- 然而我并不知道原因
- '''
- def gradientdescent(X,y,theta,alpha,epochs):
- temp=np.ones(3)
- allcost=np.zeros(epochs)
- for i in range(epochs):
- error=sigmoid(theta,X)-y #ndarray (100,)
- temp=theta-(alpha/len(X))* X.T@error
- theta=temp
- allcost[i]=cost(theta,X,y)
- return theta,allcost
- alpha=0.01
- epochs=1000
- finaltheta,allcost=gradientdescent(X,y,theta,alpha,epochs)
- #print (finaltheta) # finaltheta [-0.76754116 0.35868899 -0.11012487]
- #print (allcost) # allcost[-1]为4.76424858314
复制代码
记录成本时每迭代3次就出现nan
- def gradient(theta,X,y):
- error=sigmoid(theta,X)-y #(100,)
- return (1.0/len(X))*X.T@error #(3,)
- #print (gradient(theta,X,y)) #[ -0.1 -12.00921659 -11.26284221]
- import scipy.optimize as opt
- res=opt.minimize(fun=cost,x0=theta,args=(X,y),method='TNC',jac=gradient)
- print (res)
- #fun: 0.20349770158947456 即最小成本
- #jac: array([9.12848998e-09, 9.69677383e-08, 4.84144623e-07]) 即求得finaltheta前的偏导
- # x: array([-25.16131865, 0.20623159, 0.20147149]) 即finaltheta
复制代码
出现nan可能是学习率问题,学习率过大会导致你收敛的步伐很大,从而跳过局部最小值,极端情况还可能会让cost越来越大。
要么就是你数据没处理好,数据没有归一化,算cost会走很多弯路。
对于所说的高级优化算法,其实只是对数据有优化,不止对数据有预处理,而且对每层算出来的Z,都会进行归一化处理,当然不止这些处理,不过本质上还是用的梯度下降的算法。这些优化算法一般多用于深度网络,回归问题好像没必要这么复杂。
当然我也是乱bb,回归我早就忘了,纯属个人见解。
这一讲里面吴恩达开始讲优化,包括后面的几周课程,会说到数据归一化和Adam之类的优化算法,应该会对你有帮助。
https://www.coursera.org/learn/d ... /normalizing-inputs
|