scipy.optimize.minimize выполняется несколько раз в некоторых строках при применении к фрейму данных Pandas с или без многопроцессорной обработки - PullRequest
0 голосов
/ 26 февраля 2019

Я пытаюсь найти оптимальную точку функции для каждой строки фрейма данных, используя метод 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

Как вы можете видеть, каждая точка генерируется дважды, мне интересно, почему это происходит?Спасибо!

...