Как построить подобранную кривую на категориальном блокпосте в PyPlot? Почему результат отличается от одного графика в Google Sheets? - PullRequest
0 голосов
/ 09 марта 2020

У меня есть следующие данные csv:

Dataset Size,MAPE,MAE,STD MAPE,STD MAE
35000,0.0715392337,23.38300578,0.9078698348,2.80407539
26250,0.06893431034,22.34732326,0.9833948236,1.926517044
17500,0.0756695622,26.0900766,0.6055443674,8.842862631
8750,0.07176532526,23.02646184,0.8284005282,2.190506033
4200,0.08661127364,29.89234607,0.9395831421,7.587818412
2100,0.08072315267,27.20110884,0.03956974712,4.948606892
1050,0.07505202908,27.04025924,0.841966778,4.550482956
700,0.07703248113,26.17923045,0.4468447145,1.523638508
350,0.08695408769,32.35331585,0.7891190087,4.18648457
200,0.09770903032,30.96197823,0.04648972591,3.892800694
170,0.1202382169,41.87828814,0.7257680584,6.70453713
150,0.1960949784,77.20321559,0.5661066006,21.57418682

Из приведенных выше данных я хотел бы создать следующий график, используя matplotlib или аналогичный (seaborn, pandas, et c.):

Example Plot Generated In Google Sheets

from pathlib import Path
from matplotlib import animation
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
from scipy.optimize import curve_fit

nr_datapoints = 10
def exponenial_func(x, a, b, c):
    return a*np.exp(-b*x)+c
def myplot(data_file):
    df = pd.read_csv(data_file)
    print(df.head())

    fig, ax = plt.subplots()

    # Exponential line fit
    popt, pcov = curve_fit(exponenial_func, np.array([float(i) for i in range(len(df['Dataset Size']))]), df['MAPE'], p0=(0, 0.0145, 0.0823))
    xp = np.linspace(0,len(df['Dataset Size']), 100)  
    plt.plot(xp, exponenial_func(xp, *popt), color = 'g')
    # barplote with error bars
    ax.bar([str(s) for s in df['Dataset Size']], df['MAPE'], yerr=df['STD MAPE'])
    plt.title('Accuracy of Model vs. Dataset Size')
    plt.xlabel('Dataset Size')
    plt.ylabel('Mean Absolute Percentage Error')
    fig.tight_layout()
    plt.show()

График, который я получаю, выглядит следующим образом: Graph produced by the above code

Почему Я получаю строку, а не кривую из моего кода, несмотря на подгонку экспоненциальной функции к данным? (Учитывая, что график листов Google делает то же самое, например, подгоняет экспоненциальную кривую к данным)

Ответы [ 2 ]

1 голос
/ 10 марта 2020

Проблема в том, что горизонтальная ось не является линейной. На самом деле это обратный линейный. Поэтому, если вы хотите, чтобы ваше соответствие выглядело как экспоненциальная функция, вам нужно заменить x на 1/x:

def exponenial_func(x, a, b, c):
    return a*np.exp(-b/x)+c

Результат будет следующим: enter image description here

1 голос
/ 10 марта 2020

Поиграл с некоторыми функциями, и я думаю, что могу с некоторой долей уверенности сказать, что экспоненциальная функция Google Sheets имеет форму, близкую к этой:

def sheetey_exponential_function(x, a, b, c):
    return a * b ** (x + c)

enter image description here

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