[goffice] go_linear_regression_leverage: prescale.
- From: Morten Welinder <mortenw src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [goffice] go_linear_regression_leverage: prescale.
- Date: Mon, 15 Jul 2013 20:45:49 +0000 (UTC)
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]