专题五 数据分析与多项式计算
一 数据统计分析
本部分主要包括求最大元素与最小元素、求平均值与中值、求和与求积、累加和与累乘积、求标准差与相关系数、排序等。
1. 求矩阵的最大元素和最小元素
- max():求向量或矩阵的最大元素。
- min():求向量或矩阵的最小元素。
上述两函数的调用格式相同。以下以max函数为例进行介绍,min函数的用法与以下介绍相同。
当函数参数为向量时,函数有两种调用格式:
- y=max(X):返回向量X的最大值存入y。如果X中包含复数元素,则按模取最大值。
- [y, k]=max(X):返回向量X的最大值存入y,最大值元素的序号存入k。如果X中包含复数元素,则按模取最大值。
举个例子:求向量x的最大元素及最大元素的位置。
clear; clc;
x = [-43, 72, 9, 16, 23, 47];
[y, k] = max(x)
运行结果显示y=72, k=2。
当函数参数为矩阵时,函数有三种调用格式:
- max(A):返回一个行向量。向量的第i个元素是矩阵A的第i列上的最大值。
- [Y, U]=max(A):返回行向量Y和U。向量Y记录矩阵A的每列的最大值,向量U记录每列最大值元素的行号。
- max(A, [], dim):dim取1或者2。当dim取1时,该函数的功能和max(A)完全相同,按列取最大值;当dim取2时,按行取最大值,该函数返回一个列向量,其第i个元素是矩阵A的第i行上的最大值。
举个例子:求矩阵A的每行及每列的最大元素,并求整个矩阵的最大元素。
clear; clc;
A = [13, -56, 78; 25, 63, -235; 78, 25, 563; 1, 0, -1];
% 求矩阵A的每列的最大元素及最大元素的位置
[y1, k1] = max(A);
% 求矩阵A的每行的最大元素及最大元素的位置
[y2, k2] = max(A, [], 2);
% or [y2, k2] = max(A');
% 求整个矩阵的最大元素
y = max(max(A));
% or y = max(y1); or y = max(y2);
工作空间中保存的变量如下:
用什么方法只调用一次max函数就能求得整个矩阵的最大值?
clear; clc;
A = [13, -56, 78; 25, 63, -235; 78, 25, 563; 1, 0, -1];
[y, k] = max(A(:)); % 采用A(:)的方法将矩阵元素按列堆叠,形成一个列向量
运行结果显示y=563, k=11。
2. 求矩阵的平均值和中值
- 平均值指的是算术平均值,即每项数据之和除以数据的项数。
- 中值:指在数据序列中,其值的大小处在中间的元素。如果数据个数为奇数,则取值为大小位于中间的元素;如果数据个数为偶数,则取中间两个元素的平均值。
有了平均值,为什么还要中值?
因为平均值容易受少数极端数据的影响。
在MATLAB中求矩阵的平均值和中值:
- mean():求算术平均值。
- median():求中值。
上述两个函数的调用方式与max函数相似。
3. 求和与求积
在MATLAB中,对向量和矩阵进行求和与求积的函数如下:
- sum():求和函数。
- prod():求积函数。
上述两个函数的调用方式与max函数相似。
4. 累加和与累乘积
在MATLAB中,对向量和矩阵进行累加和与累乘积的函数如下:
- cumsum():累加和函数。
- cumprod():累乘积函数。
举个例子:求向量X=[1,2,3,4,5,6,7,8,9,10]的积与累乘积。
5. 标准差与相关系数
标准差
其中,S1称为样本标准差,S2称为总体标准差。在MATLAB中用于计算数据序列标准差的函数是std()。std函数有3种调用格式:
- std(X):计算向量X的标准差。
- std(A):计算矩阵A的各列的标准差。
- std(A,flag,dim):其中flag取值为0或1。当flag=0时,按S1所列公式计算样本标准差;当flag=1时,按S2所列公式计算总体标准差。dim的用法与max函数中相同。默认情况下,flag=0, dim=1(即计算各列的样本标准差)。
相关系数
r越接近于0,说明两组数据序列越不相关;|r|越接近于1,说明两组数据序列越相关。在MATLAB中计算两组数据序列之间相关系数的函数是corrcoef()。corrcoef函数有两种调用格式:
- corrcoef(A):返回由矩阵A所形成的的一个相关系数矩阵。其中,第i行第j列的元素表示原矩阵A中第i列与第j列之间的相关系数。
- corrcoef(X,Y):这里的X,Y是向量。它们与corrcoef([X,Y])的作用一样,用于求向量X,Y之间的相关系数。
6. 排序
在MATLAB中采用函数sort()对向量或矩阵进行排序。调用格式如下:
- sort(X):对向量X按升序排序。
- [Y, I] = sort(A, dim, mode):其中,dim指明对矩阵A的列还是行进行排序。mode指明按升序还是降序进行排序,若取'ascend',则按升序排序,若取'descend',则按降序排序,默认情况下,采用升序排序。输出参数中,Y是排序后的矩阵,而I记录了Y中的元素在A中的位置。
------------------------------------------------------------------------------------------------------------------------
二 多项式计算
1. 多项式的表示
2. 多项式的四则运算
加减运算直接用系数向量做加减。乘法用函数conv(),除法采用函数deconv()。用时具体查。
3. 多项式的求导
4.多项式的求值
采用的函数如下:
- polyval(p,x):代数多项式求值。
- polyvalm(p,x):矩阵多项式求值。
polyval(p,x)中,p为多项式系数向量,x可以是标量,向量或矩阵。若x是标量,则求多项式在该点的值;若x为向量或矩阵,则对向量或矩阵中的每个元素求多项式的值。
polyvalm(p,x)要求x为方阵,以方阵为自变量求多项式的值。(这里需要理解以方阵为自变量的意思)
当x是方阵时,polyvalm(p,x)与polyval(p,x)的含义是不同的。polyval(p,x)是对方阵x中每个元素求多项式的值;而polyvalm(p,x)不同。例如:设x是方阵,p代表多项式x³-5x²+8,那么polyvalm(p,x)的含义是x*x*x-5*x*x+8*eye(size(x));而polyval(p,x)的含义是x.*x.*x-5*x.*x+8*ones(size(x))。
5. 多项式求根
采用函数roots(p),其中p是多项式的系数向量。若已知多项式的全部根,则可以用poly函数建立起该多项式,其调用格式为:p=poly(x)。
------------------------------------------------------------------------------------------------------------------------
三 数据插值
数据插值可以根据有限个点的取值状况,合理估算出附近其他点的取值,从而节约大量的实验和测试资源,节省大量的人力,物力和财力。
interp1():一维插值函数。
其调用格式:Y1=interp1(X, Y, X1, method),根据X, Y的值,计算函数在X1处的值。其中,X, Y是两个等长的已知向量,分别表示采样点和采样值。X1是一个向量或标量,表示要插值的点。输出参数Y1是一个与X1等长的插值结果。method表示某种特定的插值方法,method取值不同,所得到的结果也不同。method常用的取值有以下4种:
- linear:线性插值,这是默认的方法。将与插值点靠近的两个数据点用直线连接,然后在直线上选取对应插值点的数据。
- nearest:最近点插值。选择最近样本点的值作为插值数据。如果插值点与前后两点距离相等,则选择后一个样本点的值作为插值数据。
- pchip:分段3次埃米尔特插值。采用分段3次多项式,除满足插值条件,还需满足在若干节点处相邻段插值函数的一阶导数相等,使得曲线光滑的同时,还具有保形性。
- spline:3次样条插值。每个分段内构造一个3次多项式,使其插值函数除满足插值条件外,还要求在各节点处具有连续的一阶和二阶导数。
为什么这两种插值方法都用3次多项式而不使用更高次的多项式?
因为多项式次数并非越高越好。次数越高,越容易产生震荡而偏离原函数,这种现象称为龙格(Runge)现象。
interp2():二维插值函数。
其调用格式:Z1=interp2(X, Y, Z, X1, Y1, method),其中,X, Y是两个向量,表示两个参数的采样点,Z是采样点对应的函数值。X1, Y1是两个标量或者向量,表示要插值的点。二维插值函数中的method除了不能使用pchip插值以外,其余的与一维插值函数相同。
------------------------------------------------------------------------------------------------------------------------
四 曲线拟合
一般是采用多项式函数做逼近函数,根据最小二乘法计算最小误差。
在MATLAB中用于多项式拟合的函数是polyfit函数,该函数的功能是求得最小二乘拟合多项式的系数,polyfit函数有3种调用格式:
- P=polyfit(X, Y, m)
- [P, S]=polyfit(X, Y, m)
- [P, S, mu]=polyfit(X, Y, m)
根据样本数据X和Y,产生一个m次多项式P及其在采样点误差数据S,mu是一个二元向量,mu(1)是mean(X),mu(2)是std(X)。
曲线拟合的三个功能:估算数据、预测趋势、总结规律。
举例1
首先,绘制该股票数据的散点图,可以看出:数据点跳动幅度大,不稳定,难以看出规律。
close; clear; clc;
x = [2, 3, 4, 5, 8, 9, 10, 11, 12, 15, 16, ...
17, 18, 19, 22, 23, 24, 25, 26, 29, 30]; % 交易日
y = [7.74, 7.84, 7.82, 7.78, 7.91, 7.97, 7.9, ...
7.76, 7.9, 8.04, 8.06, 8.11, 8.08, 8.13, ...
8.03, 8.01, 8.06, 8.0, 8.3, 8.41, 8.28];
figure('Name', '图1');
plot(x, y, '*');
继续输入命令,进行多项式拟合,选择常用的3次多项式,再绘制散点与拟合曲线图。
p = polyfit(x, y, 3);
plot(x, y, '*', x, polyval(p, x));
预测未来3个交易日的股票数据。
x1 = [x, 31, 32, 33];
plot(x, y, '*', x1, polyval(p, x1));
数据插值与曲线拟合的比较
相同点:
- 都属于函数逼近方法。
- 都能根据有限的离散样本数据,去估算其他数据。
不同点:
- 实现方法不同。数据插值要求逼近函数经过样本点,曲线拟合不要求逼近函数经过样本点,只要求总体误差最小。
- 结果形式不同。数据插值没有统一的逼近函数,曲线拟合用一个函数进行整体逼近,有确定的函数表达式。
- 侧重点不同。数据插值一般是估算区间内的插值点数据,曲线拟合不仅可以估算区间内插值点的数据,还可以估算区间外的插值点数据。
- 应用场合不同。如果样本数据为精确数据,适合采用数据插值的方法;如果样本数据为统计数据或存在误差,则适合采用曲线拟合的方法。