Установите небольшой DataFrame с простой функцией - PullRequest
0 голосов
/ 30 апреля 2020

У меня есть набор из множества Dataframes со следующей формой:

dat = pd.DataFrame({'Y':[0.0455,0.079,0.059,0.144],'X':[0.055,0.110,0.165,0.220]})

`dat
Out[14]: 
        Y      X
    0  0.0455  0.055
    1  0.0790  0.110
    2  0.0590  0.165
    3  0.1440  0.220

Я пытаюсь уместить эти данные с помощью функции: Y = kX ** m Мой ожидаемый результат - получить параметры 'k' и 'm'

Кажется, что это не сложная работа, но я нахожу только некоторые примеры, использующие scipy.optimize.curve_fit, которые требуют несколько раундов моделирования, чтобы соответствовать данным, и я думаю, что это слишком сложно только для нескольких чисел. Некоторые идеи?

КЛЮЧ: Используя коммерческое программное обеспечение, я уже знаю, что k = -0,3176 м = 0,8935

Заранее спасибо

Ответы [ 2 ]

1 голос
/ 30 апреля 2020

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

import pandas as pd
from scipy.optimize import curve_fit

def func(x, k, m):
    return k * (x**m)

dat = pd.DataFrame({'Y': [0.0455, 0.079, 0.059, 0.144], 'X': [0.055, 0.110, 0.165, 0.220]})

popt, pcov = curve_fit(func, dat.X.values, dat.Y.values)
print('k:', popt[0])
print('m:', popt[1])
k: 0.4813840693004318
m: 0.8935556114206501
0 голосов
/ 30 апреля 2020

Вы можете линеаризовать ваши данные / модель и использовать наименьшие квадраты:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

dat = pd.DataFrame({'Y':[0.0455,0.079,0.059,0.144],'X':[0.055,0.110,0.165,0.220]})

def func(x, y):
    Y = np.log(y)
    X = np.log(x)

    M = np.array((np.ones(len(X)), X)).T

    lnk, m = np.linalg.solve(np.dot(M.T, M), np.dot(M.T, Y))

    return np.exp(lnk), m 


x = dat['X'] 
y = dat['Y']

k, m = func(x, y)

print('k: ', k)
print('m: ', m)

k:  0.2922891128901261
m:  0.6501306234660938
...