You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
119 lines
2.5 KiB
119 lines
2.5 KiB
|
|
#include <iostream> |
|
|
|
void linear(double *x, double *y, int len, double *k, double *b) |
|
{ |
|
if (len < 2) |
|
{ |
|
return; |
|
} |
|
double xsum = 0; |
|
double ysum = 0; |
|
double xysum = 0; |
|
double x2sum = 0; |
|
for (int i = 0; i < len; i++) |
|
{ |
|
xsum += x[i]; |
|
ysum += y[i]; |
|
xysum += x[i] * y[i]; |
|
x2sum += x[i] * x[i]; |
|
} |
|
double xbar = xsum / len; |
|
double ybar = ysum / len; |
|
double xybar = xysum / len; |
|
double x2bar = x2sum / len; |
|
*k = (xybar - xbar * ybar) / (x2bar - xbar * xbar); |
|
*b = ybar - (*k) * xbar; |
|
} |
|
|
|
double loss(double *x, double *y, int len) |
|
{ |
|
double k, b; |
|
linear(x, y, len, &k, &b); |
|
double losssum = 0; |
|
for (int i = 0; i < len; i++) |
|
{ |
|
losssum += (k * x[i] + b - y[i]) * (k * x[i] + b - y[i]); |
|
} |
|
double lossavg = losssum / len; |
|
return lossavg; |
|
} |
|
|
|
double *lossline(double *x, double *y, int len) |
|
{ |
|
int i = 1; |
|
double *losspoint = (double *)malloc(sizeof(double) * len); |
|
for (; i < len; i++) |
|
{ |
|
losspoint[i - 1] = loss(x, y, i + 1); |
|
} |
|
return losspoint; |
|
} |
|
|
|
void mysort(double *x, double *y, int len) |
|
{ |
|
for (int i = 0; i < len; i++) |
|
{ |
|
for (int j = 0; j < i; j++) |
|
{ |
|
if (x[i] < x[j]) |
|
{ |
|
double temp = x[i]; |
|
x[i] = x[j]; |
|
x[j] = temp; |
|
temp = y[i]; |
|
y[i] = y[j]; |
|
y[j] = temp; |
|
} |
|
} |
|
} |
|
} |
|
|
|
void pointat(double *x, double *y, int len, int *result) |
|
{ |
|
mysort(x, y, len); |
|
double *ll = lossline(x, y, len); |
|
double *smothll = (double *)malloc(len * sizeof(double)); |
|
for (int i = 0; i < len; i++) |
|
{ |
|
int start = i - 5; |
|
int end = i + 5; |
|
if (start < 0) |
|
{ |
|
start = 0; |
|
} |
|
if (end > len) |
|
{ |
|
end = len; |
|
} |
|
double sum = 0; |
|
for (int count = start; count < end; count++) |
|
{ |
|
sum += ll[count]; |
|
} |
|
smothll[i] = sum / (end - start); |
|
} |
|
double *a = (double *)malloc(sizeof(double) * len - 10); |
|
for (int i = 5; i < len - 5; i++) |
|
{ |
|
int s1 = 0; |
|
for (int j = i - 5; j < i + 5; j++) |
|
{ |
|
s1 += smothll[j]; |
|
} |
|
s1 = s1 - 10 * smothll[i]; |
|
a[i - 5] = s1; |
|
} |
|
|
|
int index = 5; |
|
double max = a[0]; |
|
for (int i = 0; i < len - 10; i++) |
|
{ |
|
if (a[i] > max) |
|
{ |
|
max = a[i]; |
|
index = i + 5; |
|
} |
|
} |
|
*result = index; |
|
}
|
|
|