| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1048 人关注过本帖, 1 人收藏
标题:新手上路,求大神指教我输入数据之后怎么出不来结果啊??(一元线性回归)
只看楼主 加入收藏
潘潘7788
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2016-12-29
结帖率:100%
收藏(1)
已结贴  问题点数:20 回复次数:7 
新手上路,求大神指教我输入数据之后怎么出不来结果啊??(一元线性回归)
#include <stdio.h>
#include <math.h>
#define ARR_size 100
int main(void)
{
    double data[ARR_size][2];                           //数组data存放x,y
    double x_ave=0, y_ave=0, X_sum=0, y_sum=0;
    double Lxx=0, Lxy=0, Lyy=0;
    double x, y, a, b ,yi;
    double SquarePoor[ARR_size];
    float R;
    int i;
    int count=0;
    printf("Please enter at least 2 groups of x, y:\n ");
    printf("输入 -999,-999 表示输入结束!\n");
    while(1)
    {
          scanf("%d,%d",&x,&y);
          if(fabs(x+999) == 0&&fabs(y+999)== 0) break;
          data[count][0]=x;
          data[count][1]=y;
          count++;
    }
    for(i=0;i<(count+1);i++)
    {
       X_sum += data[i][0];
       y_sum += data[i][1];
    }
    x_ave=X_sum/(count+1);                                    // X平均值
    y_ave=y_sum/(count+1);                                    // Y平均值
    for(i=0;i<(count+1);i++)
    {
       Lxx += (data[i][0]-x_ave)*(data[i][0]-x_ave);      // Lxx = Sum((X - x_ave)平方)
       Lxy += (data[i][0]-x_ave)*(data[i][1]-y_ave);      // Lxy = Sum((X - x_ave)(Y - y_ave))
       Lyy += (data[i][1]-y_ave)*(data[i][1]-y_ave);      // Lyy = Sum((y - y_ave)平方)
    }
    a = Lxy / Lxx;
    b = y_ave - a * x_ave;
    SquarePoor[0] = SquarePoor[1] = 0;
    for ( i=0;i<(count+1);i++)
    {
        yi = a * data[i][0] + b;
        SquarePoor[0] += ((yi - y_ave) * (yi -y_ave ));           // U(回归平方和)
        SquarePoor[1] += ((data[i][1] - yi) * (data[i][1] - yi)); // Q(剩余平方和)
    }
    SquarePoor[2] = SquarePoor[0];                   // 回归方差
    SquarePoor[3] = SquarePoor[1] / (count - 1);     // 剩余方差
    printf("回归方程式:\n " );
    if(fabs(b) == 0)
    printf("y=%.5f * x\n",a);
    else if(b > 0)
    printf("y=%.5f * x + %.5f\n", a, b);
    else if(b < 0)
    printf("y = %.5f * x - %.5f\n", a, b);
    printf("回归显著性检验:\n ");
    printf("回归平方和:%12.4lf  回归方差:%12.4lf\n ", SquarePoor[0], SquarePoor[2]);
    printf("剩余平方和:%12.4lf  剩余方差:%12.4lf\n ", SquarePoor[1], SquarePoor[3]);
    printf("离差平方和:%12.4lf  标准误差:%12.4lf\n ", SquarePoor[0] + SquarePoor[1], sqrt(SquarePoor[3]));
    printf("F     验:%12.4lf  相关系数:%12.4lf\n ", SquarePoor[2] / SquarePoor[3], sqrt(SquarePoor[0] / (SquarePoor[0] + SquarePoor[1])));
    printf("剩余分析:\n ");
    printf("      观察值      估计值      剩余值    剩余平方 \n");
    for (i=0;i<(count+1);i++)
    {
        printf("%12.2lf%12.2lf%12.2lf%12.2lf\n",data[i][1],yi,data[i][1]-yi,(data[i][1]-yi)*(data[i][1]-yi));
    }
}
搜索更多相关主题的帖子: 新手上路 include double groups least 
2016-12-29 22:00
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:8 
double格式要用scanf("%lf,%lf",&x,&y);
其余的要你自己慢慢调试~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2016-12-29 22:08
潘潘7788
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2016-12-29
收藏
得分:0 
回复 2楼 九转星河
改了,一输完数据就出现程序崩溃,不知道怎么弄,能帮忙指导一下吗?谢谢谢谢
2016-12-29 22:17
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:2 
回复 3楼 潘潘7788
数学没学好~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2016-12-29 22:23
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:9 
回复 3楼 潘潘7788
在测试时加了些输出数据检验,可以对比一下原来你的,出错原因是count+1//执行最后一次循环数组越界而出错,你看看效果~~

程序代码:
#include <stdio.h>
#include <math.h>
#include<windows.h>
#define ARR_size 100
int main(void)
{
    double data[ARR_size][2];                           //数组data存放x,y
    double x_ave=0, y_ave=0, X_sum=0, y_sum=0;
    double Lxx=0, Lxy=0, Lyy=0;
    double x, y, a, b ,yi;
    double SquarePoor[ARR_size];
    float R;
    int i;
    int count=0;
    printf("Please enter at least 2 groups of x, y:\n ");
    printf("输入 -999,-999 表示输入结束!\n");
    while(1)
    {
          scanf("%lf,%lf",&x,&y);
          if(fabs(x+999) == 0&&fabs(y+999)== 0) break;
          data[count][0]=x;
          data[count][1]=y;
          count++;
    }
    for(i=0;i<(count);i++)//注意,count+1越界~~~~
    {
       X_sum += data[i][0];
       y_sum += data[i][1];


    }
    x_ave=X_sum/(count);                                    // X平均值
    y_ave=y_sum/(count);                                    // Y平均值

    for(i=0;i<(count);i++)
    {
       Lxx += (data[i][0]-x_ave)*(data[i][0]-x_ave);      // Lxx = Sum((X - x_ave)平方)
       Lxy += (data[i][0]-x_ave)*(data[i][1]-y_ave);      // Lxy = Sum((X - x_ave)(Y - y_ave))
       Lyy += (data[i][1]-y_ave)*(data[i][1]-y_ave);      // Lyy = Sum((y - y_ave)平方)

    }
    a = Lxy / Lxx;
    b = y_ave - a * x_ave;
    SquarePoor[0] = SquarePoor[1] = 0;
    for ( i=0;i<(count);i++)
    {
        yi = a * data[i][0] + b;
        SquarePoor[0] += ((yi - y_ave) * (yi -y_ave ));           // U(回归平方和)
        SquarePoor[1] += ((data[i][1] - yi) * (data[i][1] - yi)); // Q(剩余平方和)

    }
    SquarePoor[2] = SquarePoor[0];                   // 回归方差
    SquarePoor[3] = SquarePoor[1] / (count - 1);     // 剩余方差
    printf("回归方程式:\n " );
    if(fabs(b) == 0)
    printf("y=%.5f * x\n",a);
    else if(b > 0)
    printf("y=%.5f * x + %.5f\n", a, b);
    else if(b < 0)
    printf("y = %.5f * x - %.5f\n", a, b);
    printf("回归显著性检验:\n ");
    printf("回归平方和:%12.4lf  回归方差:%12.4lf\n ", SquarePoor[0], SquarePoor[2]);
    printf("剩余平方和:%12.4lf  剩余方差:%12.4lf\n ", SquarePoor[1], SquarePoor[3]);
    printf("离差平方和:%12.4lf  标准误差:%12.4lf\n ", SquarePoor[0] + SquarePoor[1], sqrt(SquarePoor[3]));
    printf("F   检  验:%12.4lf  相关系数:%12.4lf\n ", SquarePoor[2] / SquarePoor[3], sqrt(SquarePoor[0] / (SquarePoor[0] + SquarePoor[1])));
    printf("剩余分析:\n ");
    printf("      观察值      估计值      剩余值    剩余平方 \n");
    for (i=0;i<(count);i++)
    {
        printf("%12.2lf%12.2lf%12.2lf%12.2lf\n",data[i][1],yi,data[i][1]-yi,(data[i][1]-yi)*(data[i][1]-yi));
    }
}


[此贴子已经被作者于2016-12-29 22:42编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2016-12-29 22:40
潘潘7788
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2016-12-29
收藏
得分:0 
回复 5楼 九转星河
输入完就这样了,没显示程序错误,但下面的算法怎么都不运行啊,程序里面的算法应该没有问题,是不是逻辑有错误啊还是程序连接有问题?
图片附件: 游客没有浏览图片的权限,请 登录注册
2016-12-29 23:14
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:1 
我的没有问题啊,copy5楼的试试看~

图片附件: 游客没有浏览图片的权限,请 登录注册

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2016-12-29 23:21
潘潘7788
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2016-12-29
收藏
得分:0 
回复 7楼 九转星河
嗯嗯,好了,太感谢了!
2016-12-30 19:06
快速回复:新手上路,求大神指教我输入数据之后怎么出不来结果啊??(一元线性回 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.021270 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved