GSoC 2014: Standard Extreme Learning Machines

Finished implementing the standard extreme learning machines (ELMs). I am getting the following results with 550 hidden neurons against the digits datasets,

Training accuracy using the logistic activation function: 0.999444
Training accuracy using the tanh activation function: 1.000000

Fortunately, this algorithm is much easier to implement and debug than multi-layer perceptron :).
I will push a test file soon.

@ogrisel , @larsmans
There is a mis-understanding on the role of the `warm_start` parameter for scikit-learn models here.

`ELMRegressor(warm_start=True).fit(X_1).fit(X_2)` should not be the same as `ELMRegressor(warm_start=False).partial_fit(X_1).partial_fit(X_2)`, otherwise there would be no point in having a `partial_fit` method.

- `ELMRegressor(warm_start=True).fit(X_1, y_1).fit(X_2, y_2)` means: fit a first model on `(X_1, y_1)` and then reuse that solution as a starting point to fit a model on `(X_2, y_2)`  until convergence as measured on `(X_2, y_2)` only. `warm_start=True` is useful speedup convergence by starting the optimizer from a better position, not to do incremental / sequential learning.

- in other terms, `ELMRegressor(warm_start=True).fit(X_1, y_1).fit(X_2, y_2)` should yield the same solution as `ELMRegressor(warm_start=False).fit(X_2, y_2)`, just possibly faster (as ELM models have a unique global optimum when `random_state` is fixed).

- `ELMRegressor().partial_fit(X_1, y_1).partial_fit(X_2, y_2)` should yield the same results as calling: `ELMRegressor().fit(np.vstack([X_1, X_2]), np.concatenate([y_1, y_2]))`. `partial_fit` is only useful for out-of-core learning in chunks of data when the full training data (and / or it's internal transformed representation) would not fit in memory.