我正在Python上执行Andrew Ng的机器学习课程,但是我被卡住了,因为scipy的优化功能使我无法工作/给我尺寸错误,这给我带来了麻烦
目标是找到成本函数(将theta (dimension (1,401))
,X (dimension (5000,401))
和y (dimension (5000,1))
作为输入的标量函数)的最小值。我已经定义了这样的成本函数及其梯度wrt参数。当运行其中一个优化函数(我尝试过fmin_tnc
,minimize
,Nelder-Mead
等都没有用)时,它们运行了很长时间,或者一直给我报错,说该数组尺寸错误,或者他们发现被0除以...我无法发现的错误。
最奇怪的是,这个问题首先在我进行逻辑回归练习2时突然出现,然后神奇地消失了,而我却没有做任何改变。现在,实现多分类逻辑回归,它再次出现,即使我确实复制并粘贴了练习2的代码也无法解决!
代码如下:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy.io import loadmat
import scipy.misc
import matplotlib.cm as cm
from scipy.optimize import minimize,fmin_tnc
import random
def sigmoid(z):
return 1/(1+np.exp(-z))
def J(theta,X,y):
theta_t=np.transpose(theta)
prod=np.matmul(X,theta_t)
sigm=sigmoid(prod)
vec=y*np.log(sigm)+(1-y)*np.log(1-sigm)
return -np.sum(vec)/len(y)
def grad(theta,X,y):
theta_t=np.transpose(theta)
prod=np.matmul(X,theta_t)
sigm=sigmoid(prod)
one=sigm-y
return np.matmul(np.transpose(one),X)/len(y)
data=loadmat('/home/marco/Desktop/MLang/mlex3/ex3/ex3data1.mat')
X,y = data['X'],data['y']
X=np.column_stack((np.ones(len(X[:,0])),X))
initial_theta=np.zeros((1,len(X[0,:])))
res=fmin_tnc(func=J, x0=initial_theta.flatten(), args=(X,y.flatten()), fprime=grad)
theta_opt=res[0]
它不会返回使函数最小化的theta值,而是说:
/home/marco/anaconda3/lib/python3.6/site-packages ipykernel_launcher.py:8: RuntimeWarning: divide by zero encountered in log
我不知道这种零除发生在哪里,因为除了len(y)
(即5000
的除法和sigmoid
函数(1/(1+exp(-z))
,永远不能成为0
!
有什么建议吗?