matlab cftool代码_用Matlab来实现数据拟合

df5c9b38c69eda4c07582d9608ce70a8.png

面试官:你说你很喜欢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

34c91fd7b9aa0c306c9e2ce3397651e9.png

从上图可知,所得直线基本处于样本中间,而误差,即我们的指标,最终稳定到1,这里,我们的指标是前述J的二倍 。

顺便和大家说一下有关于Matlab出图的一个小技巧。当我们要把运行结果图放到论文中时,我们希望figure窗口的边框部分不要出现,操作如下:

1.点击文件:

7013cdc7063832609ac4ac213e4d0459.png

2.导出设置:

5f83eaf4538b23730e67e286baa5c6e9.png

3.√上这里:

3ed72f97d572916aa9a47c4017a0954b.png

关于运行结果:

误差可能可以进一步降低,因为我们收敛到的是局部极小值,并非是全局最小,进一步地优化我们的J,可以通过粒子群算法、遗传算法等仿生智能算法。

新的平台:

我的公众号:豪杰仿真科技

是我和我的搭档阿杰合作运行,阿杰是一位Python爱好者,数学建模老油条。我和阿杰将会把最新的内容推送到公众号,当然,我个人始终会在知乎上分享我的心得与经历。这里也感谢大家的支持。

PS:公众号会发布视频教程与讲解。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值