Я пытаюсь найти оптимальную точку функции для каждой строки фрейма данных, используя метод spicy.optimize.minimize
L-BFGS-B
, я печатаю оптимальную точку для каждой итерации и заметил, что некоторые строки были рассчитаны длянайти оптимальную точку дважды.
from scipy.optimize import minimize
import numpy as np
import pandas as pd
data = pd.DataFrame({'a': [1,2,3,4,5,6], 'b': [7,8,9,10,11,12]})
def func(x, row):
'''
calculate result of function
'''
return (x - row['a'])*(x - row['b'])
def optimize_func(row):
'''
get optimal point
'''
res = minimize(func, x0=0, args=row, bounds=[(-10, 10)], method='L-BFGS-B')
print res.x[0]
row['optimal_x'] = res.x[0]
return row
data = data.apply(optimize_func, axis=1)
Вывод выглядит следующим образом:
4.000000039384161
4.000000039384161
4.99999996369956
5.999999857891461
6.999999889918595
7.99999992894573
8.999999928945726
Вы можете видеть, что первая строка рассчитана для оптимальных точек дважды.
Я применяю функцию minimize
к каждой строке, кто-нибудь может предложить возможную причину этого?Спасибо!
Чтобы сэкономить время на поиск оптимальной точки для уравнения, рассчитанного для каждой строки фрейма данных, я использую multiprocessing
для его ускорения.Однако после использования multiprocessing
оптимизация для каждой строки будет выполняться дважды, ниже приведен пример кода:
from scipy.optimize import minimize
import numpy as np
from multiprocessing import Pool
from contextlib import closing
import pandas as pd
data = pd.DataFrame({'a': [1,2,3,4,5,6], 'b': [7,8,9,10,11,12]})
def func(x, row):
'''
calculate result of function 1
'''
return (x - row['a'])*(x - row['b'])
def optimize_func(row):
res = minimize(func, x0=0, args=row, bounds=[(-10, 10)], method='L-BFGS-B')
print res.x[0]
row['optimal_x'] = res.x[0]
return row
def apply_optimize_func(data):
'''
prepare for multiprocessing
'''
return data.apply(optimize_func, axis=1)
def get_optimize_x(data):
'''
apply multiprocessing
'''
df_parts = np.array_split(data, 20)
with closing(Pool(processes=10)) as pool:
result_parts = pool.map(apply_optimize_func, df_parts)
data = pd.concat(result_parts)
return data
data = get_optimize_x(data)
, чтобы показать, что оптимизация выполняется дважды для каждой строки, я добавил print
утверждение для optimize_func()
и напечатанные оптимальные точки:
4.000000039384161
4.000000039384161
4.99999996369956
4.99999996369956
5.999999857891461
5.999999857891461
6.999999889918595
6.999999889918595
7.99999992894573
7.99999992894573
8.999999928945726
8.999999928945726
Как вы можете видеть, каждая точка генерируется дважды, мне интересно, почему это происходит?Спасибо!