Python: функции оптимизации scipy не работают / дают ошибки измерения - PullRequest
0 голосов
/ 20 декабря 2018

Я внедряю курс Эндрю Нга по машинному обучению на 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!

Есть предложения?

...