[New Feature] Fastfood

Implementation of the Fastfood algorithm by @felixmaximilian and @esc
 
We have been working on this code for quite some time now and we think that it is mostly ready for some public review. There may still be a few wrinkles to iron out but in general the code is in decent shape.

For details of the algorithm, see the documentation at:

https://github.com/esc/scikit-learn/blob/fastfood/sklearn/kernel_approximation.py#L503

Also check out the example usage:

https://github.com/esc/scikit-learn/blob/fastfood/examples/kernel_approximation/plot_digits_classification_fastfood.py

And the performance evaluation at:

https://github.com/esc/scikit-learn/blob/fastfood/examples/kernel_approximation/rks_vs_fastfood.py

To minimize dependencies we included an cython in-place implementation of the Fast Hadamard Transform:

https://github.com/esc/scikit-learn/blob/fastfood/sklearn/utils/cyfht.pyx

For ease of merging, the branch has been rebased against current master at the time of writing, prior to the pull-request.
> For example there are many automated tests that are run on subclasses of
BaseEstimator which caught quite a few errors on our implementation.

I like the idea of scikit-learn providing a way to use its common tests in
external packages!

On 18 September 2014 00:05, Valentin Haenel <notifications@github.com>
wrote:

>  In sklearn/kernel_approximation.py:
>
> > +    """
> > +
> > +    def __init__(self,
> > +                 sigma=np.sqrt(1/2),
> > +                 n_components=100,
> > +                 tradeoff_mem_accuracy='accuracy',
> > +                 random_state=None):
> > +        self.sigma = sigma
> > +        self.n_components = n_components
> > +        self.random_state = random_state
> > +        self.rng = check_random_state(self.random_state)
> > +        # map to 2*n_components features or to n_components features with less
> > +        # accuracy
> > +        self.tradeoff_mem_accuracy = \
> > +            tradeoff_mem_accuracy
> > +
>
> I this @GaelVaroquaux <https://github.com/GaelVaroquaux> doesn't like
> staticmethod in general.
>
> For me it is a question of style, I like to think that staticmethod is a
> good way to decouple certain functions that are simple and have only an in-
> and output from the state of the instance, aka. self. In the interest of
> consistency we could make them instance methods if you feel strongly about
> it.
>
> —
> Reply to this email directly or view it on GitHub
> <https://github.com/scikit-learn/scikit-learn/pull/3665/files#r17665279>.
>