Я внедряю курс Эндрю Нга по машинному обучению на Python, но я застрял, потому что функции оптимизации scipy продолжают доставлять мне неприятности из-за того, что я не работаю / не выдаю ошибки измерения
Цель - найти минимумфункции стоимости (скалярная функция, которая принимает theta (dimension (1,401))
, X (dimension (5000,401))
и y (dimension (5000,1))
в качестве входных данных).Я определил такую функцию стоимости и ее градиент по параметрам.При запуске одной из функций оптимизации (я пробовал 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_opt, оно говорит:
/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
!
Есть предложения?