Функция Python, возвращающая неправильное значение - PullRequest
0 голосов
/ 30 ноября 2018

У меня есть функция (градиентный спуск) в Python, которая возвращает мне некоторые значения:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt


def read_data(file):
    df = pd.read_excel(file)
    x_data= np.array(df['X_axis']) 
    y_data = np.array(df['Y_axis']) 

    return x_data,y_data 


x_data ,y_data = read_data('path\file')

alpha= 10**-8

#Auxiliaries Functions
...

здесь есть функция:

def gradient(x_axis,y_axis):

    current_iteration = 0
    iterations_number= 100

    #Initial values
    #I guess that the problem is here. When I print those initial 
    #values,inside the function, they are different from what they should be   


    A1_inicial = y_axis[0] 
    A2_inicial = y_axis[-1] 
    x0_inicial = np.mean(x_axis) 
    dx_inicial = (np.std(x_axis))   


    while current_iteration < iterations_number:
        sum_A1 = 0
        sum_A2 = 0
        sum_dx = 0
        sum_x0 = 0


       for x_values,y_values  in zip(x_axis, y_axis):
            sum_A1 += derivada_A1(A1_inicial,A2_inicial,x0_inicial,dx_inicial,x_values,y_values  )
            sum_A2 += derivada_A2(A1_inicial,A2_inicial,x0_inicial,dx_inicial,x_values,y_values  )
            sum_dx += derivada_dx(A1_inicial,A2_inicial,x0_inicial,dx_inicial,x_values,y_values  )
            sum_x0 += derivada_x0(A1_inicial,A2_inicial,x0_inicial,dx_inicial,x_values,y_values  )



            A1_inicial = A1_inicial - (alpha* sum_A1 )
            A2_inicial = A2_inicial - (alpha* sum_A2 )
            x0_inicial = x0_inicial - (alpha* sum_x0 )
            dx_inicial = dx_inicial - (alpha* sum_dx )



        return A1_inicial,A2_inicial,x0_inicial,dx_inicial
        current_iteration+=1

Итак, проблема в том, что всякий раз, когдаЯ использую эту функцию, мои значения, которые возвращаются, неверны.Я знаю, что они не правы, потому что у меня есть реальные ценности для сравнения.

Вот как я использую функцию:

new_y = []

A1_inicial,A2_inicial,x0_inicial,dx_inicial = gradient(x_axis,y_axis)

for x in x_axis:
    new_y.append(A2_inicial + ((A1_inicial - A2_inicial) /(1+np.exp((x- x0_inicial)/dx_inicial))))

print("A1: {}".format(A1_inicial))
print("A2: {}".format(A2_inicial))
print("X0: {}".format(x0_inicial))
print("DX: {}".format(dx_inicial))

И я знаю, что если я отменю эту функцию, вот так:

current_iteration = 0
iterations_number= 100


A1_inicial = y_axis[0] 
A2_inicial = y_axis[-1] 
x0_inicial = np.mean(x_axis) 
dx_inicial = (np.std(x_axis))   


while current_iteration < iterations_number:
    sum_A1 = 0
    sum_A2 = 0
    sum_dx = 0
    sum_x0 = 0


    for x_values,y_values in zip(x_axis, y_axis):
        sum_A1 += derivada_A1(A1_inicial,A2_inicial,x0_inicial,dx_inicial,x_values,y_values  )
        sum_A2 += derivada_A2(A1_inicial,A2_inicial,x0_inicial,dx_inicial,x_values,y_values  )
        sum_dx += derivada_dx(A1_inicial,A2_inicial,x0_inicial,dx_inicial,x_values,y_values  )
        sum_x0 += derivada_x0(A1_inicial,A2_inicial,x0_inicial,dx_inicial,x_values,y_values  )

    A1_inicial = A1_inicial - (alpha* sum_A1 )
    A2_inicial = A2_inicial - (alpha* sum_A2 )
    x0_inicial = x0_inicial - (alpha* sum_x0 )
    dx_inicial = dx_inicial - (alpha* sum_dx )

И затем:

new_y = []


for x in x_axis:
    new_y.append(A2_inicial + ((A1_inicial - A2_inicial) /(1+np.exp((x- x0_inicial)/dx_inicial))))

print("A1: {}".format(A1_inicial))
print("A2: {}".format(A2_inicial))
print("X0: {}".format(x0_inicial))
print("DX: {}".format(dx_inicial))

Это работает, давая мне правильные значения, но я не знаю, что не так с функцией и почему она не работает.

Спасибо за помощь!

1 Ответ

0 голосов
/ 30 ноября 2018

В вашей функции градиента у вас есть оператор return, прежде чем вы увеличиваете переменную current_iteration.Так что это никогда не увеличивается.Функция завершается в точке возврата.

Добавьте инкремент current_iteration перед оператором return и добавьте оператор return после окончания цикла while.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...