In-built plotting methods

Hey @ascillitoe , I have formed the function around the method you provided, this is the notebook:

Thanks a lot for the explanation about the topic.

Nice work! I just noticed I should have probably taken the absolute values of the coefficients when sorting to find the largest ones (as we want largest values not the most positive), so the plots=... line becomes plots = (-np.abs(coeffs)).argsort()[:nplot]. After that, it would be great if you could add this into a PR!

We like to keep all the plotting functions in, so you could define a plot_regpath() method there. This could then be called by a wrapper function elastic_net().plot_regpath() defined in (i.e. a method belonging to the elastic_net solver class). So the final use case would be:

mypoly = eq.Poly(parameters=myparam, basis=mybasis, method='elastic-net', 
            'sample-points':X, 'sample-outputs':y})

Oh, okay I will make the changes and add it to the solver file

Hey @ascillitoe , I was working on creating the wrapper function, I had a doubt that if we add this in the , what parameters will we be taking as input because I think we would need to change the implementation of the function a little, because defining the function in raises an error that elastic_net object has no attribute solver.

The elastic_net subclass is actually stored as an attribute of the Poly class (when method='elastic-net'), so Poly.solver() will return an elastic_net object in this case. i.e. we wouldn’t expect the solver itself (elastic_net) to have a solver attribute.

If you can share your code in a branch on your fork I can take a look?

Sure, I will provide the link ASAP

Hey @ascillitoe , sorry for the late reply,
This is the link the github file containing the code(line 1006):

What I am thinking that instead of defining the function in, shouldn’t we define it in

Since this plot_regpath method is specifc to the elastic_net subclass only, I think it makes more sense to keep it as an attribute of that class. Otherwise we’d have to add code in to deal with occasions when the user calls Poly.plot_regpath() despite having selected a different solver such as method='least-squares'.

It looks like the issue is just that you are referencing the Polynomial within plot_regpath() in solver,py, but in we call plot_regpath(self), i.e. we’re passing in the elastic_net solver object. Hopefully a fix will be to change lines 288 and 304-309 in to:

def plot_regpath(Solver,nplot=None,save=False,show=True,return_figure=False):
    lamdas = Solver.lambdas
    x_path = Solver.xpath
    IC = Solver.ic
    IC_std = Solver.ic_std
    idx = Solver.opt_idx
    elements = Polynomial.basis.elements

The elements = ... bit is a little tricky, as this requires Polynomial.basis.elements which aren’t stored within the elastic_net solver. I have an idea for this, but for now I reckon its best to remove the elements bit, and for the labels simply do label = 'j = %d' %j i.e. just label the coefficients by the column number for now.

I was thinking that in we are already using loops to check the solver used, hence we can call the method there, also in this we can call the basis.elements too.
I will try this method and send the code asap.

Hey @ascillitoe , I tried running the code but it is still showing an error, I also tried giving super().method as a parameter for the function in but its still not working.

Its tricky for me to see what’s going on without looking at the entire codebase. I’ve just created a new branch called feature_plotting. Would you be able to commit what you’ve done and do a PR to this new branch please? Then I can take a look and try running it.

By the way, I think feature_plotting is one commit ahead of you. I’m hoping there will be no conflicts but let me know if you have any issues merging.

Yeah sure, I will upload my files on the repository

I will check the code and update you, thanks

This is the colab notebook for the current method: