题目描述:
机器学习是人工智能的一个分支,是一门人工智能的科学,该领域的主要研究对象是人工智能,特别是如何在经验学习中改善具体算法的性能。随着人工智能技术的发展,机器学习领域也越来越受到重视。
回归分析预测法,是在分析市场现象自变量和因变量之间相关关系的基础上,建立变量之间的回归方程,并将回归方程作为预测模型,根据自变量在预测期的数量变化来预测因变量关系大多表现为相关关系,因此,回归分析预测法是一种重要的市场预测方法,是有监督分析的一类分支,当我们在对市场现象未来发展状况和水平进行预测时,如果能将影响市场预测对象的主要因素找到,并且能够取得其数量资料,就可以采用回归分析预测法进行预测。它是一种具体的、行之有效的、实用价值很高的常用市场预测方法。
题目中将给你多组数据,每组数据包含多对x-y的值。请你求出每组数据的线性回归方程,以及在x等于某个值时,对y的预测。
附线性回归方程公式:
输入格式:
共m组输入数据(m不给出),每组数据占三行:
第一行 n为数据个数, p为待预测的自变量数值;
第二行n个数据,表示该组数据的x值。
第三行n个数据,表示该组数据的y值,与第二行对应。
输出格式:
共m行,每行两个式子,中间用空格隔开,前半部分表示求得的回归方程,格式为y=bx+a(常数均保留两位小数),后半部分表示在x=p时对y的预测值,格式为predict=y(p),保留两位小数。具体格式请参考样例输出(例外:如果a=0,则前半部分输出为y=bx;如果b=0,则前半部分输出为y=a)。
行末没有多余空格,但是有换行符。
样例输入:
3 4
1 3 5
3 9 15
4 114514
1 2 3 4
4 4 4 4
样例输出:
y=3.00x predict=12.00
y=4.00 predict=4.00
数据范围:
0<m<=20
1<n<=50,000
|x|,|y|<=4,000
# include<stdio.h>
# include<math.h>
/*输入格式:
共m组输入数据(m不给出),每组数据占三行:
第一行 n为数据个数, p为待预测的自变量数值;
第二行n个数据,表示该组数据的x值。
第三行n个数据,表示该组数据的y值,与第二行对应。
输出格式:
共m行,每行两个式子,中间用空格隔开,前半部分表示求得的回归方程,
格式为y=bx+a(常数均保留两位小数),后半部分表示在x=p时对y的预测值,
格式为predict=y(p),保留两位小数。具体格式请参考样例输出(例外:如果a=0,
则前半部分输出为y=bx;如果b=0,则前半部分输出为y=a)。
行末没有多余空格,但是有换行符。
样例输入:
3 4
1 3 5
3 9 15
4 114514
1 2 3 4
4 4 4 4
样例输出:
y=3.00x predict=12.00
y=4.00 predict=4.00
数据范围:
0<m<=20
1<n<=50,000
|x|,|y|<=4,000*/
int numx[50001] = {0}, numy[50001] = {0};//函数外的全局变量存在静态区域,可以有几百M
//函数内局部变量存在栈, 最多几M
//这里数组较大,用全局变量或者malloc函数
int getn(int n)//读取x,y
{
for(int i = 0;i < n; i ++)
{
scanf("%d", &numx[i]);
}
for(int i = 0;i < n; i ++)
{
scanf("%d", &numy[i]);
}
return 0;
}
long long sum(int n, int num[])//求和
{//注意函数名前面的是返回值类型(类型不同会强制转换
//如果用指针操作则没有这样的问题
//这题目不讲武德,实际x,y远远超过4000
long long sum = 0;
for(int i = 0;i < n; i ++)
{
sum = sum + num[i];
}
return sum;
}
double avg(int n, long long sum)//求均值
{
double avg = 0.0;
avg = 1.0*sum /n;
return avg;
}
double calcu(int n,int numx[], int numy[],double* a, double* b,double avgx,double avgy)
{//计算a,b
double up = 0, low = 0;
for(int i = 0; i < n; i ++)
{
up = up + ((double)numx[i] - avgx) * ((double)numy[i] - avgy);
}
for(int i = 0; i < n; i ++)
{
low = low + ((double)numx[i] - avgx) * ((double)numx[i] - avgx);
}
*b = up / low;
*a = avgy - *b* avgx;
return 0;
}
int main()
{
int n, p[21]={0};//通过n来存储数字数目,这样就只要一个一维数组就行了
//每次读取就重新写入,要用时读到n即可,其他的不管
double a[21] = {0}, b[21] = {0},avgx,avgy;
long long sumx=0, sumy=0;
int i = 0;
while(1)
{
if(scanf("%d %d", &n, &p[i])!= EOF)
{
getn(n);
sumx = sum(n, numx);
sumy = sum(n, numy);
avgx = avg(n, sumx);
avgy = avg(n, sumy);
calcu(n,numx, numy, &a[i], &b[i], avgx, avgy);
i ++;
}
else
{
break;
}
}
for(int q = 0; q < i; q ++)//输出
{
if(fabs(a[q]) < 0.005)//题目是四舍五入后为0.00,则认为是0
{ //但是为了精度,预测值还是a,b不能视为0
printf("y=%.2lfx predict=%.2lf\n", b[q], p[q]*b[q]+a[q]);
}
else if(fabs(b[q]) < 0.005)
{
printf("y=%.2lf predict=%.2lf\n", a[q], p[q]*b[q]+a[q]);
}
else
{
if(a[q]>0)//注意a有符号,如为负数已经有-号 ,不用再写+
{
printf("y=%.2lfx+%.2lf predict=%.2lf\n", b[q], a[q], p[q]*b[q]+a[q]);
}
else
{
printf("y=%.2lfx%.2lf predict=%.2lf\n", b[q], a[q], p[q]*b[q]+a[q]);
}
}
}
return 0;
}