描述性统计主要研究数据的中心趋势(Central Tendency)和变异(Variation).
函数 | 作用 |
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]
函数 | 作用 |
std() | 计算数据的标准差 |
var() | 计算数据的方差 |
X = [1 3 5 5 5 5 7 9 9 9 10 13 14];
std(X); % 得到 3.7944
var(X); % 得到 14.3974
偏度反映数据的对称程度
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)表征概率密度分布曲线在平均值处峰值的高低.直观来看,峰度反映了峰部的尖度.
推论统计的核心即为假设检验.下列函数用于进行假设检验.
函数 | 作用 |
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%)下我们没有理由拒绝x
与y
同分布.
polyfit()
使用polyfit(x, y, n)
函数对数据x
和y
进行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)
函数对数据X
和y
进行多元线性回归.
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;
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删