MATLAB中文论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 152|回复: 6|关注: 0

[已解决] 如何用柯西分布拟合数据频数?

[复制链接]

新手

27 麦片

财富积分


050


1

主题

4

帖子

0

最佳答案
   通过对数据运行hist函数,得到频数信息,想通过柯西分布来拟合,自定义分布函数时,总是报错,新手,求大神指点。
>> cauchy=fittype(@(a,b,x) 1/(3.1415926*a*(1+((x-b)/a).^2)),'coefficients',{'a','b'});
错误使用 fittype/testCustomModelEvaluation (line 16)
Custom equations must produce an output vector, matrix, or array that is the same size and shape as the input data.
This custom equation fails to meet that requirement:

1/(3.1415926*a*(1+((x-b)/a).^2))

出错 fittype>iCreateFittype (line 371)
    testCustomModelEvaluation( obj );

出错 fittype (line 328)
                obj = iCreateFittype( obj, varargin{:} );


是自变量不能出现在分母位置吗?如果不能,那么这类问题怎样拟合呢?

频数直方图

频数直方图

论坛优秀回答者

中级

781 麦片

财富积分


5001500


1

主题

992

帖子

171

最佳答案
  • 关注者: 27
发表于 2017-11-14 15:23:18 | 显示全部楼层 |此回复为最佳答案
MATLAB初学者必读
本帖最后由 maple1314168 于 2017-11-14 16:15 编辑

matlab 好像没有直接分布拟合 柯西分布
1、如果你希望用曲线拟合的话,需要归一化、计算每点的概率密度值。不能用频率直接拟合。
     概率密度值  可以用:
a、累积概率的导数,这个你可以计算累积概率、之后数值微分。
b、用ksdensity,计算概率密度值
之后曲线拟合。。
2、矩估计,柯西分布的期望不存在,不可以。
3、mle极大似然估计:

例子:
z=randn(1,1e4)./randn(1,1e4);            %标准的柯西分布(1,0),根据你的a、b位置,一般[0 1]
custpdf = @(x,a,b)1./(3.1415926*a*(1+((x-b)./a).^2)) ;      %密度分布函数

mle(z,'pdf',custpdf,'start',[2 1])                     %极大似然估计、【2 1】 初值

ans =  0.9950    0.0197                                %与【1 0】接近

新手

27 麦片

财富积分


050


1

主题

4

帖子

0

最佳答案
 楼主| 发表于 2017-11-14 18:05:19 | 显示全部楼层
maple1314168 发表于 2017-11-14 15:23
matlab 好像没有直接分布拟合 柯西分布
1、如果你希望用曲线拟合的话,需要归一化、计算每点的概率密度值。 ...

先谢谢大神的不吝赐教,您的意思我好像明白了。但还有一点问题需要解决,我刚刚接触MATLAB,一些函数还不太了解。
1.用mle极大似然估计,如果不清楚数据本身所服从的分布,那得到的结果是否有意义? 如果有意义,我如何来验证得到的参数拟合效果很好呢,或者在那个范围内认为是良好的呢?
2.用ksdensity,计算概率密度值,之后曲线拟合。方法我是知道的,但是我柯西曲线拟合函数没找到,自己编总是报错?是这样吗?
>> cauchy=fittype(@(a,b,x) 1/(3.1415926*a*(1+((x-b)./a).^2)),'coefficients',{'a','b'});
错误使用 fittype/testCustomModelEvaluation (line 16)
Custom equations must produce an output vector, matrix, or array that is the same size and shape as the input data.
This custom equation fails to meet that requirement:

1/(3.1415926*a*(1+((x-b)./a).^2))

出错 fittype>iCreateFittype (line 371)
    testCustomModelEvaluation( obj );

出错 fittype (line 328)
                obj = iCreateFittype( obj, varargin{:} );
3.这种复杂的概率密度曲线,应该怎样拟合呢?我之前的数据是排序后提取的一个峰值的数据,想法是各峰值分布拟合之后在整合,是否合理可行呢?

概率密度图

概率密度图

论坛优秀回答者

中级

781 麦片

财富积分


5001500


1

主题

992

帖子

171

最佳答案
  • 关注者: 27
发表于 2017-11-14 18:34:03 | 显示全部楼层
猩猩咬狒狒 发表于 2017-11-14 18:05
先谢谢大神的不吝赐教,您的意思我好像明白了。但还有一点问题需要解决,我刚刚接触MATLAB,一些函数还不 ...

1与3 是同一个问题,这也是哲学的问题。不知道分布,就要尝试一下。用我们已知的分布区拟合。
但是真实的世界是这样的吗?这很难说。我们都只是用一些标准去评判。对于分布的类型,这可以用非参数检验。什么ks、卡方检验等等。。对于3这么多的峰,我们可以考虑mix正态分布、ksdensity(非参数)拟合。。。

2,试试  cauchy=fittype(@(a,b,x) 1./(3.1415926*a*(1+((x-b)./a).^2)))

新手

27 麦片

财富积分


050


1

主题

4

帖子

0

最佳答案
 楼主| 发表于 2017-11-14 19:26:27 | 显示全部楼层
maple1314168 发表于 2017-11-14 18:34
1与3 是同一个问题,这也是哲学的问题。不知道分布,就要尝试一下。用我们已知的分布区拟合。
但是真实的 ...

十分感谢和意外,您回复的这么快速。
我用您提供的公式就不报错了,就应为一个 “.”吗?
cauchy=fittype(@(a,b,x) 1./(3.1415926*a*(1+((x-b)./a).^2)))

cauchy =

     General model:
     cauchy(a,b,x) = 1./(3.1415926*a*(1+((x-b)./a).^2))

但是继续拟合时,结果怪怪的,跟正常的不一样,并没有估计的参数值及区间估计,我不太明白。画图时报错了。。。
[cauchy_fit.gof1]=fit(x.',y.',cauchy,'startpoint',[0.0296,15.61])

cauchy_fit =

    gof1: [1x1 cfit]

>> plot(x, y, 'b.', x, cauchy_fit(x), 'r-')
下标索引必须为正整数类型或逻辑类型。

非常抱歉又麻烦您,我刚刚在学,您有什么推荐的拟合方面的MATLAB书籍或者资料可以介绍给我吗?谢谢

论坛优秀回答者

中级

781 麦片

财富积分


5001500


1

主题

992

帖子

171

最佳答案
  • 关注者: 27
发表于 2017-11-14 20:05:44 | 显示全部楼层
本帖最后由 maple1314168 于 2017-11-14 20:09 编辑
猩猩咬狒狒 发表于 2017-11-14 19:26
十分感谢和意外,您回复的这么快速。
我用您提供的公式就不报错了,就应为一个 “.”吗?
cauchy=fittype( ...

你的输出,为什么加"."
把他改为逗号 ,
这样输出的应该就有参数的值,以及区间,等等
自己再查查  help fit

看matlab的帮助已经很好的。matlab对于每一个工具箱都有帮助文档。

新手

27 麦片

财富积分


050


1

主题

4

帖子

0

最佳答案
 楼主| 发表于 2017-11-14 20:15:12 | 显示全部楼层
maple1314168 发表于 2017-11-14 20:05
你的输出,为什么加"."
把他改为逗号 ,
这样输出的应该就有参数的值,以及区间,等等

哈哈哈,太二了。麻烦了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐上一条 /2 下一条

快速回复 返回顶部 返回列表