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

#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;
}