2021-02-01美赛前MATLAB的学习笔记(清空、绘图、拟合(不含机器学习))

清空命令行和工作区和窗口

命令行越来越长,是不是觉得很烦呢

clear all//清空工作区
close all//清空窗口
clc//清空命令行

爽吗

绘图

向量的设定

大多数绘图函数首先是要从向量入手的,因为图是一个点的序列。

外部导入散点

这是Excel文件形式中的数据
在这里插入图片描述
在当前的目录中找到目标文件
在这里插入图片描述
右击得到导入数据
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

然后你懂得
具体还有loadtextreadsave等命令,以及c语言自带的fopenfprintf等函数。笔者忙死了,以后写。

程序内部定义
线性间距向量
y = linspace(x1,x2,n)

or

y=x1:d:x2

生成x1到x2的线性间距向量,第一句默认n是100,表示多少个点,第二句中d为间距

示例

输入以下代码

x=0:0.01:pi;
y=sin(x);
plot(x,y,'-b')

结果如下
在这里插入图片描述
这里有个小细节,如果语句后面不加分号,command窗口(命令行窗口)会输出一片数字,很不雅。加了分号后,只会存在workspace(工作栏)中。

随机数

rand函数的值全是(0,1)的(伪)随机数

X = rand

返回一个数

X = rand(n)

返回n*n的矩阵

X = rand(m,n)

返回m*n的矩阵

X = rand([3,2,3])

返回三维矩阵

X = rand(size(p))

这个对于输入前未知大小的数据有效

随机数后还能加参数定类型
比如:

X = rand(size(p),'like',p)

or

X = rand(size(p),class(r))

指和p一样的数据类型
也可以:

r = rand(1,4,'single')

另外常用的
随机整数:

r = randi([10 50],1,5)

生成值为10到50之间的1*5矩阵

plot函数

这是最基本的绘图函数 最新版本的MATLAB里已经可以在绘图工具栏里第一个位置看到它【都不需要写代码了】
(当然我们还是有必要了解代码怎么写,有助于整体代码框架的形成)

  • plot(X,Y) 创建 Y 中数据对 X 中对应值的二维线图。

  • 如果 X 和 Y 都是向量,则它们的长度必须相同。plot 函数绘制 Y 对 X 的图。

  • 如果 X 和 Y 均为矩阵,则它们的大小必须相同。plot 函数绘制 Y 的列对 X 的列的图。

  • 如果 X 或 Y 中的一个是向量而另一个是矩阵,则矩阵的各维中必须有一维与向量的长度相等。如果矩阵的行数等于向量长度,则 plot 函数绘制矩阵中的每一列对向量的图。如果矩阵的列数等于向量长度,则该函数绘制矩阵中的每一行对向量的图。如果矩阵为方阵,则该函数绘制每一列对向量的图。

  • 如果 X 或 Y 之一为标量,而另一个为标量或向量,则 plot 函数会绘制离散点。但是,要查看这些点,您必须指定标记符号,例如 plot(X,Y,‘o’)。

更加具体地:

设置线型、颜色、标记
plot(X,Y,LineSpec)

LineSpec是一个字符串,用来设置线型、标记符号和颜色,这三者的顺序可以任意。默认是实线无标记颜色随机的曲线。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

设置线宽、标记大小、标记颜色

比如:

plot(x,y,'--gs',...
    'LineWidth',2,...
    'MarkerSize',10,...
    'MarkerEdgeColor','b',...
    'MarkerFaceColor',[0.5,0.5,0.5])

详见官网(整得花里胡哨那么好吗)
https://ww2.mathworks.cn/help/matlab/ref/matlab.graphics.chart.primitive.line-properties.html

后补:简写的那几种颜色也太丑了吧
在这里插入图片描述
默认的这几种颜色就很养眼
在这里插入图片描述

绘制多条曲线
plot(x1,y1,x2,y2,...)

所有的曲线使用同一个坐标区,当然,每条曲线后面也可以设置参数

设置标题和标签
title('2-D Line Plot')
xlabel('x')
ylabel('cos(5x)')

使用这三个函数

特殊的时间格式
t = 0:seconds(30):minutes(3);
y = rand(1,7);
plot(t,y,'DurationTickFormat','mm:ss')
保留之前的图像
hold on//保留之前的
hold off//取消保留

surf、meshgrid、plot3函数

surf函数用来画三维着色曲面图,plot3是一般三维曲线图
surfc附加等高线
surfl附加光照

meshgrid函数

我们需要借助meshgrid生成网格采样点,meshgrid的作用大概如下,比如

x=1:3;
y=10:14;
[X,Y] = meshgrid(x,y)

X =

 1     2     3
 1     2     3
 1     2     3
 1     2     3
 1     2     3

Y =

10    10    10
11    11    11
12    12    12
13    13    13
14    14    14

默认meshgrid(x)等价于meshgrid(x,x)

surf函数
x = -2:0.25:2;
y = x;
[X,Y] = meshgrid(x);
F = X.*exp(-X.^2-Y.^2);
surf(X,Y,F)

在这里插入图片描述

plot3函数
x = -2:0.25:2;
y = x;
[X,Y] = meshgrid(x);
F = X.*exp(-X.^2-Y.^2);
plot3(X,Y,F)

在这里插入图片描述

gscatter函数

绘制散点图

gscatter(x,y,g,clr,sym,siz,doleg,xnam,ynam)

color, symbol, size ,是否图例,默认有,x坐标名,y坐标名
输入的时候是字符向量,比如程序里’kk’ 'x’意思是两个都是黑色,一个是叉一个是圈。

拟合

多项式曲线拟合

polyfit函数

多项式拟合函数

p=polyfit(x,y,n)

n是阶数

polyval函数

多项式计算函数,用来验算拟合程度

y1=polyval(p,x1)
例子

代码好像写乱了 图中拟合阶数不同 绿色的是生成的函数,红色紫色是不同阶数的拟合
记得最后输入axis equal让坐标轴等长
在这里插入图片描述

线性回归

使用LinearModel模型
m2=LinearModel.fit(x,y)
使用regress函数

regress是多元线性回归函数

标准的返回格式如下

Y=y';
X=[ones(size(x,2),1),x'];
[b,bint,r,rint,s]=regress(Y,X)

b包含了我们要的参数
所以懒惰点就写

Y=y';
X=[ones(size(x,2),1),x'];
b=regress(Y,X)

size(x,2)表示,只查询x第二个维度的长度,也就是说
x为1*n大小的数组,返回值是n。
bint是b的置信区间
r是残差(列向量)
s是state 包括一些参数,用来分析线性回归的模型是否精确,比如决定系数 R 2 R^2 R2,它约接近1,表示模型越有效。

regress函数可以多元线性回归
对于因变量y和多个自变量x1,x2,x3,代码如下

X=[ones(n,1),x1',x2',x3'];
[b,bint,r,rint,s]=regress(Y',X)
小拓展:最小二乘回归

最小二乘回归是一元线性回归。

很早就看到最小二乘法了,然后学线代的时候也在附录看到了最小二乘法,陈维新老师讲得通俗易懂。(据汤树元说以后要换教材了,有点不舍)

所以笔者尝试抛开百度上常见的用微积分证明方法(令斜率和偏置值的偏导为0),用线性代数的角度写。

书里讲到,最小二乘解就是非齐次线性方程组无解的时候,找一个向量X,使 ∑ i = 1 n ( a i 1 x 1 + a i 2 x 2 + . . . + a i n x n − b i ) 2 \sum_{i=1}^n(a_{i1}x_1+a_{i2}x_2+...+a_{in}x_n-b_i)^2 i=1n(ai1x1+ai2x2+...+ainxnbi)2最小。

再抽象一点,令系数矩阵A=( α 1 , α 2 , . . . , α n \alpha_1,\alpha_2,...,\alpha_n α1,α2,...,αn),最小二乘解是找一个向量X,使X到L( α 1 , α 2 , . . . , α n \alpha_1,\alpha_2,...,\alpha_n α1,α2,...,αn)的欧式距离最短,那就自然而然想到投影啦。

即(B-AX)⊥L( α 1 , α 2 , . . . , α n \alpha_1,\alpha_2,...,\alpha_n α1,α2,...,αn)

A T ( B − A X ) = 0 A^T(B-AX)=0 AT(BAX)=0 A T A X = A T B A^TAX=A^TB ATAX=ATB

对于一元线性回归的一组数据 [X,Y],我们要拟合斜率k和偏置值b
{ k x 1 + b = y 1 k x 2 + b = y 2 . . . k x n + b = y n \left\{ \begin{aligned} kx_1+b=y_1\\ kx_2+b=y_2\\ ...\\ kx_n+b=y_n \end{aligned} \right. kx1+b=y1kx2+b=y2...kxn+b=yn

得到线性方程组,我们目标是求 S = [ k , b ] T S=[k,b]^T S=[k,b]T
化简得
S = [ ∑ i = 1 n x i y i ∑ i = 1 n y i ] / [ ∑ i = 1 n x i 2 ∑ i = 1 n x i ∑ i = 1 n x i n ] S= \left[ \begin{matrix} \sum_{i=1}^nx_iy_i \\ \sum_{i=1}^ny_i \end{matrix} \right]/\left[ \begin{matrix} \sum_{i=1}^nx_i^2 & \sum_{i=1}^nx_i \\ \sum_{i=1}^nx_i & n \end{matrix} \right] S=[i=1nxiyii=1nyi]/[i=1nxi2i=1nxii=1nxin]
上面果然推错了?怪不得线代没有满绩, A T A A^TA ATA是可逆的,直接乘逆就好了。。。

对于多元的,可以同理再拓展几列,鬼知道我推导的对不对,但是这个和百度的有几分神似,而且通过这个方程,我们更好理解上面那个regress函数里为什么有一列是全为1,一列是x1,一列是x2这样的,看我的线性方程组就顿悟了吧。
算了,贴上代码

Lxx=sum((x-mean(x)).^2);
Lxy=sum((x-mean(x)).*(y-mean(y)));
b1=Lxy/Lxx;
b0=mean(y)-b1*mean(x);
y1=b1*x+b0;

非线性回归

使用fitnlm模型

记忆:Fit nonlinear regression model

先自己定义一个非线性函数,设定需要拟合的参数,然后用fitnlm拟合,如果有看不懂的,详见第一篇笔记。

用法

mdl = fitnlm(X,y,modelfun,beta0)

示例:

m1=@(b,x)b(1)+b(2)*log(x);
nonlinfit1=fitnlm(x,y,m1,[0.01;0.01]);
m1=@(b,x)b(1)*x^b(2);
nonlinfit1=fitnlm(x,y,m1,[1;1]);

or

m1='y~b1*x^b2';
nonlinfit1=fitnlm(x,y,m1,[1;1]);

用列向量y作为响应变量(因变量),矩阵X的列作为预测变量(自变量),拟合一个非线性回归模型。
m1是指定模型,上面代码分别是对数和指数作为模型,模型可以是函数句柄,也可以是字符向量或字符串标量公式,上述代码的b1,b2是标量。
beta0数组,即[0.01;0.01],是初始值。
可以通过模型输出的 R 2 R^2 R2来比较模型合适度。

下面是把系数用到函数表达式里

b=nonlinfit1.Coefficients.Estimate;
y1=b(1,1)+b(2,1)*log(x);

学一下英语,coefficient 是系数的意思,estimate是预测、估计的意思

小拓展:直接调用模型(这部分真在瞎扯,好像是网络模型才能用,先挖坑)

训练的模型,用predict函数调用模型

y1=predict(nonlinfit1,x);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

萧易风船长

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值