大工20秋《人工智能》大作業(yè)答案
大連理工大學遠程與連續(xù)教育學院《人工智能》課程設計
學習中心:
專 業(yè):
年 級:
學 號:
學 生:
題 目: 人工智能課程設計〔回歸算法〕
1. 談談你對本課程學習過程中的心得體會與建議?
經過一學期的網上學習,我對《人工智能》這門課程有了初步的生疏,人工智能這門課程內容穎,涉及計算機學問格外廣,學習起來極富挑戰(zhàn)性,學到的學問在將來我們的工作中用處也格外大,固然,這門課也比較淺顯,單單《人工智能》只是一個入門,后面我也會在課后連續(xù)深入學習有關人工智能這方面的學問。在學習過程中我始終跟隨教師視頻講解,嚴格要求自己,收獲很大。教師的講解深入淺出,在學識學問的同時,也激發(fā)了我的學習興趣。我由衷的感謝教師的教育,感謝教師們不辭辛苦錄制課件,感謝自己能獲得這次貴重的學習時機。
2. 《人工智能》課程設計, 從以下 5 個題目中任選其一作答。
《人工智能》課程設計
題目二:回歸算法
要 求:〔1〕撰寫一份word 文檔,里面包括〔常見的回歸算法、基于實例的算法具體細節(jié)〕章節(jié)。
(2) 常見的回歸算法包括:最小二乘法〔 Ordinary Least Square〕,規(guī)律回歸〔Logistic Regression〕,逐步式回歸
〔 Stepwise Regression 〕 , 多 元 自 適 應 回 歸 樣 條
大連理工大學遠程與連續(xù)教育學院《人工智能》課程設計
〔Multivariate Adaptive Regression Splines〕以及本地散點平滑估量〔Locally Estimated Scatterplot Smoothing〕,請選擇一個算法描述下算法核心思想
(3) 隨便選用一個實例實現(xiàn)你所選擇的回歸算法。
答:
(1) 最小二乘法算法核心思想最小二乘法原理如下:
依據一組給定的試驗數(shù)據
關系,只要求在給定點 上的誤差當 時,即
,求出自變量 x 與因變量 y 的函數(shù)
的平方和 最小.
(1)
這里
是線性無關的函數(shù)族,假定在
上給出一組
數(shù)據
數(shù) ,
要
求
,
以及對應的一組權 ,這里
使 最 小
為權系
, 其 中
(2)
(2)中 實際上是關于 的多元函數(shù),求 I 的最小值就是求多元函數(shù) I 的極值,由極值必要條件,可得
依據內積定義引入相應帶權內積記號
(3)
(4)
則(3)可改寫為
大連理工大學遠程與連續(xù)教育學院《人工智能》課程設計
這是關于參數(shù) 的線性方程組,用矩陣表示為
(5)
(5)稱為法方程.當
上至多只有 n 個不同零點,則稱存在唯一。記(5)的解為
從而得到最小二乘擬合曲線
可以證明對
線性無關,且在點集
在 X 上滿足 Haar 條件,此時(5)的解
(6)
,有
故(6)得到的 即為所求的最小二乘解.它的平方誤差為
(7)
均方誤差為
在最小二乘靠近中,假設取表示為
,則 ,
(8)
此時關于系數(shù) 的法方程(5)是病態(tài)方程,通常當 n≥3 時都不直接取作為基。
(2) 最小二乘法 C 語言實例實現(xiàn)
輸入:點的數(shù)目以及各點坐標。
輸出:依據最小二乘法原理以及各點坐標求出擬合曲線。
大連理工大學遠程與連續(xù)教育學院《人工智能》課程設計
程序流程:
程序:
#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);
}
//平方和
大連理工大學遠程與連續(xù)教育學院《人工智能》課程設計
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);
}
//兩數(shù)先相乘,再相加
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);
}
//兩數(shù)先相加,再相乘
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);
}
//系數(shù) 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(“請輸入將要輸入的有效數(shù)值組數(shù)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);
}