MATLAB09:统计与拟合

烈酒焚心 提交于 2019-11-30 04:40:14

统计

描述性统计(Descriptive Statistics)

描述性统计主要研究数据的中心趋势(Central Tendency)和变异(Variation).

在这里插入图片描述

中心趋势(Central Tendency)

函数 作用
mean() 计算平均值
median() 计算中位数
mode() 计算众数
prctile() 计算百分位数
max() 计算最大值
min() 计算最小值

在这里插入图片描述

X = [1 3 5 5 5 5 7 9 9 9 10 13 14];

mean(X);			% 数据的平均值为 7.3077
median(X);			% 数据的中位数为 7
mode(X);			% 数据的众数为 5
prctile(X, 0);		% 数据的0%分位数为 0
prctile(X, 50);		% 数据的50%分位数为 7
prctile(X, 100);	% 数据的100%分位数为 14
prctile(X, 12.6);	% 数据的12.6%分位数为 3.2760 

下列函数绘制统计图表:

函数 作用
bar() 绘制条形图
stem() 绘制针状图
area() 绘制填充图
boxplot() 绘制箱线图
x = 1:14;
freqy = [1 0 1 0 4 0 1 0 3 1 0 0 1 1];
subplot(1,3,1); bar(x,freqy); xlim([0 15]);
subplot(1,3,2); area(x,freqy); xlim([0 15]);
subplot(1,3,3); stem(x,freqy); xlim([0 15]);

在这里插入图片描述

箱线图可以突出显示数据的四分位点.

在这里插入图片描述

marks = [80 81 81 84 88 92 92 94 96 97];
boxplot(marks)
prctile(marks, [25 50 75])	% 得到 [81 90 94]

在这里插入图片描述

变异(Variation)

离散程度

函数 作用
std() 计算数据的标准差
var() 计算数据的方差

在这里插入图片描述

X = [1 3 5 5 5 5 7 9 9 9 10 13 14];

std(X);			% 得到 3.7944
var(X);			% 得到 14.3974

偏度(Skewness)

函数 作用
skewness() 计算数据的偏度

在这里插入图片描述

偏度反映数据的对称程度

  • 数据左偏时,其偏度小于0.
  • 数据完全对称时,其偏度等于0.
  • 数据右偏时,其偏度大于0.
X = randn([10 3]);		% 构造10*3的矩阵
X(X(:,1)<0, 1) = 0; 	% 将第一列数据右偏
X(X(:,3)>0, 3) = 0;		% 将第二列数据左偏
boxplot(X, {'Right-skewed', 'Symmetric', 'Left-skewed'});
skewness(X);	% 得到 [0.5162 -0.7539 -1.1234]

在这里插入图片描述

峰度(Kurtosis)

函数 作用
kurtosis() 计算数据的峰度

峰度(Kurtosis)表征概率密度分布曲线在平均值处峰值的高低.直观来看,峰度反映了峰部的尖度.

在这里插入图片描述

统计推断(Inferential Statistics)

推论统计的核心即为假设检验.下列函数用于进行假设检验.

函数 作用
ttest() 进行T检验
ztest() 进行Z检验
ranksum() 进行秩和检验
signrank() 进行符号秩检验
load examgrades
x = grades(:,1);
y = grades(:,2);
[h,p] = ttest(x,y);

执行上述程序,得到[h p] = [0 0.9805],表示在默认显著性水平(5%)下我们没有理由拒绝xy同分布.

拟合

多项式拟合

一元多项式拟合:polyfit()

使用polyfit(x, y, n)函数对数据xy进行n次多项式拟合.

x = [-1.2 -0.5 0.3 0.9 1.8 2.6 3.0 3.5];
y = [-15.6 -8.5 2.2 4.5 6.6 8.2 8.9 10.0];
for i=1:3
    p = polyfit(x,y,i);	% 分别进行一次,二次,三次拟合
    xfit = x(1):0.1:x(end); yfit = polyval(p,xfit);
    subplot(1,3,i); plot(x,y,'ro',xfit,yfit); 
    legend('Data points','Fitted curve', 'Location', 'southeast');
end

在这里插入图片描述

多元线性拟合:regress()

使用regress(y, X)函数对数据Xy进行多元线性回归.

load carsmall;
y = MPG; x1 = Weight; x2 = Horsepower;		% 导入数据集
X = [ones(length(x1),1) x1 x2];				% 构建增广X矩阵
b = regress(y,X);							% 进行线性回归

% 下面是绘图语句
x1fit = min(x1):100:max(x1); x2fit = min(x2):10:max(x2);
[X1FIT,X2FIT] = meshgrid(x1fit,x2fit);
YFIT = b(1)+b(2)*X1FIT+b(3)*X2FIT;
scatter3(x1,x2,y,'filled'); hold on;
mesh(X1FIT,X2FIT,YFIT); hold off;
xlabel('Weight'); ylabel('Horsepower'); zlabel('MPG'); view(50,10);

在这里插入图片描述

非线性拟合

对于非线性拟合,需要使用曲线拟合工具箱.在命令窗口输入cftool()打开曲线拟合工具箱.

在这里插入图片描述

插值

一维插值

下列函数均与一维插值有关:

函数 作用
interp1(x,v)interp1(x,v,xq) 线性插值
spline(x,v)spline(x,v,xq) 三次样条插值
pchip(x,v)pchip(x,v,xq) 三次Hermite插值
mkpp(breaks,coefs) 生成分段多项式
ppval(pp,xq) 计算分段多项式的插值结果

下面例子演示使用interp1(x, v, xq)进行线性插值和使用spline(x, v, xq)进行三次样条插值.各参数意义如下:

  • x,v: 待插值样本点.
  • xq: 查询点,函数返回在这些点处的插值结果.
% 构造数据
x = linspace(0, 2*pi, 40); x_m = x; x_m([11:13, 28:30]) = NaN; 
y_m = sin(x_m);
plot(x_m, y_m, 'ro', 'MarkerFaceColor', 'r'); hold on; 	

% 对数据进行线性插值
m_i = ~isnan(x_m);
y_i = interp1(x_m(m_i), y_m(m_i), x);
plot(x,y_i, '-b'); hold on;

% 对数据进行三次样条插值
m_i = ~isnan(x_m);
y_i = spline(x_m(m_i), y_m(m_i), x);
plot(x,y_i, '-g'); 

legend('Original', 'Linear', 'Spline');

在这里插入图片描述

三次样条插值的原理在每两个样本点之间用两两相切的三次函数曲线来插值.若spline()方法不指定查询点,则返回一个结构体,其中封装了插值三次函数的系数.使用mkpp(breaks, coefs)可以创建一个类似的结构体,使用ppval(pp, xq)可以计算查询点的插值结果.

在这里插入图片描述

使用pchip(x, y, xq)函数可以进行三次Hermite插值,该算法同样以三次函数进行插值,但得到的曲线更平缓.

x = -3:3; y = [-1 -1 -1 0 1 1 1]; xq1 = -3:.01:3;
p = pchip(x,y,xq1);
s = spline(x,y,xq1);
plot(x,y,'o',xq1,p,'-',xq1,s,'-.')
legend('Sample Points','pchip','spline','Location','SouthEast')

在这里插入图片描述

二维插值

使用interp2()可以进行二维插值,向其method参数传入字符串可以指定插值算法.

方法 说明 连续性
'linear' (默认)在查询点插入的值基于各维中邻点网格点处数值的线性插值. C0
'spline' 在查询点插入的值基于各维中邻点网格点处数值的三次插值.插值基于使用非结终止条件的三次样条. C2
'nearest' 在查询点插入的值是距样本网格点最近的值. 不连续
'cubic' 在查询点插入的值基于各维中邻点网格点处数值的三次插值.插值基于三次卷积. C1
'makima' 修改后的Akima三次Hermite插值.在查询点插入的值基于次数最大为3的多项式的分段函数,使用各维中相邻网格点的值进行计算.为防过冲,已改进 Akima 公式. C1
% 构建样本点
xx = -2:.5:2; yy = -2:.5:3; [x,y] = meshgrid(xx,yy); 
xx_i = -2:.1:2; yy_i = -2:.1:3; [x_i,y_i] = meshgrid(xx_i,yy_i);
z = x.*exp(-x.^2-y.^2);

% 线性插值
subplot(1, 2, 1); 
z_i = interp2(xx,yy,z,x_i,y_i);
surf(x_i,y_i,z_i); hold on;
plot3(x,y,z+0.01,'ok','MarkerFaceColor','r'); hold on;

% 三次插值
subplot(1, 2, 2); 
z_ic = interp2(xx,yy,z,x_i,y_i, 'spline');
surf(x_i,y_i,z_ic); hold on;
plot3(x,y,z+0.01,'ok','MarkerFaceColor','r'); hold on;

在这里插入图片描述

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!