大工20秋《人工智能》大作业答案
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
学习中心:
专业:
年级:
学号:
学生:
题目:人工智能课程设计(回归算法)
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
#include
#include
#include
float average(int n,float *x) {int i;
float av;
av=0;
for(i=0;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 a+=(*(x+i))*(*(x+i)); return(a); } //和平方 float shpf(int n,float *x) {int i; float a,b; a=0; for(i=0;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 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 {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 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