Ignore:
Files:
1 added
5 edited

Legend:

Unmodified
Added
Removed
  • Orange/classification/logreg.py

    r10885 r11063  
    22from Orange.utils import deprecated_keywords, deprecated_members 
    33from Orange.data import preprocess 
     4import decimal 
    45import math 
    56 
     
    910from numpy.linalg import inv 
    1011from Orange.core import LogRegClassifier, LogRegFitter, LogRegFitter_Cholesky 
     12 
     13def format_decimal(x, prec=2): 
     14    """Allows arbitrary precision with scientific notation""" 
     15    tup = x.as_tuple() 
     16    digits = list(tup.digits[:prec + 1]) 
     17    sign = '-' if tup.sign else '' 
     18    dec = ''.join(str(i) for i in digits[1:]) 
     19    exp = x.adjusted() 
     20    return '{sign}{int}.{dec}e{exp}'.format(sign=sign, int=digits[0], dec=dec, exp=exp) 
    1121 
    1222def dump(classifier): 
     
    3242    out.append(formatstr % ("Feature", "beta", "st. error", "wald Z", "P", "OR=exp(beta)")) 
    3343    out.append('') 
    34     formatstr = "%"+str(longest)+"s %10.2f %10.2f %10.2f %10.2f"     
     44    formatstr = "%"+str(longest)+"s %10.2f %10.2f %10.2f %10.2f" 
    3545    out.append(formatstr % ("Intercept", classifier.beta[0], classifier.beta_se[0], classifier.wald_Z[0], classifier.P[0])) 
    36     formatstr = "%"+str(longest)+"s %10.2f %10.2f %10.2f %10.2f %10.2f"     
     46    formatstr = "%"+str(longest)+"s %10.2f %10.2f %10.2f %10.2f %s" 
    3747    for i in range(len(classifier.continuized_domain.features)): 
    38         out.append(formatstr % (classifier.continuized_domain.features[i].name, classifier.beta[i+1], classifier.beta_se[i+1], classifier.wald_Z[i+1], abs(classifier.P[i+1]), math.exp(classifier.beta[i+1]))) 
     48        try: 
     49            exp = decimal.Decimal(math.e) ** decimal.Decimal(classifier.beta[i+1]) 
     50        except TypeError: 
     51            # Python 2.6 does not support creating Decimals from float 
     52            exp = decimal.Decimal(str(math.e)) ** decimal.Decimal(str(classifier.beta[i+1])) 
     53        out.append(formatstr % (classifier.continuized_domain.features[i].name, 
     54            classifier.beta[i+1], 
     55            classifier.beta_se[i+1], 
     56            classifier.wald_Z[i+1], 
     57            abs(classifier.P[i+1]), 
     58            format_decimal(exp))) 
    3959 
    4060    return '\n'.join(out) 
    41          
     61 
    4262 
    4363def has_discrete_values(domain): 
  • Orange/testing/regression/results_tests_20/modules_logreg1.py.txt

    r9951 r11064  
    77 
    88    Intercept      -1.23       0.08     -15.15      -0.00 
    9  status=first       0.86       0.16       5.39       0.00       2.36 
    10 status=second      -0.16       0.18      -0.91       0.36       0.85 
    11  status=third      -0.92       0.15      -6.12       0.00       0.40 
    12     age=child       1.06       0.25       4.30       0.00       2.89 
    13    sex=female       2.42       0.14      17.04       0.00      11.25 
     9 status=first       0.86       0.16       5.39       0.00 2.35e0 
     10status=second      -0.16       0.18      -0.91       0.36 8.51e-1 
     11 status=third      -0.92       0.15      -6.12       0.00 3.98e-1 
     12    age=child       1.06       0.25       4.30       0.00 2.89e0 
     13   sex=female       2.42       0.14      17.04       0.00 1.12e1 
  • Orange/testing/unit/tests/test_logreg.py

    r10678 r11061  
    77from orngLR import LogRegLearner, Univariate_LogRegLearner, StepWiseFSS, StepWiseFSS_Filter 
    88 
    9 from Orange.classification.logreg import LibLinearLogRegLearner 
     9from Orange.classification.logreg import LibLinearLogRegLearner, dump 
     10import Orange 
     11 
    1012def datasets_iter(): 
    1113    for name, (data,) in testing.datasets_iter(testing.CLASSIFICATION_DATASETS): 
     
    2224        """ 
    2325        if len(dataset) < len(dataset.domain): 
    24             raise unittest.SkipTest("No enough examples") 
     26            raise unittest.SkipTest("Not enough examples") 
    2527        testing.LearnerTestCase.test_learner_on(self, dataset) 
    2628 
     
    4850        testing.LearnerTestCase.test_learner_on(self, dataset) 
    4951 
     52class TestUtils(unittest.TestCase): 
     53    def test_dump(self): 
     54        """Test for dump() failing (OverflowError: math range error on math.exp) 
     55         on classifiers with high beta""" 
     56        quality = Orange.feature.Discrete('quality') 
     57        quality.add_value('low') 
     58        quality.add_value('high') 
     59        price = Orange.feature.Continuous('price') 
     60        variables = [price, quality] 
     61        matrix = [[0.01, 'high'], [0.001, 'low']] 
     62        domain = Orange.data.Domain(variables) 
     63        data = Orange.data.Table(domain, matrix) 
     64        classifier = LogRegLearner(data) 
     65        text_dump = dump(classifier) 
     66 
     67 
    5068if __name__ == "__main__": 
    5169    unittest.main() 
  • docs/index.rst

    r11066 r11068  
    66------------------ 
    77 
    8 :doc:`Widget catalog <widgets/rst/index>` contains descriptions of most widgets as they appear in the latest version of Orange. 
     8:doc:`Widget catalog <widgets/rst/index>` 
    99 
    1010 
     
    1212---------------------------------- 
    1313 
    14 :doc:`tutorial <tutorial/rst/index>`which shows how to do simple stuff like loading data and constructing classifiers. 
     14:doc:`Tutorial <tutorial/rst/index>` 
    1515 
    16 For everyday programming in Orange, use :doc:`reference <reference/rst/index>`. 
     16:doc:`Reference <reference/rst/index>` 
    1717 
    18 If you would like to write new widgets you should also take a look at the :doc:`widget development manual <extend-widgets/rst/index>`. 
    1918 
    2019 
     
    2221-------------------------------- 
    2322 
    24 For documentation about development of Orange itself, please see our wiki_. 
     23:doc:`Widget development manual <extend-widgets/rst/index>` 
    2524 
    26 .. _wiki: http://orange.biolab.si/trac/intertrac/ 
    27  
    28 Contents 
    29 -------- 
    30  
    31 .. toctree:: 
    32    :maxdepth: 1 
    33  
    34    widgets/rst/index 
    35  
    36 ..   first-steps/rst/index 
    37  
    38    tutorial/rst/index 
    39    reference/rst/index 
    40    development/rst/index 
    41    extend-widgets/rst/index 
    42  
     25`Wiki pages for developers <http://orange.biolab.si/trac>`_ 
    4326 
    4427Indices and tables 
  • source/orange/cls_orange.cpp

    r10673 r11065  
    393393    } 
    394394  
    395     if (!strcmp(name, "name") || !strcmp(name, "shortDescription") || !strcmp(name, "description")) 
    396       return PyString_FromString(""); 
    397  
    398395    PyErr_Format(PyExc_AttributeError, "'%s' has no attribute '%s'", self->ob_type->tp_name, name); 
    399396    return PYNULL; 
     
    10251022 
    10261023 
     1024char const *genericNames[] = {"Classifier", "Learner", "Discretizer", NULL}; 
     1025 
     1026PyObject *Orange_get_name(TPyOrange *self) 
     1027{ 
     1028  PyTRY 
     1029    PyObject *pyname = Orange_getattr1(self, "name"); 
     1030    if (!pyname) {  
     1031      PyErr_Clear(); 
     1032      if (self->orange_dict) { 
     1033        pyname = PyDict_GetItemString(self->orange_dict, "name"); 
     1034        Py_XINCREF(pyname); 
     1035      } 
     1036    } 
     1037    if (pyname) { 
     1038      if (PyString_Check(pyname)) { 
     1039        return pyname; 
     1040      } 
     1041      PyObject *pystr = PyObject_Repr(pyname); 
     1042      Py_DECREF(pyname); 
     1043      return pystr; 
     1044    } 
     1045 
     1046    char const *tp_name = self->ob_type->tp_name; 
     1047    char const *dotp = tp_name + strlen(tp_name); 
     1048    while((dotp != tp_name) && (*dotp != '.')) { 
     1049      dotp--; 
     1050    } 
     1051    if (*dotp == '.') { 
     1052      dotp++; 
     1053    } 
     1054    if (*dotp == '_') { 
     1055      dotp++; 
     1056    } 
     1057    char *name = (char *)malloc(strlen(dotp) + 1); 
     1058    strcpy(name, dotp); 
     1059 
     1060    const int lenname = strlen(name); 
     1061    char *nameend = name + lenname; 
     1062    for(char const *const *gen = genericNames; *gen; gen++) { 
     1063        if (strlen(*gen) < lenname) { 
     1064            char *cap = nameend - strlen(*gen); 
     1065            if (!strcmp(cap, *gen)) { 
     1066              *cap = 0; 
     1067              break; 
     1068            } 
     1069        } 
     1070    } 
     1071    if ((*name >= 'A') && (*name <= 'Z')) { 
     1072      *name ^= 32; 
     1073      } 
     1074    return PyString_FromString(name); 
     1075  PyCATCH 
     1076} 
     1077 
     1078 
     1079 
     1080int Orange_set_name(TPyOrange *self, PyObject *arg) 
     1081{ 
     1082  PyTRY 
     1083    int res = Orange_setattr1(self, "name", arg); 
     1084    if (res == 1) { 
     1085        res = Orange_setattrDictionary(self, "name", arg, false); 
     1086    } 
     1087    return res; 
     1088  PyCATCH_1 
     1089} 
     1090 
     1091 
    10271092int Orange_nonzero(PyObject *self) 
    10281093{ PyTRY 
Note: See TracChangeset for help on using the changeset viewer.