There are many performance improvements to be had before changing the algorithm. In particular, you want to “capture” the variables used in the optimization inside a let
block.
Also, never do df.z
in performant code, since DataFrame
s are type-unstable. Always work on the vector directly.
julia> z = df.z; x = df.x; y = df.y;
julia> g = let x = x, y = y, z = z
β -> begin
x₀ = β[3]; y₀ = β[4]
ẑ = β[1]*(x .- x₀).^2 + β[2]*(y .- y₀).^2
return sum((z - ẑ).^2)
end
end;