一、课程设计的目的与要求
1、目的
《机器学习》课程的实践性很强,不经过动手编程实践不可能达到理想的学习效果。本课程设计把机器学习的基本模型与实际问题相结合,培养学生对基本原理的应用能力以及实际动手能力。
2、要求
独立完成课程设计编程任务以及课程设计报告。要撰写详尽的课程设计报告。报告格式要规范,从学校网站下载相应的 word 文件来撰写报告。报告内容应包括算法原理、各种训练曲线、测试结果和结果分析、改变参数后的影响、开发中遇到的问题以及解决方法。编程实现语言不限。不允许多人一组,课程设计报告雷同者,成绩均为不合格。
二、设计正文和实验结论
实验一:回归和分类的线性模型
具体需要完成的任务如下:
(1)使用的两种基函数分别是幂基函数和高斯基函数,推导的梯度如下:
(2)选择的拟合函数、参数设置、取ai、bi过程,绘制拟合曲线、训练过程、迭代过程变化曲线如下:
需要最终转换的形式:
选择拟合的函数:y=sin(4x)+cos(5x)
参数设置:(可以在这里更改α、β、噪声、步长等等)
迭代过程的变化曲线,通过我们的plt.ion()交互模式来绘制(验收已展示)
我们选取训练次数为1000次,基函数为幂函数、改变各大参数的结果如图所示:
程序运行时间和训练时间我们通过 start = datetime.datetime.now() 来计算
这里利用时间差计算出运行时间,方便和后面调库做对比
参数设置成这样时,训练1000次的幂函数的结果如下:
结果分析说明:第一张图为拟合的曲线动态变化过程,最终可以看到是接近于蓝色小点的,拟合效果也是动态可以看出,从外围的曲线变化到最终中间,第二张图片是输出最后一次的拟合结果,而红色的曲线是原函数,可以看到拟合效果也还不错,第三张图片是误差函数-f(w),看得出来训练一百来次的时候,误差基本变化不大了,而且也是一个梯度下降的单调递减过程。(作图补充:虽然老师给的点只有六个而我选了十个,看起来很少的间断点,但是我们只需要得到预测的模型后,带入x为等差数列的点就可以得到拟合模型的曲线)
同时,我们还打印出了训练模型在测试集上的误差及误差分析,上述训练1000次后,可以得到程序运行时间为2秒,选取十个测试样本点的均方误差为0.33,而分类的正确率为:98%。
下面介绍运行时间、生成回归测试集合分类测试集的方法和得到各项相差误差、均方误差的方法:
运行时间,通过start和end得到datetime.datetime.now()的时间后,进行计算得到
而我们的测试集是通过h1设置要生成几个测试点,利用random.random()生成一个0到1的随机符点数,这里减去0.5再乘以2用于x控制在-1到1之间。
然后利用原函数代入点的y值,与训练模型预测值对比相差计算得到每个点的误差值,比较直观。
计算均方误差是利用了sklearn库函数:
sm.mean_squared_error(test_y1,list1) #sklearn求均方误差的的库函数,(实际值,预测值)
我把测试集和预测集对应的点都各放在一个一开始为空的列表中,代入库函数后得到均方误差。这里因为代入的参数要是二维且一一对应,所以我利用
list1=[c for a in predict_y1 for b in a for c in b] #把三维列表转一维列表,才可以代入sklearn的库函数求均分误差
而噪声是这样生成:np.random.normal(loc=0.0, scale=ee, size=None) #正态分布中抽取随机数,作为均值为0,标准差为0.03的高斯噪声
代码如下:
同理,分类测试集也是这样生成,不过判断分类是否正确,我是先把预测值的结果存在于列表中,然后把测试集的原函数得到结果(根据sigmod函数得到只有1和-1)也放在另一个列表,然后用if条件进行两个列表数据的一一相乘,通过符号判断是否分类正确。
同理,还是上面图片的参数,我们把基函数换成高斯函数训练1000次得到:
结果分析说明:可以看到,我们采取一样的参数,高斯函数作为基函数拟合效果比幂函数更好,我们再通过在一个文件同时实现两个基函数的回归和分类得到高斯函数的结果如下:
可以看到,采取相同数据的回归测试集和分类测试集,对两种基函数进行对比分析得到:两个运行时间一样都是两秒,但是高斯函数的拟合效果更好,均方误差也是0.04,比上面的0.33更低,看的出来最后一次训练图像更靠近原函数的图像,对比分类正确率也可以知道100%比98%更高,种种迹象表明高斯函数作为基函数更加符合我们的任务要求。
下面我们调库函数和我们手写的程序进行对比分析:
第一个库函数是调用sklearn的基函数为幂函数的训练模型
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures
from sklearn.pipeline import Pipeline
from sklearn.metrics import mean_squared_error
我们分别采取15个点、50个训练点进行分析,同时对幂函数多项式的次数取1、2、3、4、5、6、7、8进行对比,再跟前面我们自己的模型进行对比分析:
先看15个点的训练点的调库结果:
再看看50个样本点的:
结果分析:可以看到我们调用基函数为幂函数的sklearn库得到的拟合结果中,大概在幂函数的次数为6的时候就成功拟合,且样本点越多越能够直观发现,后面次数高了后拟合效果更加符合原函数 y=sin(4x)+cos(5x),同时均分误差从0.8到0.001也是随次数增高而下降,与我自己写的0.33相比,调库的误差更低,同时模型训练时间只有零点几秒,几乎可以忽略不记,个人觉得是因为调库调用了多核,也是多线程并行的训练方法,比我自己的程序运行快的多,同时人家封装的底层代码训练效率更高。
再看看调用sklearn库的高斯函数为基函数的结果:
from sklearn.gaussian_process import GaussianProcessRegressor
from sklearn.gaussian_process.kernels import RBF
结果分析:这里我采取了五十个样本点进行拟合,图中橙色曲线是原函数的图像;蓝色是拟合回归的曲线;绿色是加了高斯噪声后的原函数图像,在拟合函数相同的情况下,调sklearn的高斯函数库所用时间仅需0点几秒,几乎可以忽略不记,可能的改进之处是进行多线程的调用和对参数进行改进,对取点个数进行探究,才有可能降低程序的模型训练时间。
第一个实验的最后一个重要任务:改变噪声 ε 的方差 c,改变超参数 α、β,改变梯度上升法的步长 h,重新训练模型, 并按照上述方式给出训练过程,拟合结果,测试误差。
下面采用控制变量法来进行探究,这里只给出模型改变参数后的训练结果,以减少篇幅:
基函数为幂函数,取项数为9,记超参数 为α、β,噪声 ε 的方差 c为ee、梯度上升法的步长为 h训练次数都选择500次。(减少程序运行时间,快速得出结果)
(由于-f(w)都差不多,下面不给出了,结果对比只给出训练迭代过程图像和最后一次输出的图像)
α为0.001、β为4,ee为0.03,h为0.01时:
α为0.01、β为4,ee为0.03,h为0.01时:
α为0.3、β为4,ee为0.03,h为0.01时:
α为1、β为4,ee为0.03,h为0.01时:
α为10、β为4,ee为0.03,h为0.01时:
α为100、β为4,ee为0.03,h为0.01时:
改变α结果分析:可以发现α取值越小,曲线拟合得越好,而α越大越欠拟合,在个位数的时候就已经基本没办法拟合向原函数了。
α为0.01、β为0.01,ee为0.03,h为0.01时:
α为0.01、β为0.1,ee为0.03,h为0.01时:
α为0.01、β为3,ee为0.03,h为0.01时:
α为0.01、β为10,ee为0.03,h为0.01时:
α为0.01、β为50,ee为0.03,h为0.01时:
α为0.01、β为100,ee为0.03,h为0.01时:
这里数据量太大,直接程序把电脑跑炸了。
改变β结果分析:β较小时,处于欠拟合状态,在接近1、2、3这些数据时,拟合效果开始有展现,而当处于10时,拟合效果非常好,在大于10甚至再大一些就处于过拟合了。
α为0.01、β为8,ee为0.03,h为0.01时:
α为0.01、β为8,ee为0.3,h为0.01时:
α为0.01、β为8,ee为3,h为0.01时:
α为0.01、β为8,ee为30,h为0.01时:
改变ee结果分析:高斯噪声太大,在拟合函数图像过程中会出现某些点数据上下浮动特别明显,尤其在左右坐标轴的两边,大概在取值0.03到0.3且左右浮动0.01这种数据量时处于合理的拟合区间。
α为0.01、β为8,ee为0.03,h为0.001时:
α为0.01、β为8,ee为0.03,h为0.005时:
α为0.01、β为8,ee为0.03,h为0.01时:
α为0.01、β为8,ee为0.03,h为0.1时:
改变步长h的结果分析:步长较小处于欠拟合,在0.01时候拟合效果较好,再大一些时候程序就出现数据量过大,f(w)无法计算的结果了。
下面是基函数为高斯函数,取项数为10,记超参数 为α、β,噪声 ε 的方差 c为ee、梯度上升法的步长为 h训练次数都选择500次。(减少程序运行时间,快速得出结果)
α为0、β为4,ee为0.03,h为0.01时:
α为0.01、β为4,ee为0.03,h为0.01时:
α为0.1、β为4,ee为0.03,h为0.01时:
α为1、β为4,ee为0.03,h为0.01时:
改变α的结果分析:α越接近于0,拟合效果越好,趋向1甚至更大的值时候,出现欠拟合的情况。
α为0.01、β为0,ee为0.03,h为0.01时:
α为0.01、β为1,ee为0.03,h为0.01时:
α为0.01、β为5,ee为0.03,h为0.01时:
α为0.01、β为10,ee为0.03,h为0.01时:
改变β的结果分析:β在趋近于5时候达到最好的拟合效果,而在趋近于0处于欠拟合,再大于5过后趋近于过拟合。即β是精度相关超参数,增大后拟合效果更好,但是过大会过拟合。
α为0.01、β为5,ee为0,h为0.01时:
α为0.01、β为5,ee为0.03,h为0.01时:
α为0.01、β为5,ee为3,h为0.01时:
α为0.01、β为5,ee为10,h为0.01时:
改变ee的结果分析:ee的改变会导致某些某些点可能不在拟合曲线或者原理的情况,在ee过大时候,会出现欠拟合的情况。
实验二:MNIST数据库的K-均值聚类
先上网下载minist数据集,同时去csdn上列举这个数据集的格式是怎么样的,如何排布,怎么取出数据等等:
通过细心研究如下
K 均值聚类算法的迭代公式如下:
算法迭代过程如下:
步骤 操作
1 确定聚类的数量,即值;
2 在数据集中随机初始化个样本作为初始聚类中心 ;
3 针对数据集中每个样本 计算它到个聚类中心的欧几里得距离并将其分到距离最小的聚类中心所对应的类中;
4 针对每个类别 , 重新计算它的聚类中心 (即属于该类的质心);
5 反复迭代上面3、4两步操作,直达到某个中止条件
#初始化u ,使用数据中每个数字的一个作为每类ui的初始中心
更新U如下:
误差率计算
目标函数 J 在迭代过程中的变化曲线 :迭代15次可以看到一个下降的过程。
在我们设置参数分为10类,迭代15次得出的结果:
聚类完成后,每一类选一张代表性的图片输出
取出的十个代表性图片,我们还可以看到它原来的标签并做对比
分类的正确率和程序的运行时间也得出如下:
我们甚至还可以根据选取的第几行判断这个数字长什么样并输出图像,并和原来的标签做对比
这里选第66666行的数据,则输出图像为:
从结果来看这个数字是7,同时和原标签对比,我们的训练模型聚类得到的结果是正确的。
随机选取聚类中心的初始值,并把聚类数目改为9,我们得到以下结果:
取10086行数据可以打印出图片:
得到的九类每一类的代表性图片如下:
聚类的结果为:
聚类的运行时间为:
调库的运行时间和结果如下:
这里为了可视化效果更好,运用了PCA降维
这里是每一块区域分类后还分不同的颜色,更加直观,可以看出调库时间短到只有0.33秒,非常离谱。
调库还有第二种程序如下:
该调库方法得到的结果如下:先是每一类训练样本得到的十个代表性图片
左下角是原来的样本标签![在这里插入图片描述](https://img-blog.csdnimg.cn/f6a8a1c36dfa42f294be0eb0e40a0b6c.png
其次是降维再分类后得到十种颜色不同的分类区域
还有混淆矩阵,可以查看模型哪块做的不够好
上面是测试集选取进行聚类分析的测试结果,可以看到左下角标红的就是识别不正确的图片。
得到的识别正确率为:0.833333333333333
,明显比我的百分之五十多高得多。
结果分析:我们可以看出,调库无论是程序运行时间还是正确率,都比我们直接实现的模型更加的优化、快速,且进行pca降维后,可视化效果会更加直观,从时间上的600多秒、800多秒到调库的0.33秒可以看出,sklearn库的功能是多么强大,查阅相关资料和咨询同学得知,这是因为调库是启用了多线程、多核进行运算,能够充分调动计算机的性能,而不是像我们写的单核程序一样运行缓慢,所以这也是调用现成库给我们程序员带来的巨大便利。同时,无监督学习和有监督学习的不一样地方我们也可以感受到,就是训练集和测试集的选取,在无监督学习,即实验二这边,是70000个数据集即可当训练集,也可以当测试集,这就给我们对有无监督的学习了解的更加透彻。
附录(设计程序、调库程序等)
实验一:幂函数为基函数的代码附录
高斯函数为基函数的代码附录
实验二
手写数字识别,输出代表性聚类图片的程序
设计的课设程序和调库的程序,笔者都放在资料区提供下载。
文件内容具体形式:
笔者介绍:某智科卑微牛马,一项省级大创已结项,一项国家级大创和一项校级大创已成功立项,都交给小自己一届的学弟去做,参加的挑战杯项目在其余队友参加大创后也获得了省级优秀和国家级优秀结项。同时组织并担任了2022年挑战杯、两项互联网+、电子商务大赛、舞蹈机器人大赛的队长,并参加过节能减排大赛、调研河北大赛、数学建模美赛、蓝桥杯省赛、机器人国赛等比赛若干,获得过舞蹈机器人一等、电子商务大赛二等、挑战杯三等、节能减排省一等、创新创业优秀个人、社会实践优秀个人、冬奥云支教等奖项。
程序下载说明:作者所有的实验、课设验收基本都是优,也不缺这几米,不过不想自己的文章或者作品烂大街,想留点门槛,应该是几米这样子,作品都是保证高质量的,给有需要的学弟学妹们学习,大部分还是免费的,因为一些大型的文件不好上传,故放在付费资料区下载,真的非常良心!!