当前位置:文档之家› 大工20秋《人工智能》大作业答案

大工20秋《人工智能》大作业答案

学习中心:
专业:
年级:
学号:
学生:
题目:人工智能课程设计(回归算法)
1.谈谈你对本课程学习过程中的心得体会与建议?
经过一学期的网上学习,我对《人工智能》这门课程有了初步的认识,人工智能这门课程内容新颖,涉及计算机知识非常广,学习起来极富挑战性,学到的知识在未来我们的工作中用处也非常大,当然,这门课也比较深奥,单单《人工智能》只是一个入门,后面我也会在课后继续深入学习有关人工智能这方面的知识。

在学习过程中我始终跟随老师视频讲解,严格要求自己,收获很大。

老师的讲解深入浅出,在学识知识的同时,也激发了我的学习兴趣。

我由衷的感谢老师的教导,感谢老师们不辞辛苦录制课件,感谢自己能获得这次宝贵的学习机会。

2.《人工智能》课程设计,从以下5个题目中任选其一作答。

《人工智能》课程设计
题目二:回归算法
要求:(1)撰写一份word文档,里面包括(常见的回归算法、基于实例的算法具体细节)章节。

(2)常见的回归算法包括:最小二乘法(Ordinary Least
Square),逻辑回归(Logistic Regression),逐步式回归
(Stepwise Regression),多元自适应回归样条
(Multivariate Adaptive Regression Splines)以及本地散点
平滑估计(Locally Estimated Scatterplot Smoothing),请
选择一个算法描述下算法核心思想
(3)随意选用一个实例实现你所选择的回归算法。

答:
(1)最小二乘法算法核心思想
最小二乘法原理如下:
根据一组给定的实验数据,求出自变量x与因变量y的函数关系,只要求在给定点上的误差的平方和最小.当时,即
(1)
这里是线性无关的函数族,假定在上给出一组数据,以及对应的一组权,这里为权系数,要求使最小,其中
(2)
(2)中实际上是关于的多元函数,求I的最小值就是求多元函数I的极值,由极值必要条件,可得
(3)
根据内积定义引入相应带权内积记号
(4)
则(3)可改写为
这是关于参数的线性方程组,用矩阵表示为
(5) (5)称为法方程.当线性无关,且在点集
上至多只有n个不同零点,则称在X上满足Haar条件,此时(5)的解存在唯一。

记(5)的解为
从而得到最小二乘拟合曲线
(6)
可以证明对,有
故(6)得到的即为所求的最小二乘解.它的平方误差为
(7)
均方误差为
在最小二乘逼近中,若取,则,表示为
(8)
此时关于系数的法方程(5)是病态方程,通常当n≥3时都不直接取作为基。

(2)最小二乘法C语言实例实现
输入:已知点的数目以及各点坐标。

输出:根据最小二乘法原理以及各点坐标求出拟合曲线。

程序流程:
程序:
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include<malloc.h>
float average(int n,float *x) {int i;
float av;
av=0;
for(i=0;i<n;i++)
av+=*(x+i);
av=av/n;
return(av);
}
//平方和
float spfh(int n,float *x)
{int i;
float a,b;
a=0;
for(i=0;i<n;i++)
a+=(*(x+i))*(*(x+i));
return(a);
}
//和平方
float shpf(int n,float *x)
{int i;
float a,b;
a=0;
for(i=0;i<n;i++)
a=a+*(x+i);
b=a*a/n;
return(b);
}
//两数先相乘,再相加
float dcj(int n,float *x,float *y) {int i;
float a;
a=0;
for(i=0;i<n;i++)
a+=(*(x+i))*(*(y+i));
return(a);
}
//两数先相加,再相乘
float djc(int n,float *x,float *y) {int i;
float a=0,b=0;
for(i=0;i<n;i++)
{a=a+*(x+i);
b=b+*(y+i);
}
a=a*b/n;
return(a);
}
//系数a
float xsa(int n,float *x,float *y) {float a,b,c,d,e;
a=spfh(n,x);
b=shpf(n,x);
c=dcj(n,x,y);
d=djc(n,x,y);
e=(c-d)/(a-b);
//printf("%f %f %f %f",a,b,c,d);
return(e);
}
float he(int n,float *y)
{int i;
float a;
a=0;
for(i=0;i<n;i++)
a=a+*(y+i);
return(a);
}
float xsb(int n,float *x,float *y,float a)
{ float b,c,d;
b=he(n,y);
c=he(n,x);
d=(b-a*c)/n;
return(d);
}
void main()
{ int n,i;
float *x,*y,a,b;
printf("请输入将要输入的有效数值组数n的值:"); scanf("%d",&n);
x=(float*)calloc(n,sizeof(float));
if(x==NULL)
{printf("内存分配失败");
exit(1);
}
y=(float*)calloc(n,sizeof(float));
if(y==NULL)
{printf("内存分配失败");
exit(1);
}
printf("请输入x的值\n");
for(i=0;i<n;i++)scanf("%f",x+i);
printf("请输入y的值,请注意与x的值一一对应:\n"); for(i=0;i<n;i++)scanf("%f",y+i);
for(i=0;i<n;i++)
{ printf("x[%d]=%3.2f ",i,*(x+i));
printf("y[%d]=%3.2f\n",i,*(y+i));
}
a=xsa(n,x,y);
b=xsb(n,x,y,a);
printf("经最小二乘法拟合得到的一元线性方程为:\n"); printf("f(x)=%3.2fx+%3.2f\n",a,b);
}。

相关主题