59 lines
1.7 KiB
Python
59 lines
1.7 KiB
Python
"""
|
|
===================
|
|
Isotonic Regression
|
|
===================
|
|
|
|
An illustration of the isotonic regression on generated data. The
|
|
isotonic regression finds a non-decreasing approximation of a function
|
|
while minimizing the mean squared error on the training data. The benefit
|
|
of such a model is that it does not assume any form for the target
|
|
function such as linearity. For comparison a linear regression is also
|
|
presented.
|
|
|
|
"""
|
|
print(__doc__)
|
|
|
|
# Author: Nelle Varoquaux <nelle.varoquaux@gmail.com>
|
|
# Alexandre Gramfort <alexandre.gramfort@inria.fr>
|
|
# Licence: BSD
|
|
|
|
import numpy as np
|
|
import matplotlib.pyplot as plt
|
|
from matplotlib.collections import LineCollection
|
|
|
|
from sklearn.linear_model import LinearRegression
|
|
from sklearn.isotonic import IsotonicRegression
|
|
from sklearn.utils import check_random_state
|
|
|
|
n = 100
|
|
x = np.arange(n)
|
|
rs = check_random_state(0)
|
|
y = rs.randint(-50, 50, size=(n,)) + 50. * np.log(1 + np.arange(n))
|
|
|
|
###############################################################################
|
|
# Fit IsotonicRegression and LinearRegression models
|
|
|
|
ir = IsotonicRegression()
|
|
|
|
y_ = ir.fit_transform(x, y)
|
|
|
|
lr = LinearRegression()
|
|
lr.fit(x[:, np.newaxis], y) # x needs to be 2d for LinearRegression
|
|
|
|
###############################################################################
|
|
# plot result
|
|
|
|
segments = [[[i, y[i]], [i, y_[i]]] for i in range(n)]
|
|
lc = LineCollection(segments, zorder=0)
|
|
lc.set_array(np.ones(len(y)))
|
|
lc.set_linewidths(0.5 * np.ones(n))
|
|
|
|
fig = plt.figure()
|
|
plt.plot(x, y, 'r.', markersize=12)
|
|
plt.plot(x, y_, 'g.-', markersize=12)
|
|
plt.plot(x, lr.predict(x[:, np.newaxis]), 'b-')
|
|
plt.gca().add_collection(lc)
|
|
plt.legend(('Data', 'Isotonic Fit', 'Linear Fit'), loc='lower right')
|
|
plt.title('Isotonic regression')
|
|
plt.show()
|