scikit-learn/examples/linear_model/plot_ard.py

85 lines
2.8 KiB
Python
Raw Normal View History

"""
==================================================
2010-09-29 22:26:24 +08:00
Automatic Relevance Determination Regression (ARD)
==================================================
2010-09-29 22:26:24 +08:00
Fit regression model with Bayesian Ridge Regression.
See :ref:`bayesian_ridge_regression` for more information on the regressor.
Compared to the OLS (ordinary least squares) estimator, the coefficient
weights are slightly shifted toward zeros, which stabilises them.
The histogram of the estimated weights is very peaked, as a sparsity-inducing
prior is implied on the weights.
The estimation of the model is done by iteratively maximizing the
marginal log-likelihood of the observations.
"""
print(__doc__)
import numpy as np
import matplotlib.pyplot as plt
2010-09-29 22:26:24 +08:00
from scipy import stats
from sklearn.linear_model import ARDRegression, LinearRegression
2011-12-20 22:34:17 +08:00
###############################################################################
# Generating simulated data with Gaussian weights
# Parameters of the example
2010-09-29 22:26:24 +08:00
np.random.seed(0)
n_samples, n_features = 100, 100
# Create Gaussian data
2010-09-29 22:26:24 +08:00
X = np.random.randn(n_samples, n_features)
2015-12-08 02:13:40 +08:00
# Create weights with a precision lambda_ of 4.
lambda_ = 4.
w = np.zeros(n_features)
# Only keep 10 weights of interest
2010-09-29 22:26:24 +08:00
relevant_features = np.random.randint(0, n_features, 10)
for i in relevant_features:
2010-09-29 22:26:24 +08:00
w[i] = stats.norm.rvs(loc=0, scale=1. / np.sqrt(lambda_))
2016-06-28 00:13:49 +08:00
# Create noise with a precision alpha of 50.
alpha_ = 50.
2011-12-20 22:34:17 +08:00
noise = stats.norm.rvs(loc=0, scale=1. / np.sqrt(alpha_), size=n_samples)
# Create the target
2010-09-29 22:26:24 +08:00
y = np.dot(X, w) + noise
2011-12-20 22:34:17 +08:00
###############################################################################
# Fit the ARD Regression
2011-12-20 22:34:17 +08:00
clf = ARDRegression(compute_score=True)
2010-09-29 22:26:24 +08:00
clf.fit(X, y)
ols = LinearRegression()
ols.fit(X, y)
2011-12-20 22:34:17 +08:00
###############################################################################
# Plot the true weights, the estimated weights and the histogram of the
# weights
plt.figure(figsize=(6, 5))
plt.title("Weights of the model")
2015-10-22 20:12:06 +08:00
plt.plot(clf.coef_, color='darkblue', linestyle='-', linewidth=2,
label="ARD estimate")
plt.plot(ols.coef_, color='yellowgreen', linestyle=':', linewidth=2,
label="OLS estimate")
plt.plot(w, color='orange', linestyle='-', linewidth=2, label="Ground truth")
plt.xlabel("Features")
plt.ylabel("Values of the weights")
plt.legend(loc=1)
plt.figure(figsize=(6, 5))
plt.title("Histogram of the weights")
2015-10-22 20:12:06 +08:00
plt.hist(clf.coef_, bins=n_features, color='navy', log=True)
plt.scatter(clf.coef_[relevant_features], 5 * np.ones(len(relevant_features)),
color='gold', marker='o', label="Relevant features")
plt.ylabel("Features")
plt.xlabel("Values of the weights")
plt.legend(loc=1)
plt.figure(figsize=(6, 5))
plt.title("Marginal log-likelihood")
2015-10-22 20:12:06 +08:00
plt.plot(clf.scores_, color='navy', linewidth=2)
plt.ylabel("Score")
plt.xlabel("Iterations")
plt.show()