2.算数运算

MATLAB的基本算术运算符有:+(加)、-(减)、*(乘)、/(右除)、\(左除)、^(乘方)和' (转置)

(1)矩阵加法

在线性代数中,只有两个大小完全相同的矩阵才可以进行相加,而在MATLAB中,只要两个矩阵的大小兼容,就能够进行计算。

以下是一些具有兼容大小的标量、向量和矩阵的组合:

  • 两个大小完全相同的输入。
  • 一个输入是标量。
  • 一个输入是矩阵,另一个输入是具有相同行数的列向量。
  • 一个输入是矩阵,另一个输入是具有相同列数的行向量。
  • 一个输入是列向量,另一个输入是行向量。

    A = randi(9,3,4)
    B = randi(15,3,4)
    C = A + B       %两个矩阵大小一样
    D = A + 5       %和标量相加
    E = randi(9,3,1)
    F = A + E      %3x4矩阵加3x1列向量,矩阵每一列都和列向量相加
    G = randi(9,1,4)
    H = A + G      %3x4矩阵加1x4行向量,矩阵每一行都和行向量相加
    I = E + G      %3x1列向量加1x4行向量,最后结果为3x4矩阵
(2)矩阵减法

矩阵的减法和加法相同

A = randi(9,3,4)
B = randi(15,3,4)
C = A - B       %两个矩阵大小一样
D = A - 5       %和标量相减
E = randi(9,3,1)
F = A - E      %3x4矩阵减3x1列向量,矩阵每一列都和列向量相减
G = randi(9,1,4)
H = A - G      %3x4矩阵减1x4行向量,矩阵每一行都和行向量相减
I = E - G      %3x1列向量减1x4行向量,最后结果为3x4矩阵
(3)矩阵乘法

在MATLAB中,矩阵的乘法分为两种:

一种是线性代数中定义的矩阵的乘法,使用的运算符号是乘号“*”,例如矩阵A*B,矩阵的乘法必须要满足前面矩阵A的列数和后面矩阵B的行数相等(符合线性代数的要求);

另一种是“按对应位置的元素运算”的乘法,使用的运算符号是点乘 “.*” ,例如A.*B,这时A和B的大小只需要满足上方表格介绍的五种兼容模式。

特别的,如果一个矩阵和常数相乘,那么使用乘号“*”和点乘“.*”得到的结果相同。

A = randi(9,2,3)
B = randi(9,3,2)
C = A * B       %矩阵A*B,矩阵的乘法必须要满足前面矩阵A的列数和后面矩阵B的行数相等
D = randi(9,2,3)
E = randi(9,2,3)
F = D .* E      %对应元素相乘,但要符合matlab的兼容模式。
G = 5 * E
H = 5 .* E      %GH结果一样
(4)矩阵除法

事实上,在我们学的线性代数中,矩阵并不能进行除法的运算,但MATLAB中定义了矩阵的除法的计算规则。

在MATLAB中,除号有两种,分别是 /(右除) 和 \(左除):(可以把这个符号想象成一个梯子,梯子靠在哪边墙上就是哪边的除法)

用的更多的是对矩阵进行点除的操作,即将两个矩阵按对应位置的元素做除法。

命令“A ./ B”表示用A的每个元素除以B的对应元素,A和B的大小必须兼容;

命令“A .\ B”则表示用B的每个元素除以A的对应元素,这个用法不太符合我们的习惯。

因此,大家只需要掌握点右除“A ./ B”的用法即可。特别地,如果B是标量,那么A./B的结果和A/B的结果相同。

%命令“x = B/A”表示对线性方程组x*A = B求解x;
B = randi(9,3,3)
A = randi(9,3,3)
X = B / A
B_ = X * A          %验证一下,结果一样
%命令“x1 = A\B”则表示对线性方程组A*x = B求解x。
X1 = A \ B 
B__ = A * X1        %验证一下,结果一样
C = B ./ A          %B中对应元素除以A中的
D = B .\ A          %A中对应元素除以B中的
E = B ./ 5
(5)矩阵的乘方

矩阵的乘方也有两种用法,分别是“^”和“.^”。

“^”表示矩阵的幂运算,例如A是一个方阵,那么A ^ 3等价于A*A*A;

“.^”表示对矩阵中的每一个元素分别进行乘方计算,例如A .^ 0.5表示对矩阵A中的每一个元素开根号。

A = randi([0,9],2,2)
B = A ^ 3       %这个是符合线性代数的矩阵相乘,A*A*A
C = A .^ 3      %这个是矩阵中的每个元素的三次幂
(6)矩阵逆运算

逆矩阵:设A是一个n阶矩阵,若存在另一个n阶矩阵B,使得: AB=BA=E ,则称方阵A可逆,并称方阵B是A的逆矩阵 

如果A是一个可逆的方阵,那么A^(-1)可用来计算A的逆矩阵(inverse matrix)。另外,MATLAB中的inv函数也可以计算逆矩阵,它们的计算结果相同。

format  short
A = [1 2 3;
    2 2 1;
    3 4 3]
B = A ^ (-1)
B1 = inv(A)
E = A * B       %由于MATLAB使用浮点数计算矩阵的逆存在一定的误差,因此,实际上A*B接近但不完全等于单位矩阵。
(7)矩阵的转置

矩阵的转置符号为英文的单引号:“ ’ ”,它也可以在前面加上点变成“ .’ ”,两者的区别在于对矩阵中复数的处理,使用“ ’ ”会在转置的同时将复数变为共轭复数,使用“.’”则会保持原来的复数。

A = [ 3     1+3i;
      2     5;
      4-2i  6]
A'          %变成共轭复数
A.'         %不变
(8)评价预测结果指标

假设真实值向量 y  = [$y_1$ $y_2$ $y_3$ ... $y_n$] ,拟合值或预测值是向量 $\hat{y}$ = [$\hat{y_1}$ $\hat{y_2}$ $\hat{y_3}$ ... $\hat{y_n}$ ]  

1)SSE 误差(或残差)平方和(Sum of Squares due to Error)

范围[0,+∞),当预测值与真实值完全吻合时等于0。误差越大,该值越大。它的量纲是原来数据量纲的平方。

2)MSE 均方误差(Mean Square Error)

就是SSE除了一个n,范围[0,+∞),当预测值与真实值完全吻合时等于0。误差越大,该值越大。

它的量纲是原来数据量纲的平方。 

3)RMSE: 均方根误差(Root Mean Square Error)

其实就是MSE加了个根号,范围[0,+∞),当预测值与真实值完全吻合时等于0。误差越大,该值越大。它的量纲和原来数据的量纲相同。 

4)MAE: 平均绝对误差(Mean Absolute Error)

范围[0,+∞),当预测值与真实值完全吻合时等于0。误差越大,该值越大。

它的量纲和原来数据的量纲相同。 

5)MAPE: 平均绝对百分比误差(Mean Absolute Percentage Error)

该公式通常将值乘以100,以百分比形式表示数字。

范围[0,+∞),当预测值与真实值完全吻合时等于0。

可以看到,MAPE跟MAE很像,就是多了个分母。

注意:当真实值有数据等于0时,存在分母为0的问题,该公式不可用! 

6)SMAPE:对称平均绝对百分比误差(Symmetric Mean Absolute Percentage Error)

它的范围是0%到200%,当预测值与真实值完全吻合时等于0。

注:有些地方定义的SMAPE的分母没有加绝对值,这时候SMAPE可能为负数。

7)R^{2}:决定系数、可决系数、R方、拟合优度(Coefficient of determination)

注意:如果使用的是线性回归模型,那么上面两种计算R方的公式都可以使用,且此时R方的范围是[0,1] 

如果使用的是非线性回归模型,那么R方使用的是第一种定义方法!且此时R方的范围是(-\infty,1].

(线性回归中,两种方法算出来的R方一定相等。非线性回归中只能使用第一种方法计算,第二种算出来的结果是错的!)

所有代码如下所示:

%y是真实值,y_hat是拟合值
y = [100 102 108 117 135 178 198 241 290 349];
y_hat = [93 108 118 117 141 170 196 249 296 359];
n = length(y)       %总体数量n=10
%SSE:误差平方和
SSE = sum((y - y_hat) .^2)
%MSE:均方误差
MSE = mean((y - y_hat) .^2)
%RMSE:均方根误差
RMSE = sqrt(mean((y - y_hat) .^2))
%MAE:平均绝对误差
MAE = mean(abs(y - y_hat))
%MAPE:平均绝对百分比误差
MAPE = mean(abs((y - y_hat) ./ y))
%SMAPE:平均绝对百分比误差,我们可以将这个数乘以100,那么它的单位为%
SMAPE = mean(abs(y - y_hat) ./ ((abs(y) + abs(y_hat)) ./2))*100
%R^2:决定系数
RR = 1 - (sum((y - y_hat).^2) ./ sum((y - mean(y)).^2))
RR_ = sum((y_hat - mean(y)) .^2) ./ sum((y - mean(y)) .^2)
%两种计算结果不一样,所以说明我们的模型是非线性的模型,只能使用第一种方法计算
(9)优化算法中常见的测试函数

在优化算法中,测试函数(或称为基准函数)是用来评估优化算法性能的一组数学函数。这些函数通常具有已知的最优解,且具有不同的特性和复杂性,以便全面测试优化算法的效果。

在应用数学中,测试函数可用于评估优化算法的特性,例如:

  • 收敛速度。
  • 精度。
  • 鲁棒性。
  • 一般性能。
    X = 1:10;
    a = X([1:end-1])
    b = X([2:end])
    %Sphere函数:
    S = sum(X .^2)
    %Rastrigin函数:
    R = sum(X .^2 - 10*cos(2*pi*X) + 10)
    %Griewank函数
    G = 1/4000 * sum(X .^2) - prod(cos(X./sqrt(X(1:end)))) + 1
    %Rosebrock
    Ro = sum(100*(b - a.^2).^2 + (a - 1).^2)

    参考:数学建模清风老师《MATLAB教程新手入门篇》https://www.bilibili.com/video/BV1dN4y1Q7Kt/  

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐