Matlab 之数据分布拟合

本文详细介绍了如何在Matlab中使用DistributionFitterAPP进行数据分布的可视化和fitdist函数进行概率分布对象拟合。通过实例演示了如何对数据进行正态分布和Laplace分布的拟合,以及如何通过代码获取频率分布并进行曲线拟合。
摘要由CSDN通过智能技术生成

Part.I Introduction

本文主要介绍了如何使用 Matlab 对数据的分布进行拟合。也就是 笔者对实现『用 Matlab 拟合出数据的概率分布密度函数』这个目标所进行的一些探索。

在这里插入图片描述

Part.II Distribution Fitter APP 的使用

Chap.I APP 简介

此 APP 界面如下所示:
在这里插入图片描述
其中Display type 有如下几种:

  • Density (PDF):概率密度
  • Cumulative probability CDF:累积概率分布
  • Quantile (inverser CDF):分位数 (逆 CDF)
  • Probability plot:概率图
  • Survivor funciton:剩余函数
  • Cumulative hazard:累积危险函数

分布类型如下表所示

在这里插入图片描述
每种分布得到的拟合参数的个数和名字或将不同,这些可以参看 Matlab 的帮助文档。


注意:

  1. 菜单栏 → File → Generate Code … 可以生成画此图的脚本,自己可以按自己的需求改脚本使得绘制出的图片符号自己的需求。

Chap.II 简单使用

下面的一个图就是利用此 APP 生成的,上手很简单。

在这里插入图片描述

Part.III 通过代码实现分布拟合

Chap.I 基于 fitdist 函数

fitdist 函数或许就是 Distribution Fitter APP 底层实现的一个最为重要的核心函数。

首先介绍一下 fitdist 函数,它可以对数据进行概率分布对象拟合,常用的调用方法为:

pd = fitdist(x,distname)		// 一般用这个足矣
pd = fitdist(x,distname,Name,Value)
[pdca,gn,gl] = fitdist(x,distname,'By',groupvar)
[pdca,gn,gl] = fitdist(x,distname,'By',groupvar,Name,Value)

首先是输入参数:

  • x:待进行分布拟合的数据
  • distname:分布名称,参看上面『分布类型表』
  • groupvar:分组变量,暂时用不到,之后可看说明文档

然后是输出参数:

  • pd:概率分布,可用a = pd.a 来获取参数估值 a,一般用这个就行。
  • pdca:概率分布对象
  • gn:组标签
  • gl:分组变量水平

下面是一个示例:

clc;clear
% 构造数据, 生成 10000 个服从 0~1 正态分布的数据
Data=randn(10000,1);
% 正态分布拟合
pd = fitdist(Data,'Normal');
a=pd.mu; b=pd.sigma;
% 绘图
pts=linspace(-5,5,1000);
[yy,xx]=ksdensity(Data,pts);
yy1=normpdf(xx,a,b);
% 绘制概率分布图
plot(xx,yy)
hold on
% 绘制拟合结果
plot(xx,yy1)
legend(['raw';'fit']);

绘图结果如下:
在这里插入图片描述

Chap.II 获取数据的频率分布后进行曲线拟合

首先获取数据的频率分布(这一步比较关键)

// 获得的 xx1 和 yy1 只有100个点
[yy1,xx1]=ksdensity(Data);
// 通过 pts 来控制点的个数
pts = linspace(-20,20,1000);
// 根据 pts 获取数据的频率分布
[yy,xx]=ksdensity(Data,pts);

得到数据的概率分布之后,接下来实际上就是曲线拟合了!


下面是一个示例

clc;clear
% 构造数据, 生成 10000 个服从 N(0,5) 正态分布的数据
Data=normrnd(0,5,10000,1);
% 通过 pts 来控制点的个数
pts = linspace(-20,20,1000);
% 根据 pts 获取数据的频率分布
[yy,xx]=ksdensity(Data,pts);
% 定义拟合的公式
%fitEquation = fittype('1/(2*a)*exp(-abs(x-b)/a)', 'coefficients', {'a', 'b'});  % Laplace 分布
fitEquation = fittype('1/sqrt(2*pi)/b*exp(-(x-a)*(x-a)/(2*b*b))', 'coefficients', {'a', 'b'});
% 确定初值
initialGuess = [1, 6];
% 进行曲线拟合
fittedModel = fit(xx', yy', fitEquation, 'StartPoint', initialGuess);
% 展示拟合结果
disp(fittedModel);
% 绘图
plot(xx,yy)
hold on
a=fittedModel.a; b=fittedModel.b;
% yy1=1/(2*a)*exp(-abs(xx-b)/a);  % Laplace 分布
yy1=1/sqrt(2*pi)/b*exp(-(xx-a).*(xx-a)/(2*b*b));
plot(xx,yy1)
legend(['raw';'fit']);

得到的分布拟合结果为:

General model:
fittedModel(x) = 1/sqrt(2*pi)/b*exp(-(x-a)*(x-a)/(2*b*b))
Coefficients (with 95% confidence bounds):
    a =    0.008658  (-0.001162, 0.01848)
    b =       5.084  (5.076, 5.092)

绘图结果为:

在这里插入图片描述

Reference

  1. Matlab 之曲线拟合
  • 22
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 在MATLAB中,可以使用 normfit() 函数对数据进行正态分布拟合。该函数返回包含两个元素的向量,第一个元素是正态分布的平均值,第二个元素是标准差。 例如,假设有一组数据存储在向量中,可以按以下方式进行拟合: data = [1.2, 0.8, 1.6, 1.1, 1.3, 1.5, 0.9, 1.2, 1.4, 1.3]; [mu, sigma] = normfit(data) 得到的 mu 和 sigma 分别是该数据集的平均值和标准差。可以进一步使用 normpdf() 函数绘制正态分布曲线: x = linspace(min(data), max(data), 100); pdf = normpdf(x, mu, sigma); plot(x, pdf) 通过绘制正态分布曲线,可以更加直观地了解数据集的分布情况,并对其进行分析和处理。 ### 回答2: MATLAB 是一款广泛应用于数据处理和分析的软件,通过其内置函数可以方便地进行各种统计分析。正态分布是一种在统计学中经常使用的分布样本,可以通过MATLAB来进行正态分布拟合。 在Matlab中,要进行正态分布拟合,需要先计算数据分布的均值和标准差,用于确定正态分布的两个参数——分布均值和方差。然后可以使用MATLAB中的normfit函数,对数据进行正态分布拟合函数返回两个值:分布的均值和方差。 示例代码如下: % 生成正态分布数据 data = random('normal',10,2,[1,1000]); % 确定数据的均值和标准差 mu = mean(data); sigma = std(data); % 进行正态分布拟合 [pdf_values, x_values] = normpdf(data, mu, sigma); % 绘制拟合曲线 plot(x_values, pdf_values, 'r-', 'LineWidth', 2); hold on; histogram(data,10,'Normalization','pdf'); title('正态分布拟合图像') 在上述代码中,首先通过random函数生成了1000个均值为10,标准差为2的正态分布随机数据。然后通过mean函数和std函数分别计算出数据的均值和标准差。接着使用normpdf函数来计算数据各点处的概率密度值。最后通过plot函数和histogram函数绘制出数据的分布曲线和直方图,从图像上可以看出数据呈现出近似正态分布的趋势。 需要注意的是,在使用正态分布进行拟合时,需要先对数据的分布进行观察,判断是否符合正态分布的假设条件。当数据分布不完全符合正态分布时,我们可以进行对数变换或其他方式进行修正,以达到更好的拟合效果。 总之,MATLAB提供了方便的函数和工具,可以方便地进行正态分布拟合。对于了解这种方法的研究人员,使用MATLAB进行正态分布拟合是一个可靠有效的工具。 ### 回答3: MATLAB是一个用于数学计算、工程分析和科学数据可视化的软件工具。在MATLAB中,正态分布拟合是一个常见的数据分析技术,用于确定数据是否符合正态分布并对数据进行模型拟合。正态分布是一种标准的概率分布,它不仅被广泛应用于自然科学和社会科学中的数据分析,还被广泛应用于金融和经济领域等商业应用中。 在MATLAB中,要拟合一个正态分布,需要先计算数据的均值和标准差。可以使用MATLAB内置的统计分析工具箱中的normfit函数进行拟合,其输出包括正态分布的参数和置信区间。需要注意的是,输入数据必须是实际值而非以概率密度形式输入的数据。可以通过直接输入实际值数据或使用MATLAB内置的randn函数生成随机样本数据来处理数据。 另一种方法是使用MATLAB内置的拟合工具箱Curve Fitting Toolbox对实际值数据区进行正态分布拟合。它提供了其他类型的概率分布,如指数分布和Weibull分布的拟合功能。拟合过程中需要输入数据和拟合类型,然后使用默认设置或手动更改设置来拟合分布。 在实际应用中,正态分布拟合可用于各种领域的数据建模和预测。例如,它可以用于股票价格、天气和通信系统中的数据,以帮助预测未来趋势和风险。对于质量管理和过程控制,正态分布拟合可以用于确定一个过程是否满足正态分布的假设,并进一步分析该过程的稳定性和性能。 总之,MATLAB可以帮助我们更好地理解数据,确定概率分布类型,从而进行合理的数据拟合和分析。正态分布作为常见的概率分布类型,其拟合功能在MATLAB中得到了完美的应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

流浪猪头拯救地球

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值