[goffice] go_linear_regression_leverage: prescale.



commit 6d9af15a98468803c8af9b06186bb20a7d1ca80c
Author: Morten Welinder <terra gnome org>
Date:   Mon Jul 15 16:45:31 2013 -0400

    go_linear_regression_leverage: prescale.

 ChangeLog                    |    7 ++++++-
 NEWS                         |    3 +++
 goffice/math/go-regression.c |   37 ++++++++++++++++++++++++++++---------
 3 files changed, 37 insertions(+), 10 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index 2c45407..c0df291 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,6 +1,11 @@
+2013-07-15  Morten Welinder  <terra gnome org>
+
+       * goffice/math/go-regression.c (go_linear_regression_leverage):
+       Prescale.
+
 2013-07-11  Jean Brefort  <jean brefort normalesup org>
 
-       * goffice/component/goffice-component.h: move includes outside of 
+       * goffice/component/goffice-component.h: move includes outside of
        G_BEGIN_DECLS/G_END_DECLS.
 
 2013-07-10  Morten Welinder <terra gnome org>
diff --git a/NEWS b/NEWS
index 084e658..b1aa927 100644
--- a/NEWS
+++ b/NEWS
@@ -1,5 +1,8 @@
 goffice 0.10.5:
 
+Morten:
+       * Add prescaling to go_linear_regression_leverage.  [#703381]
+
 --------------------------------------------------------------------------
 goffice 0.10.4:
 
diff --git a/goffice/math/go-regression.c b/goffice/math/go-regression.c
index 066b28e..de4e667 100644
--- a/goffice/math/go-regression.c
+++ b/goffice/math/go-regression.c
@@ -255,14 +255,17 @@ go_regression_statl_get_type (void)
 
 static SUFFIX(GOQuadMatrix)
 *
-SUFFIX(quad_matrix_from_matrix) (CONSTMATRIX A, int m, int n)
+SUFFIX(quad_matrix_from_matrix) (CONSTMATRIX A, int m, int n, DOUBLE *scale)
 {
        int i, j;
        SUFFIX(GOQuadMatrix) *qA = SUFFIX(go_quad_matrix_new) (m, n);
 
-       for (i = 0; i < m; i++)
-               for (j = 0; j < n; j++)
-                       SUFFIX(go_quad_init) (&qA->data[i][j], A[i][j]);
+       for (i = 0; i < m; i++) {
+               for (j = 0; j < n; j++) {
+                       DOUBLE x = scale ? A[i][j] / scale[j] : A[i][j];
+                       SUFFIX(go_quad_init) (&qA->data[i][j], x);
+               }
+       }
 
        return qA;
 }
@@ -367,7 +370,7 @@ SUFFIX(go_linear_solve_multiple) (CONSTMATRIX A, MATRIX B, int n, int bn)
 
        state = SUFFIX(go_quad_start) ();
 
-       qA = SUFFIX(quad_matrix_from_matrix) (A, n, n);
+       qA = SUFFIX(quad_matrix_from_matrix) (A, n, n, NULL);
        qr = SUFFIX(go_quad_qr_new) (qA);
        if (!qr) {
                regres = GO_REG_invalid_data;
@@ -438,7 +441,7 @@ SUFFIX(go_matrix_invert) (MATRIX A, int n)
        gboolean ok;
 
        state = SUFFIX(go_quad_start) ();
-       qA = SUFFIX(quad_matrix_from_matrix) (A, n, n);
+       qA = SUFFIX(quad_matrix_from_matrix) (A, n, n, NULL);
        qZ = SUFFIX(go_quad_matrix_inverse) (qA, threshold);
        ok = (qZ != NULL);
        SUFFIX(go_quad_matrix_free) (qA);
@@ -463,7 +466,7 @@ SUFFIX(go_matrix_determinant) (CONSTMATRIX A, int n)
 
        state = SUFFIX(go_quad_start) ();
 
-       qA = SUFFIX(quad_matrix_from_matrix) (A, n, n);
+       qA = SUFFIX(quad_matrix_from_matrix) (A, n, n, NULL);
        SUFFIX(go_quad_matrix_determinant) (qA, &qres);
        SUFFIX(go_quad_matrix_free) (qA);
        res = SUFFIX(go_quad_value) (&qres);
@@ -1722,8 +1725,22 @@ SUFFIX(go_linear_regression_leverage) (MATRIX A, DOUBLE *d, int m, int n)
        void *state = SUFFIX(go_quad_start) ();
        GORegressionResult regres;
        DOUBLE threshold = DEFAULT_THRESHOLD;
+       DOUBLE *xscale, *Aj;
+       int i, j;
+
+       /*
+        * Leverages are independing of column scaling.
+        */
+       xscale = g_new (DOUBLE, n);
+       Aj = g_new (DOUBLE, m);
+       for (j = 0; j < n; j++) {
+               for (i = 0; i < m; i++)
+                       Aj[i] = A[i][j];
+               xscale[j] = SUFFIX(calc_scale) (Aj, m);
+       }
+       g_free (Aj);
 
-       qA = SUFFIX(quad_matrix_from_matrix) (A, m, n);
+       qA = SUFFIX(quad_matrix_from_matrix) (A, m, n, xscale);
        qr = SUFFIX(go_quad_qr_new) (qA);
        if (qr) {
                int k;
@@ -1771,6 +1788,8 @@ SUFFIX(go_linear_regression_leverage) (MATRIX A, DOUBLE *d, int m, int n)
        } else
                regres = GO_REG_invalid_data;
 
+       g_free (xscale);
+
        SUFFIX(go_quad_end) (state);
 
        return regres;
@@ -1802,7 +1821,7 @@ SUFFIX(go_matrix_pseudo_inverse) (CONSTMATRIX A, int m, int n,
        void *state;
 
        state = SUFFIX(go_quad_start) ();
-       qA = SUFFIX(quad_matrix_from_matrix) (A, m, n);
+       qA = SUFFIX(quad_matrix_from_matrix) (A, m, n, NULL);
        qZ = SUFFIX(go_quad_matrix_pseudo_inverse) (qA, threshold);
        SUFFIX(go_quad_matrix_free) (qA);
        if (qZ) {


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]