In [7]:
# Code attribution: Yiyin Shen, Tyler Caraza-Harter
# Imports
import sklearn
import sklearn.linear_model
import scipy
import numpy
import matplotlib.pyplot as plt
In [14]:
# Plot the points
n = 10
x = numpy.array([i for i in range(n)]).reshape(-1, 1)
y = numpy.array([2 * i for i in range(n - 1)] + [100])
plt.scatter(x, y)
Out[14]:
<matplotlib.collections.PathCollection at 0x250db396450>
In [21]:
# Compute the regression
reg = sklearn.linear_model.LinearRegression()
reg.fit(x, y)
y_ls = reg.predict(x)
plt.scatter(x, y)
plt.plot(x, y_ls, color = "green")
Out[21]:
[<matplotlib.lines.Line2D at 0x250db3694d0>]
In [15]:
# Create the LAD regression linear problem in the form min c'x st ax <= b
# The variabls are [weight, bias, error_1, error_2, ..., error_n].
c = numpy.array([0, 0] + [1] * n)
a1 = numpy.hstack([-x, -numpy.ones((n, 1)), -numpy.identity(n)])
a2 = numpy.hstack([x, numpy.ones((n, 1)), -numpy.identity(n)])
a = numpy.vstack([a1, a2])
b = numpy.hstack([-y, y])
c, a, b
Out[15]:
(array([0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]),
array([[ 0., -1., -1., -0., -0., -0., -0., -0., -0., -0., -0., -0.],
[-1., -1., -0., -1., -0., -0., -0., -0., -0., -0., -0., -0.],
[-2., -1., -0., -0., -1., -0., -0., -0., -0., -0., -0., -0.],
[-3., -1., -0., -0., -0., -1., -0., -0., -0., -0., -0., -0.],
[-4., -1., -0., -0., -0., -0., -1., -0., -0., -0., -0., -0.],
[-5., -1., -0., -0., -0., -0., -0., -1., -0., -0., -0., -0.],
[-6., -1., -0., -0., -0., -0., -0., -0., -1., -0., -0., -0.],
[-7., -1., -0., -0., -0., -0., -0., -0., -0., -1., -0., -0.],
[-8., -1., -0., -0., -0., -0., -0., -0., -0., -0., -1., -0.],
[-9., -1., -0., -0., -0., -0., -0., -0., -0., -0., -0., -1.],
[ 0., 1., -1., -0., -0., -0., -0., -0., -0., -0., -0., -0.],
[ 1., 1., -0., -1., -0., -0., -0., -0., -0., -0., -0., -0.],
[ 2., 1., -0., -0., -1., -0., -0., -0., -0., -0., -0., -0.],
[ 3., 1., -0., -0., -0., -1., -0., -0., -0., -0., -0., -0.],
[ 4., 1., -0., -0., -0., -0., -1., -0., -0., -0., -0., -0.],
[ 5., 1., -0., -0., -0., -0., -0., -1., -0., -0., -0., -0.],
[ 6., 1., -0., -0., -0., -0., -0., -0., -1., -0., -0., -0.],
[ 7., 1., -0., -0., -0., -0., -0., -0., -0., -1., -0., -0.],
[ 8., 1., -0., -0., -0., -0., -0., -0., -0., -0., -1., -0.],
[ 9., 1., -0., -0., -0., -0., -0., -0., -0., -0., -0., -1.]]),
array([ 0, -2, -4, -6, -8, -10, -12, -14, -16, -100, 0,
2, 4, 6, 8, 10, 12, 14, 16, 100]))
In [18]:
# Solve the dual linear program
w = scipy.optimize.linprog(c, a, b)
w
Out[18]:
message: Optimization terminated successfully. (HiGHS Status 7: Optimal)
success: True
status: 0
fun: 82.0
x: [ 2.000e+00 0.000e+00 -0.000e+00 0.000e+00 0.000e+00
0.000e+00 0.000e+00 0.000e+00 -0.000e+00 0.000e+00
0.000e+00 8.200e+01]
nit: 3
lower: residual: [ 2.000e+00 0.000e+00 -0.000e+00 0.000e+00
0.000e+00 0.000e+00 0.000e+00 0.000e+00
-0.000e+00 0.000e+00 0.000e+00 8.200e+01]
marginals: [ 0.000e+00 1.600e+00 0.000e+00 1.000e+00
1.000e+00 1.000e+00 1.000e+00 4.000e-01
0.000e+00 1.000e+00 1.000e+00 0.000e+00]
upper: residual: [ inf inf inf inf
inf inf inf inf
inf inf inf inf]
marginals: [ 0.000e+00 0.000e+00 0.000e+00 0.000e+00
0.000e+00 0.000e+00 0.000e+00 0.000e+00
0.000e+00 0.000e+00 0.000e+00 0.000e+00]
eqlin: residual: []
marginals: []
ineqlin: residual: [ 0.000e+00 0.000e+00 ... 0.000e+00
1.640e+02]
marginals: [-0.000e+00 -0.000e+00 ... -0.000e+00
-0.000e+00]
mip_node_count: 0
mip_dual_bound: 0.0
mip_gap: 0.0
In [22]:
y_lad = x * w.x[0] + w.x[1]
plt.scatter(x, y)
plt.plot(x, y_ls, color = "green")
plt.plot(x, y_lad, color = "red")
Out[22]:
[<matplotlib.lines.Line2D at 0x250db46a010>]