![df5c9b38c69eda4c07582d9608ce70a8.png](https://i-blog.csdnimg.cn/blog_migrate/ab048f8b084832ad182f941786e6df64.jpeg)
面试官:你说你很喜欢Matlab,那你知道Matlab全名叫什么吗?
我:(你这分不是白给么?呼呼)Matrix Laboratory
——————————————————————————————————————
这几天集中精力用Python刷Leetcode,感觉挺爽,不用一个劲地import。某题搞到时间超过百分之九十八,内存超过百分百,飘飘然的感觉。
——————————————————————————————————————
正文
这篇文章主要写写基础点的东西,正值毕业季,相信很多喜欢Matlab但是又对Matlab不熟悉的小伙伴、或者是希望能独立使用Matlab完成毕业设计的小伙伴,都需要一些基础性的小项目或者小程序来练练手。
这里呢,有些经验的朋友可能都知道,用polyfit可以直接实现一元函数的拟合。那现在,我们就像前面所说,不要“import”,就是不要用那些数学函数,来实现我们这个拟合。
今天的例子呢就是一个简单的一元线性函数的拟合。拟合呢,通俗地说,就是找到一条目标曲线(直线),使得所有样本点到该直线的指标的总和最优。这个指标,可以使用均方误差,这个总和呢,就是均方误差的累和。
对于样本,我们通过下面两条语句来产生
x
由于是目标是一元线性函数,所以只需要确定两个参数即可,k,b,k为斜率,b为直线对y轴的截距。
这里需要产生一对初始参数,选用的方法是:
k
我们的实际输出为y',我们希望最后我们得到的直线能够满足以下指标:
其中n为我们的样本数,在这里就是100
由于
再回忆一下我们高等数学中的偏导知识,我们利用梯度下降法来更新我们的斜率,使得我们的指标最优:
上述两式分别为指标对k和b的梯度,所谓梯度下降,就是让我们的指标中的参数沿着负梯度变化,也就是k和b分别沿着指标对各自的偏导的负值进行变化,于是得到
但同时我们不希望k,b变化过大,出现梯度爆炸的情况,所以我们希望有一个比较小的数,来缩小单次k和b的变化量,于是我们得到:
通过多次迭代,使得指标J能够满足我们的要求,或者是:当我们的两个梯度很小时,比如我们设定到小于0.001,这样可以认为我们的J将基本不变,于是得到J的极小值。
具体程序:
test_x
运行结果:
![9dfd0eb74d59225f8b272f7488f2840a.png](https://i-blog.csdnimg.cn/blog_migrate/69ead69216c989fd38f6ff8f524e8eea.png)
![34c91fd7b9aa0c306c9e2ce3397651e9.png](https://i-blog.csdnimg.cn/blog_migrate/830e53be4f660313afedbc9920b03648.png)
从上图可知,所得直线基本处于样本中间,而误差,即我们的指标,最终稳定到1,这里,我们的指标是前述J的二倍 。
顺便和大家说一下有关于Matlab出图的一个小技巧。当我们要把运行结果图放到论文中时,我们希望figure窗口的边框部分不要出现,操作如下:
1.点击文件:
![7013cdc7063832609ac4ac213e4d0459.png](https://i-blog.csdnimg.cn/blog_migrate/c6f4937a990d82645aa4d231c41537cd.png)
2.导出设置:
![5f83eaf4538b23730e67e286baa5c6e9.png](https://i-blog.csdnimg.cn/blog_migrate/70dfe9be76a6a31b7f2790b96342ab23.png)
3.√上这里:
![3ed72f97d572916aa9a47c4017a0954b.png](https://i-blog.csdnimg.cn/blog_migrate/dbaf313d587d50a096db6b6356002ac1.png)
关于运行结果:
误差可能可以进一步降低,因为我们收敛到的是局部极小值,并非是全局最小,进一步地优化我们的J,可以通过粒子群算法、遗传算法等仿生智能算法。
新的平台:
我的公众号:豪杰仿真科技
是我和我的搭档阿杰合作运行,阿杰是一位Python爱好者,数学建模老油条。我和阿杰将会把最新的内容推送到公众号,当然,我个人始终会在知乎上分享我的心得与经历。这里也感谢大家的支持。
PS:公众号会发布视频教程与讲解。