Changeset 9290:c96f47743746 in orange


Ignore:
Timestamp:
12/01/11 11:37:43 (2 years ago)
Author:
ales_erjavec <ales.erjavec@…>
Branch:
default
Convert:
ac1ce4093093881c936d2844e89d342de2e9cd68
Message:

Normalize X by standard deviation before computing the lasso solution.
Added 's' parameter as an alternative way to specify 't'.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • orange/Orange/regression/lasso.py

    r9244 r9290  
    7777    return X - mu, mu 
    7878 
     79def standardize(X): 
     80    """Standardizes the data, i.e. subtracts the column means and divide by  
     81    standard deviation. 
     82    Returns the centered data, the mean, and deviations. 
     83 
     84    :param X: the data arry 
     85    :type table: :class:`numpy.array` 
     86    """ 
     87    mu = numpy.mean(X, axis=0) 
     88    std = numpy.std(X, axis=0) 
     89    return (X - mu) / std, mu, std 
     90 
    7991def get_bootstrap_sample(table): 
    8092    """Generates boostrap sample from an Orange Example Table 
     
    114126 
    115127    """ 
    116      
    117  
    118     def __init__(self, name='lasso regression', t=1, tol=0.001, \ 
     128 
     129    def __init__(self, name='lasso regression', t=1, s=None, tol=0.001, \ 
    119130                 n_boot=100, n_perm=100, imputer=None, continuizer=None): 
    120131        """ 
    121132        :param name: name of the linear model, default 'lasso regression' 
    122133        :type name: string 
     134         
    123135        :param t: tuning parameter, upper bound for the L1-norm of the 
    124136            regression coefficients 
    125137        :type t: float 
     138         
     139        :param s: An alternative way to specify the tuning parameter ``t``. 
     140            Here ``t`` is taken to be t = s * sum(abs(B)) where B are the 
     141            coefficients of an ordinary least square linear fit. ``t`` parameter is ignored if ``s`` is specified (by default it 
     142            is None). 
     143        :type s: float 
     144         
    126145        :param tol: tolerance parameter, regression coefficients 
    127146            (absoulute value) under tol are set to 0, 
    128147            default=0.001 
    129148        :type tol: float 
     149         
    130150        :param n_boot: number of bootstrap samples used for non-parametric 
    131151            estimation of standard errors 
    132152        :type n_boot: int 
     153         
    133154        :param n_perm: number of permuations used for non-parametric 
    134155            estimation of p-values 
    135156        :type n_perm: int 
     157         
    136158        """ 
    137159 
    138160        self.name = name 
    139161        self.t = t 
     162        self.s = s 
    140163        self.tol = tol 
    141164        self.n_boot = n_boot 
     
    164187        X, y, w = table.to_numpy() 
    165188        n, m = numpy.shape(X) 
    166         X, mu_x = center(X) 
     189         
     190        X, mu_x, sigma_x = standardize(X) 
    167191        y, coef0 = center(y) 
    168  
     192         
     193        t = self.t 
     194         
     195        if self.s is not None: 
     196            beta_full, rss, _, _ = numpy.linalg.lstsq(X, y) 
     197            t = self.s * numpy.sum(numpy.abs(beta_full)) 
     198            print "t =", t 
     199             
    169200        import scipy.optimize 
    170  
     201             
    171202        # objective function to be minimized 
    172203        objective = lambda beta: numpy.linalg.norm(y - numpy.dot(X, beta)) 
     
    174205        beta_init = numpy.random.random(m) 
    175206        # constraints for the regression coefficients 
    176         cnstr = lambda beta: self.t - sum(numpy.abs(beta)) 
     207        cnstr = lambda beta: t - numpy.sum(numpy.abs(beta)) 
    177208        # optimal solution 
    178209        coefficients = scipy.optimize.fmin_cobyla(objective, beta_init,\ 
    179                                                        cnstr) 
     210                                                       cnstr, disp=0) 
    180211 
    181212        # set small coefficients to 0 
    182213        def set_2_0(c): return c if abs(c) > self.tol else 0 
    183         coefficients = map(set_2_0, coefficients) 
    184  
     214        coefficients = numpy.array(map(set_2_0, coefficients)) 
     215        coefficients /= sigma_x 
     216         
    185217        # bootstrap estimator of standard error of the coefficient estimators 
    186218        # assumption: fixed t 
     
    189221            for i in range(self.n_boot): 
    190222                tmp_table = get_bootstrap_sample(table) 
    191                 l = LassoRegressionLearner(t=self.t, n_boot=0, n_perm=0) 
     223                l = LassoRegressionLearner(t=t, n_boot=0, n_perm=0) 
    192224                c = l(tmp_table) 
    193225                coeff_b.append(c.coefficients) 
     
    202234            for i in range(self.n_perm): 
    203235                tmp_table = permute_responses(table) 
    204                 l = LassoRegressionLearner(t=self.t, n_boot=0, n_perm=0) 
     236                l = LassoRegressionLearner(t=t, n_boot=0, n_perm=0) 
    205237                c = l(tmp_table) 
    206238                coeff_p.append(c.coefficients) 
     
    299331        if result_type == Orange.core.GetProbabilities: 
    300332            return dist 
    301         return (y_hat, dist)     
     333        else: 
     334            return (y_hat, dist)     
    302335 
    303336deprecated_members({"muX": "mu_x", 
Note: See TracChangeset for help on using the changeset viewer.