Решить фактор с Scipy минимизировать - PullRequest
0 голосов
/ 16 июня 2019

Я пытаюсь решить фактор х, который умножить сумму вектора «Фактор». Сумма вектора «Фактор» должна быть суммой, аналогичной сумме вектора «Базовый». Прежде всего, я прочитал CSV, который выглядит как следующий DataFrame:

enter image description here

Заранее спасибо за помощь.

Ну, я тоже пробовал с минимизацией и отскоком. Может быть, будет лучше использовать scipy.optimize?

import pandas as pd
from scipy.optimize import minimize, optimize
import numpy as np

path='/scipytest.csv'

dffunc=pd.read_csv(path,  decimal=',', delimiter=';') 

BaseSum=np.sum(dffunc['Basic'])
FacSum=np.sum(dffunc['Factor'])

def f(x, FacSum):
    return BaseSum-FacSum*x


con = {'type': 'ineq',
       'fun': lambda BaseSum,FacSum: BaseSum-FacSum,
       'args': (FacSum,)}

x=0

result = minimize(f,(x,FacSum), args=(FacSum,), method='SLSQP', constraints=con)

print(result.x)
print(f(result.x))

повышение ValueError («Цель должна возвращать скаляр»)

ValueError: Целевая функция должна возвращать скаляр

1 Ответ

1 голос
/ 16 июня 2019

Не думаю, что вам обязательно нужно scipy.optimize.minimize.Поскольку вы минимизируете скаляр, вы можете использовать scipy.optimize.minimize_scalar ( docs ).Это можно сделать следующим образом:

from scipy.optimize import minimize_scalar
import numpy as np


# define vecs
basic_vec  = np.array([123, 342, 235, 123,  56, 345, 234, 123, 345,  54, 234]).reshape(11, 1)
factor_vec = np.array([234, 345, 453, 345, 456, 457,  23,  45,  56, 567,   5]).reshape(11, 1)
# define sums
BaseSum    = np.sum(basic_vec)
FacSum     = np.sum(factor_vec)
# define 
f      = lambda x, FacSum: np.abs(BaseSum - FacSum * x)
result = minimize_scalar(f, args   = (FacSum,), bounds = (0, FacSum), method = 'bounded')
# prints
print("x                    = ", result.x)
print("BaseSum - FacSum * x = ", f(result.x, FacSum))

Вывод:

x                    =  0.741461642947231
BaseSum - FacSum * x =  0.004465840431748802

Более того, я даже не уверен, почему вам даже нужно использовать минимизацию, когда вы можете просто сделать:

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