
.. DO NOT EDIT.
.. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY.
.. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE:
.. "auto_examples/linear_model/plot_elastic_net_precomputed_gram_matrix_with_weighted_samples.py"
.. LINE NUMBERS ARE GIVEN BELOW.

.. only:: html

    .. note::
        :class: sphx-glr-download-link-note

        Click :ref:`here <sphx_glr_download_auto_examples_linear_model_plot_elastic_net_precomputed_gram_matrix_with_weighted_samples.py>`
        to download the full example code

.. rst-class:: sphx-glr-example-title

.. _sphx_glr_auto_examples_linear_model_plot_elastic_net_precomputed_gram_matrix_with_weighted_samples.py:


==========================================================================
Fitting an Elastic Net with a precomputed Gram Matrix and Weighted Samples
==========================================================================

The following example shows how to precompute the gram matrix
while using weighted samples with an ElasticNet.

If weighted samples are used, the design matrix must be centered and then
rescaled by the square root of the weight vector before the gram matrix
is computed.

.. note::
  `sample_weight` vector is also rescaled to sum to `n_samples`, see the
   documentation for the `sample_weight` parameter to
   :func:`linear_model.ElasticNet.fit`.

.. GENERATED FROM PYTHON SOURCE LINES 21-22

Let's start by loading the dataset and creating some sample weights.

.. GENERATED FROM PYTHON SOURCE LINES 22-34

.. code-block:: default

    import numpy as np
    from sklearn.datasets import make_regression

    rng = np.random.RandomState(0)

    n_samples = int(1e5)
    X, y = make_regression(n_samples=n_samples, noise=0.5, random_state=rng)

    sample_weight = rng.lognormal(size=n_samples)
    # normalize the sample weights
    normalized_weights = sample_weight * (n_samples / (sample_weight.sum()))








.. GENERATED FROM PYTHON SOURCE LINES 35-38

To fit the elastic net using the `precompute` option together with the sample
weights, we must first center the design matrix,  and rescale it by the
normalized weights prior to computing the gram matrix.

.. GENERATED FROM PYTHON SOURCE LINES 38-43

.. code-block:: default

    X_offset = np.average(X, axis=0, weights=normalized_weights)
    X_centered = X - np.average(X, axis=0, weights=normalized_weights)
    X_scaled = X_centered * np.sqrt(normalized_weights)[:, np.newaxis]
    gram = np.dot(X_scaled.T, X_scaled)








.. GENERATED FROM PYTHON SOURCE LINES 44-48

We can now proceed with fitting. We must passed the centered design matrix to
`fit` otherwise the elastic net estimator will detect that it is uncentered
and discard the gram matrix we passed. However, if we pass the scaled design
matrix, the preprocessing code will incorrectly rescale it a second time.

.. GENERATED FROM PYTHON SOURCE LINES 48-52

.. code-block:: default

    from sklearn.linear_model import ElasticNet

    lm = ElasticNet(alpha=0.01, precompute=gram)
    lm.fit(X_centered, y, sample_weight=normalized_weights)





.. raw:: html

    <div class="output_subarea output_html rendered_html output_result">
    <style>#sk-0b621fbb-4b78-4407-912f-e4be534177bf {color: black;background-color: white;}#sk-0b621fbb-4b78-4407-912f-e4be534177bf pre{padding: 0;}#sk-0b621fbb-4b78-4407-912f-e4be534177bf div.sk-toggleable {background-color: white;}#sk-0b621fbb-4b78-4407-912f-e4be534177bf label.sk-toggleable__label {cursor: pointer;display: block;width: 100%;margin-bottom: 0;padding: 0.3em;box-sizing: border-box;text-align: center;}#sk-0b621fbb-4b78-4407-912f-e4be534177bf label.sk-toggleable__label-arrow:before {content: "▸";float: left;margin-right: 0.25em;color: #696969;}#sk-0b621fbb-4b78-4407-912f-e4be534177bf label.sk-toggleable__label-arrow:hover:before {color: black;}#sk-0b621fbb-4b78-4407-912f-e4be534177bf div.sk-estimator:hover label.sk-toggleable__label-arrow:before {color: black;}#sk-0b621fbb-4b78-4407-912f-e4be534177bf div.sk-toggleable__content {max-height: 0;max-width: 0;overflow: hidden;text-align: left;background-color: #f0f8ff;}#sk-0b621fbb-4b78-4407-912f-e4be534177bf div.sk-toggleable__content pre {margin: 0.2em;color: black;border-radius: 0.25em;background-color: #f0f8ff;}#sk-0b621fbb-4b78-4407-912f-e4be534177bf input.sk-toggleable__control:checked~div.sk-toggleable__content {max-height: 200px;max-width: 100%;overflow: auto;}#sk-0b621fbb-4b78-4407-912f-e4be534177bf input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {content: "▾";}#sk-0b621fbb-4b78-4407-912f-e4be534177bf div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-0b621fbb-4b78-4407-912f-e4be534177bf div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-0b621fbb-4b78-4407-912f-e4be534177bf input.sk-hidden--visually {border: 0;clip: rect(1px 1px 1px 1px);clip: rect(1px, 1px, 1px, 1px);height: 1px;margin: -1px;overflow: hidden;padding: 0;position: absolute;width: 1px;}#sk-0b621fbb-4b78-4407-912f-e4be534177bf div.sk-estimator {font-family: monospace;background-color: #f0f8ff;border: 1px dotted black;border-radius: 0.25em;box-sizing: border-box;margin-bottom: 0.5em;}#sk-0b621fbb-4b78-4407-912f-e4be534177bf div.sk-estimator:hover {background-color: #d4ebff;}#sk-0b621fbb-4b78-4407-912f-e4be534177bf div.sk-parallel-item::after {content: "";width: 100%;border-bottom: 1px solid gray;flex-grow: 1;}#sk-0b621fbb-4b78-4407-912f-e4be534177bf div.sk-label:hover label.sk-toggleable__label {background-color: #d4ebff;}#sk-0b621fbb-4b78-4407-912f-e4be534177bf div.sk-serial::before {content: "";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 2em;bottom: 0;left: 50%;}#sk-0b621fbb-4b78-4407-912f-e4be534177bf div.sk-serial {display: flex;flex-direction: column;align-items: center;background-color: white;padding-right: 0.2em;padding-left: 0.2em;}#sk-0b621fbb-4b78-4407-912f-e4be534177bf div.sk-item {z-index: 1;}#sk-0b621fbb-4b78-4407-912f-e4be534177bf div.sk-parallel {display: flex;align-items: stretch;justify-content: center;background-color: white;}#sk-0b621fbb-4b78-4407-912f-e4be534177bf div.sk-parallel::before {content: "";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 2em;bottom: 0;left: 50%;}#sk-0b621fbb-4b78-4407-912f-e4be534177bf div.sk-parallel-item {display: flex;flex-direction: column;position: relative;background-color: white;}#sk-0b621fbb-4b78-4407-912f-e4be534177bf div.sk-parallel-item:first-child::after {align-self: flex-end;width: 50%;}#sk-0b621fbb-4b78-4407-912f-e4be534177bf div.sk-parallel-item:last-child::after {align-self: flex-start;width: 50%;}#sk-0b621fbb-4b78-4407-912f-e4be534177bf div.sk-parallel-item:only-child::after {width: 0;}#sk-0b621fbb-4b78-4407-912f-e4be534177bf div.sk-dashed-wrapped {border: 1px dashed gray;margin: 0 0.4em 0.5em 0.4em;box-sizing: border-box;padding-bottom: 0.4em;background-color: white;position: relative;}#sk-0b621fbb-4b78-4407-912f-e4be534177bf div.sk-label label {font-family: monospace;font-weight: bold;background-color: white;display: inline-block;line-height: 1.2em;}#sk-0b621fbb-4b78-4407-912f-e4be534177bf div.sk-label-container {position: relative;z-index: 2;text-align: center;}#sk-0b621fbb-4b78-4407-912f-e4be534177bf div.sk-container {/* jupyter's `normalize.less` sets `[hidden] { display: none; }` but bootstrap.min.css set `[hidden] { display: none !important; }` so we also need the `!important` here to be able to override the default hidden behavior on the sphinx rendered scikit-learn.org. See: https://github.com/scikit-learn/scikit-learn/issues/21755 */display: inline-block !important;position: relative;}#sk-0b621fbb-4b78-4407-912f-e4be534177bf div.sk-text-repr-fallback {display: none;}</style><div id="sk-0b621fbb-4b78-4407-912f-e4be534177bf" class="sk-top-container"><div class="sk-text-repr-fallback"><pre>ElasticNet(alpha=0.01,
               precompute=array([[ 9.98809919e+04, -4.48938813e+02, -1.03237920e+03, ...,
            -2.25349312e+02, -3.53959628e+02, -1.67451144e+02],
           [-4.48938813e+02,  1.00768662e+05,  1.19112072e+02, ...,
            -1.07963978e+03,  7.47987268e+01, -5.76195467e+02],
           [-1.03237920e+03,  1.19112072e+02,  1.00393284e+05, ...,
            -3.07582983e+02,  6.66670169e+02,  2.65799352e+02],
           ...,
           [-2.25349312e+02, -1.07963978e+03, -3.07582983e+02, ...,
             9.99891212e+04, -4.58195950e+02, -1.58667835e+02],
           [-3.53959628e+02,  7.47987268e+01,  6.66670169e+02, ...,
            -4.58195950e+02,  9.98350372e+04,  5.60836363e+02],
           [-1.67451144e+02, -5.76195467e+02,  2.65799352e+02, ...,
            -1.58667835e+02,  5.60836363e+02,  1.00911944e+05]]))</pre><b>Please rerun this cell to show the HTML repr or trust the notebook.</b></div><div class="sk-container" hidden><div class="sk-item"><div class="sk-estimator sk-toggleable"><input class="sk-toggleable__control sk-hidden--visually" id="aef14503-cef7-402c-b063-929f8e13ef14" type="checkbox" checked><label for="aef14503-cef7-402c-b063-929f8e13ef14" class="sk-toggleable__label sk-toggleable__label-arrow">ElasticNet</label><div class="sk-toggleable__content"><pre>ElasticNet(alpha=0.01,
               precompute=array([[ 9.98809919e+04, -4.48938813e+02, -1.03237920e+03, ...,
            -2.25349312e+02, -3.53959628e+02, -1.67451144e+02],
           [-4.48938813e+02,  1.00768662e+05,  1.19112072e+02, ...,
            -1.07963978e+03,  7.47987268e+01, -5.76195467e+02],
           [-1.03237920e+03,  1.19112072e+02,  1.00393284e+05, ...,
            -3.07582983e+02,  6.66670169e+02,  2.65799352e+02],
           ...,
           [-2.25349312e+02, -1.07963978e+03, -3.07582983e+02, ...,
             9.99891212e+04, -4.58195950e+02, -1.58667835e+02],
           [-3.53959628e+02,  7.47987268e+01,  6.66670169e+02, ...,
            -4.58195950e+02,  9.98350372e+04,  5.60836363e+02],
           [-1.67451144e+02, -5.76195467e+02,  2.65799352e+02, ...,
            -1.58667835e+02,  5.60836363e+02,  1.00911944e+05]]))</pre></div></div></div></div></div>
    </div>
    <br />
    <br />


.. rst-class:: sphx-glr-timing

   **Total running time of the script:** ( 0 minutes  1.465 seconds)


.. _sphx_glr_download_auto_examples_linear_model_plot_elastic_net_precomputed_gram_matrix_with_weighted_samples.py:


.. only :: html

 .. container:: sphx-glr-footer
    :class: sphx-glr-footer-example



  .. container:: sphx-glr-download sphx-glr-download-python

     :download:`Download Python source code: plot_elastic_net_precomputed_gram_matrix_with_weighted_samples.py <plot_elastic_net_precomputed_gram_matrix_with_weighted_samples.py>`



  .. container:: sphx-glr-download sphx-glr-download-jupyter

     :download:`Download Jupyter notebook: plot_elastic_net_precomputed_gram_matrix_with_weighted_samples.ipynb <plot_elastic_net_precomputed_gram_matrix_with_weighted_samples.ipynb>`


.. only:: html

 .. rst-class:: sphx-glr-signature

    `Gallery generated by Sphinx-Gallery <https://sphinx-gallery.github.io>`_
