清空命令行和工作区和窗口
命令行越来越长,是不是觉得很烦呢
clear all//清空工作区
close all//清空窗口
clc//清空命令行
爽吗
绘图
向量的设定
大多数绘图函数首先是要从向量入手的,因为图是一个点的序列。
外部导入散点
这是Excel文件形式中的数据
在当前的目录中找到目标文件
右击得到导入数据
然后你懂得
具体还有load
、textread
、save
等命令,以及c语言自带的fopen
和fprintf
等函数。笔者忙死了,以后写。
程序内部定义
线性间距向量
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+...+ainxn−bi)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(B−AX)=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=1nxiyi∑i=1nyi]/[∑i=1nxi2∑i=1nxi∑i=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);