线性回归

#include <stdio.h>

#define MINDATA(a,b)    (a<b?a:b)

double calcAverage(double *x, int len)
{
    int i;
    double sum = 0;
    for(i=0;i<len;i++)
    {
        sum += x[i];
    }
    return sum / len;
}

void calc_Y_with_a_b(double *x, double *y, double b, double a, int len)
{
    int i;
    for(i=0;i<len;i++)
    {
        y[i] = x[i] * b + a;
    }
}

double calcVarianceSum(double *x, double xAverage, int len)
{
    int i;
    double sum = 0;
    for(i=0;i<len;i++)
    {
        sum += (x[i] - xAverage) * (x[i] - xAverage);
    }
    return sum;
}

double calcConvarianceSum(double *x, double *y, double xAverage, double yAverage, int len)
{
    int i;
    double sum = 0;
    for(i=0;i<len;i++)
    {
        sum += (x[i] - xAverage) * (y[i] - yAverage);
    }
    return sum;
}

double calcConvarianceSample(double *x, double *y, int len)
{
    int i;
    double sum = 0;
    for(i=0;i<len;i++)
    {
        sum += (x[i] - y[i]) * (x[i] - y[i]);
    }
    return sum / len;
}


double debugPrintfArray(double *x, int len, const char *file, int line)
{
    int i;
    printf("the array is in:%s,%d", file, line);
    for(i=0;i<len;i++)
    {
        if(i % 4 == 0)        
            printf("\\\n");    
        printf("%15.4lf ,", x[i]);
    }
    printf("\n");
    printf("\n");    
}


int main()
{
    double outY[] =
        {0.48 ,0.99 ,1.49 ,1.99 ,\
        2.51 ,3.00 ,3.52 ,3.99 ,\
        4.50 ,5.01 ,5.49 ,6.00 ,\
        6.51 ,7.01 ,7.49 ,8.00 ,\
        8.51 ,9.02 ,9.51 ,10.02 ,\
        10.51 ,11.01 ,11.49 ,12.00 ,\
        12.49 ,13.00 ,13.52 ,14.07 ,\
        14.52 ,14.99 ,};
/*    double sample[] = {         0.2680 ,         0.8752 ,         1.3828 ,         1.8706 ,\
         2.4578 ,         3.0650 ,         3.6424 ,         4.1799 ,\
         4.6875 ,         5.1753 ,         5.6531 ,         6.1010 ,\
         6.5489 ,         7.0068 ,         7.4945 ,         7.9723 ,\
         8.4601 ,         8.9478 ,         9.4356 ,         9.9432 ,\
        10.4708 ,        10.9884 ,        11.4960 ,        11.9937 ,\
        12.4914 ,        12.9991 ,        13.5067 ,        14.0044 ,\
        14.5121 ,        15.0098 ,
};*/
    double sample[] =
        {0.40 ,1.01 ,1.52 ,2.01 ,\
        2.60 ,3.21 ,3.79 ,4.33 ,\
        4.84 ,5.33 ,5.81 ,6.26 ,\
        6.71 ,7.17 ,7.66 ,8.14 ,\
        8.63 ,9.12 ,9.61 ,10.12 ,\
        10.65 ,11.17 ,11.68 ,12.18 ,\
        12.68 ,13.19 ,13.70 ,14.20 ,\
        14.71 ,15.21 ,};

    //y = bx+a
    double b,a;
    int sampleLen = MINDATA(sizeof(sample) / sizeof(double), sizeof(outY) / sizeof(double));
    printf("sample=%lu,out=%lu,uselen=%d\n", sizeof(sample) / sizeof(double), sizeof(outY) / sizeof(double), sampleLen);
    double xAver = calcAverage(sample, sampleLen);
    double yAver = calcAverage(outY, sampleLen);
    b = calcConvarianceSum(sample, outY, xAver, yAver, sampleLen) / calcVarianceSum(sample, xAver, sampleLen);
    a = yAver - xAver * b;
    printf("b=%lf,a=%lf\n", b, a);
    double varianceOrigin = calcConvarianceSample(outY, sample, sampleLen);
    double *ynew = new double[sampleLen];
    calc_Y_with_a_b(sample, ynew, b, a, sampleLen);
    double varianceNew = calcConvarianceSample(outY, ynew, sampleLen);    
    printf("v1=%lf,v2=%lf\n", varianceOrigin, varianceNew);
    debugPrintfArray(ynew, sampleLen, __FILE__, __LINE__);
    delete(ynew);
    return 1;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值