Использовать модель lmfit - функция имеет фрейм данных в качестве аргумента - PullRequest
0 голосов
/ 10 июля 2020

Я хочу использовать lmfit для соответствия моим данным.

Используемая мной функция имеет только один аргумент features. Содержимое features будет другим (как столбцы, так и значения), поэтому я не могу инициализировать параметры.

Я пытался создать фрейм данных как здесь , но не могу используйте метод guess, потому что он предназначен для LorentzianModel, а я просто хочу использовать Model.

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import lmfit
from sklearn.linear_model import LinearRegression


df = {'a': [0, 0.2, 0.3], 'b':[14, 10, 9], 'target':[100, 200, 300]}
df = pd.DataFrame(df)

X = df[['a', 'b']]
y = df[['target']]

model = LinearRegression().fit(X, y)

features = pd.DataFrame({"a": np.array([0, 0.11, 0.36]),
                         "b": np.array([10, 14, 8])})

def eval_custom(features):
    res = model.predict(features)
    return res


x_val = features[["a"]].values

def calling_func(features, x_val):
    pred_custom = eval_custom(features)
    df = pd.DataFrame({'x': np.squeeze(x_val), 'y': np.squeeze(pred_custom)})

    themodel = lmfit.Model(eval_custom)
    params = themodel.guess(df['y'], x=df['x'])
    result = themodel.fit(df['y'], params, x = df['x'])
       
    result.plot_fit()


calling_func(features, x_val)

1 Ответ

0 голосов
/ 10 июля 2020

Функция модели должна принимать независимые переменные и отдельные параметры модели в качестве аргументов. Вы упаковываете все это в один pandas Dataframe, а затем отправляете его. Не делайте этого.

Если вам нужно создать фрейм данных из текущих значений модели, сделайте это внутри своей функции модели.

Также: функция generi c модели делает не имеет работающей функции guess. Используйте model.make_params() и определенно определенно (без исключений, нет, никогда) укажите фактические начальные значения для каждого параметра.

...