In [42]:
%matplotlib inline
import cvxpy
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(5)
In [43]:
# Initialize some data with gaussian random noise
x = np.arange(40)
y = 0.3 * x + 5 + np.random.standard_normal(40)
plt.scatter(x, y)
Out[43]:
<matplotlib.collections.PathCollection at 0x10bf2dd50>
In [44]:
# Perturb it!
for i in xrange(40):
    if np.random.random() < 0.1:
        y[i] += 10
plt.scatter(x, y)
Out[44]:
<matplotlib.collections.PathCollection at 0x10c046a50>
In [45]:
# Try linear regression
w = cvxpy.Variable(); b = cvxpy.Variable()
obj = 0
for i in xrange(40):
    obj += (w * x[i] + b - y[i]) ** 2
cvxpy.Problem(cvxpy.Minimize(obj), []).solve()
w = w.value; b = b.value
plt.scatter(x, y)
plt.plot(x, w * x + b)
Out[45]:
[<matplotlib.lines.Line2D at 0x10b8abf10>]
In [46]:
# How well does the Huber loss work?
w = cvxpy.Variable(); b = cvxpy.Variable()
obj = 0
for i in xrange(40):
    obj += cvxpy.huber(w * x[i] + b - y[i], 1)
cvxpy.Problem(cvxpy.Minimize(obj), []).solve()
w = w.value; b = b.value
plt.scatter(x, y)
plt.plot(x, w * x + b)
Out[46]:
[<matplotlib.lines.Line2D at 0x10ac75b50>]
In [47]:
# Huber loss worked pretty well, so let's take it to the extreme - M=0
w = cvxpy.Variable(); b = cvxpy.Variable()
obj = 0
for i in xrange(40):
    obj += cvxpy.abs(w * x[i] + b - y[i])
cvxpy.Problem(cvxpy.Minimize(obj), []).solve()
w = w.value; b = b.value
plt.scatter(x, y)
plt.plot(x, w * x + b)
Out[47]:
[<matplotlib.lines.Line2D at 0x10bb99e90>]
In [48]:
# Create a classification dataset
x1 = np.random.normal(2, 1, (2, 40))
x2 = np.random.normal(-2, 1, (2, 40))
plt.scatter(x1[0, :], x1[1, :], color='blue')
plt.scatter(x2[0, :], x2[1, :], color='green')
Out[48]:
<matplotlib.collections.PathCollection at 0x10c502a10>
In [49]:
# Code up an SVM, no liblinear/svmlight needed.
w = cvxpy.Variable(2); b = cvxpy.Variable()
obj = 0
for i in xrange(40):
    obj += cvxpy.pos(1 - (w.T * x1[:, i] + b))
    obj += cvxpy.pos(1 + (w.T * x2[:, i] + b))
cvxpy.Problem(cvxpy.Minimize(obj), []).solve()
x = np.arange(-6, 4)
y = -(w.value[0, 0] * x + b.value) / w.value[1, 0]
plt.plot(x, y, color='red')
plt.scatter(x1[0, :], x1[1, :], color='blue')
plt.scatter(x2[0, :], x2[1, :], color='green')
Out[49]:
<matplotlib.collections.PathCollection at 0x10c6df2d0>
In [ ]: