Personal tools
You are here: Home Examples Documentation Chapter 9 robls.py
Document Actions

robls.py

The robust least-squares example of section 9.1

# The robust least-squares example of section 9.1.  

from math import sqrt, ceil, floor
from cvxopt import base, solvers, blas, lapack
from cvxopt.base import matrix, spmatrix, spdiag, sqrt, mul, div
import pylab

def robls(A, b, rho):

    # Minimize  sum_k sqrt(rho + (A*x-b)_k^2).

    m, n = A.size
    def F(x=None, z=None):
        if x is None: return 0, matrix(0.0, (n,1))
        y = A*x-b
        w = sqrt(rho + y**2)
        f = sum(w)
        Df = div(y, w).T * A
        if z is None: return f, Df
        H = A.T * spdiag(z[0]*rho*(w**-3)) * A
        return f, Df, H

    return solvers.cp(F)['x']


base.setseed()
m, n  = 500, 100
A = base.normal(m,n)
b = base.normal(m,1)
xh = robls(A,b,0.1)

try: import pylab
except ImportError: pass
else:

    # Least-squares solution.
    pylab.subplot(211)
    xls = +b
    lapack.gels(+A,xls)
    rls =  A*xls[:n] - b
    pylab.hist(rls, m/5)
    pylab.title('Least-squares solution')
    pylab.xlabel('Residual')
    mr = ceil(max(rls))
    pylab.axis([-mr, mr, 0, 25])

    # Robust least-squares solution with rho = 0.01.
    pylab.subplot(212)
    rh =  A*xh - b
    pylab.hist(rh, m/5)
    mr = ceil(max(rh))
    pylab.title('Robust least-squares solution')
    pylab.xlabel('Residual')
    pylab.axis([-mr, mr, 0, 50])

    pylab.show()
 

Powered by Plone CMS, the Open Source Content Management System