Я использую BFGS, чтобы минимизировать мою функцию стоимости, оцененную по данным матрицы 5000x400 с известной матрицей вывода 5000x1. Алгоритм, похоже, не сходится. На самом деле, это даже не go за 0 итераций. Я попробовал Nelder-Mead, и это не помогло, так как оно заканчивается итерациями и не сходится.
res= sc.minimize(fun=lrCostFunc.lrCostFunction, x0=initial_theta, args=(X,y,lambdaa),\
jac=lrgradFunc.lrgradFunc,tol=1e-6,options={'disp':True})
Моя функция стоимости выглядит следующим образом:
def lrCostFunction(theta, X, y, lambdaa):
m = y.shape[0] # number of training examples
J = 0
t=np.zeros((len(theta),1))
for i in range(len(theta)):
t[i,0]=theta[i]
A=X@t
h=sigmoid.sigmoid(A)
J=-(((y.T@(np.log(h)))+((1-y).T@(np.log(1-h))))/m)
J=float(J)
for i in range(1,t.shape[0]):
J+=(lambdaa*(t[i,0]**2))/(2*m)
return J;
И функция градиента вот так ...
def lrgradFunc(theta, X, y, lambdaa):
m = y.shape[0] # number of training examples
t=np.zeros((len(theta),1))
for k in range(len(theta)):
t[k,0]=theta[k]
g = [0]*len(theta)
grad=np.zeros((len(theta),1))
A=X@t
h=sigmoid.sigmoid(A)
a=h-y
grad=(X.T@a)/m
for j in range(1,t.shape[0]):
grad[j,0]+=(lambdaa*t[j,0])/m
for i in range(len(g)):
g[i]=grad[i,0]
g=np.array(g)
return g;
В противном случае обе функции работают нормально. Я пробовал несколько вещей, но ничего не работает. Пожалуйста, помогите.