Python 函数返回错误值
Python function returning wrong value
我在 python 中有一个函数(梯度下降),return 我有一些值:
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
所以,问题是,每当我使用这个函数时,我 returned 的值都是错误的。我知道他们错了,因为我有可以比较的真实价值。
以下是我使用函数的方式:
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))
它有效,为我提供了正确的值,但我不知道该函数有什么问题,为什么它不起作用。
感谢您的帮助!
在您的梯度函数中,在递增 current_iteration 变量之前有 return 语句。所以它永远不会增加。函数在 return.
处终止
在 return 语句之前添加 current_iteration 增量符,并在 while 循环结束后添加 return 语句。
我在 python 中有一个函数(梯度下降),return 我有一些值:
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
所以,问题是,每当我使用这个函数时,我 returned 的值都是错误的。我知道他们错了,因为我有可以比较的真实价值。
以下是我使用函数的方式:
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))
它有效,为我提供了正确的值,但我不知道该函数有什么问题,为什么它不起作用。
感谢您的帮助!
在您的梯度函数中,在递增 current_iteration 变量之前有 return 语句。所以它永远不会增加。函数在 return.
处终止在 return 语句之前添加 current_iteration 增量符,并在 while 循环结束后添加 return 语句。