Julia: How to find best fit curve / equation when I have a plot?

Viewed 1523

Julia: How to find best fit curve / equation when I have a plot? I have a plot which I made with map but I need to find a quadratic equation that fits this?

2 Answers

As said in comments, having a plot is not really relevant here; only the data itself is. You can use packages such as GLM to build (Generalized) Linear Models of your data, and possibly plot them or use them to predict new outcomes.

Here is a simple example. Let's first create sample data:

using Plots
using DataFrames

df = DataFrame(x = sort(rand(100)))
df.y = 1 .+ 2*df.x .+ 3*df.x.^2 .+ 0.1*randn(100)  # y = 1 + 2x + 3x² + noise
scatter(df.x, df.y, label="data")

and build a 2nd order linear model out of it:

using GLM
model = lm(@formula(y ~ 1 + x + x^2), df)  # Note how the formula looks exactly like the model you want to build
plot!(df.x, predict(model, df), label="model")

you should get something like the following:

julia> model
StatsModels.TableRegressionModel{LinearModel{GLM.LmResp{Array{Float64,1}},GLM.DensePredChol{Float64,LinearAlgebra.Cholesky{Float64,Array{Float64,2}}}},Array{Float64,2}}

y ~ 1 + x + :(x ^ 2)

Coefficients:
────────────────────────────────────────────────────────────────────────
               Coef.  Std. Error       t  Pr(>|t|)  Lower 95%  Upper 95%
────────────────────────────────────────────────────────────────────────
(Intercept)  1.04201   0.0073252  142.25    <1e-99    1.02747    1.05655
x            2.04349   0.0332272   61.50    <1e-78    1.97754    2.10944
x ^ 2        2.95854   0.0321212   92.11    <1e-95    2.89478    3.02229
────────────────────────────────────────────────────────────────────────

plot

The Polynomials package is a bit less intimidating than GLM. You can use the fit function in that package to obtain a Polynomial of best fit for any provided order (degree). Given some arbitrary (x,y) data, you can create and plot the polynomial of best fit as below.

julia> using Polynomials

julia> x=1:10;

julia> y=rand(10);

julia> quadfit=fit(x,y,2)
Polynomial(-0.06970526100724156 + 0.1638766946706202*x -0.008058423435867207*x^2)

julia> using Plots

julia> plot(x,y,label="Data")

julia> plot!(quadfit,x[1],x[end],label="Quadratic Fit")

julia> savefig("Data and Curve Fit.png")

Data and Curve Fit

Related