33
void av_init_lls(LLSModel *m, int indep_count){
33
void av_init_lls(LLSModel *m, int indep_count)
34
35
memset(m, 0, sizeof(LLSModel));
36
m->indep_count= indep_count;
36
m->indep_count = indep_count;
39
void av_update_lls(LLSModel *m, double *var, double decay){
39
void av_update_lls(LLSModel *m, double *var, double decay)
42
for(i=0; i<=m->indep_count; i++){
43
for(j=i; j<=m->indep_count; j++){
43
for (i = 0; i <= m->indep_count; i++) {
44
for (j = i; j <= m->indep_count; j++) {
44
45
m->covariance[i][j] *= decay;
45
m->covariance[i][j] += var[i]*var[j];
50
void av_solve_lls(LLSModel *m, double threshold, int min_order){
52
double (*factor)[MAX_VARS+1]= (void*)&m->covariance[1][0];
53
double (*covar )[MAX_VARS+1]= (void*)&m->covariance[1][1];
54
double *covar_y = m->covariance[0];
55
int count= m->indep_count;
57
for(i=0; i<count; i++){
58
for(j=i; j<count; j++){
59
double sum= covar[i][j];
62
sum -= factor[i][k]*factor[j][k];
67
factor[i][i]= sqrt(sum);
69
factor[j][i]= sum / factor[i][i];
72
for(i=0; i<count; i++){
73
double sum= covar_y[i+1];
75
sum -= factor[i][k]*m->coeff[0][k];
76
m->coeff[0][i]= sum / factor[i][i];
79
for(j=count-1; j>=min_order; j--){
81
double sum= m->coeff[0][i];
83
sum -= factor[k][i]*m->coeff[j][k];
84
m->coeff[j][i]= sum / factor[i][i];
87
m->variance[j]= covar_y[0];
89
double sum= m->coeff[j][i]*covar[i][i] - 2*covar_y[i+1];
91
sum += 2*m->coeff[j][k]*covar[k][i];
92
m->variance[j] += m->coeff[j][i]*sum;
97
double av_evaluate_lls(LLSModel *m, double *param, int order){
46
m->covariance[i][j] += var[i] * var[j];
51
void av_solve_lls(LLSModel *m, double threshold, int min_order)
54
double (*factor)[MAX_VARS + 1] = (void *) &m->covariance[1][0];
55
double (*covar) [MAX_VARS + 1] = (void *) &m->covariance[1][1];
56
double *covar_y = m->covariance[0];
57
int count = m->indep_count;
59
for (i = 0; i < count; i++) {
60
for (j = i; j < count; j++) {
61
double sum = covar[i][j];
63
for (k = i - 1; k >= 0; k--)
64
sum -= factor[i][k] * factor[j][k];
69
factor[i][i] = sqrt(sum);
71
factor[j][i] = sum / factor[i][i];
76
for (i = 0; i < count; i++) {
77
double sum = covar_y[i + 1];
79
for (k = i - 1; k >= 0; k--)
80
sum -= factor[i][k] * m->coeff[0][k];
82
m->coeff[0][i] = sum / factor[i][i];
85
for (j = count - 1; j >= min_order; j--) {
86
for (i = j; i >= 0; i--) {
87
double sum = m->coeff[0][i];
89
for (k = i + 1; k <= j; k++)
90
sum -= factor[k][i] * m->coeff[j][k];
92
m->coeff[j][i] = sum / factor[i][i];
95
m->variance[j] = covar_y[0];
97
for (i = 0; i <= j; i++) {
98
double sum = m->coeff[j][i] * covar[i][i] - 2 * covar_y[i + 1];
100
for (k = 0; k < i; k++)
101
sum += 2 * m->coeff[j][k] * covar[k][i];
103
m->variance[j] += m->coeff[j][i] * sum;
108
double av_evaluate_lls(LLSModel *m, double *param, int order)
101
for(i=0; i<=order; i++)
102
out+= param[i]*m->coeff[order][i];
113
for (i = 0; i <= order; i++)
114
out += param[i] * m->coeff[order][i];
110
121
#include <stdio.h>
131
av_lfg_init(&lfg, 1);
116
132
av_init_lls(&m, 3);
118
for(i=0; i<100; i++){
134
for (i = 0; i < 100; i++) {
121
var[0] = (rand() / (double)RAND_MAX - 0.5)*2;
122
var[1] = var[0] + rand() / (double)RAND_MAX - 0.5;
123
var[2] = var[1] + rand() / (double)RAND_MAX - 0.5;
124
var[3] = var[2] + rand() / (double)RAND_MAX - 0.5;
138
var[0] = (av_lfg_get(&lfg) / (double) UINT_MAX - 0.5) * 2;
139
var[1] = var[0] + av_lfg_get(&lfg) / (double) UINT_MAX - 0.5;
140
var[2] = var[1] + av_lfg_get(&lfg) / (double) UINT_MAX - 0.5;
141
var[3] = var[2] + av_lfg_get(&lfg) / (double) UINT_MAX - 0.5;
125
142
av_update_lls(&m, var, 0.99);
126
143
av_solve_lls(&m, 0.001, 0);
127
for(order=0; order<3; order++){
128
eval= av_evaluate_lls(&m, var+1, order);
144
for (order = 0; order < 3; order++) {
145
eval = av_evaluate_lls(&m, var + 1, order);
129
146
printf("real:%9f order:%d pred:%9f var:%f coeffs:%f %9f %9f\n",
130
var[0], order, eval, sqrt(m.variance[order] / (i+1)),
131
m.coeff[order][0], m.coeff[order][1], m.coeff[order][2]);
147
var[0], order, eval, sqrt(m.variance[order] / (i + 1)),
148
m.coeff[order][0], m.coeff[order][1],