楼主: catherinehxy
1970 10

[问答] 创建的function 出问题,可以帮忙看一下么? [推广有奖]

  • 0关注
  • 0粉丝

高中生

52%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
3314 点
帖子
21
精华
0
在线时间
36 小时
注册时间
2010-3-19
最后登录
2012-10-16

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
创建的function 出问题,可以帮忙看一下么?因为是初学者可能会有愚蠢的错误,不好意思
这是estimation by likelihood function,最后需要maximiser 的

vt需要它的滞后项不知道我这样用可不可以
复制如下:
function likeli = likelihood(parametre,St,t)

% define likelihood function,'parametre' is variable that we want to estimate from data St and t
% define parametre which have 17 elements
p1=parametre(1);p2=parametre(2);p3=parametre(3);p4=parametre(4);p5=parametre(5);p6=parametre(6);
p7=parametre(7);p8=parametre(8);p9=parametre(9);p10=parametre(10);p11=parametre(11);p12=parametre(12);
p13=parametre(13);p14=parametre(14);p15=parametre(15);p16=parametre(16);p17=parametre(17);

%Define two major variables (ft and vt) that would be used in the likelihood function

%1 define the ft:seasonal which would be a vector with length of St

ft=p13+p9*cos(2*pi*2*St/260)+p10*sin(2*pi*2*t/260)+p14*cos(2*pi*2*t/260)+p15*sin(2*pi*2*t/260)+p11*cos(2*pi*2*t/5)+p12*sin(2*pi*2*t/5)+p16*cos(2*pi*2*t/5)+p17*sin(2*pi*2*t/5);

%2 define the vt: volatiltiy  which would be a vector with length of St

for i=3:lenght(St);
    vt(1)=0.5
vt(i)=p6+p7*(St(i-1)+St(i-2)*(p1-1)-p1*p2)^2+p8*v(i-1);
end

%define the likelihood function
for i=2:lenght(St);
    Lt(i)=(1-p5)*exp(-((St(i)-ft(i))-(1-p1)*(St(i-1)-ft(i-1))-p1*p2)^2/(2*vt(i)))/(2*pi*vt(i))^0.5+(p5)*exp(-((St(i)-ft(i))-(1-p3)*(St(i-1)-ft(i-1))-p1*p2-p3)^2/(2*(vt(i)+p4^2)))/(2*pi*(vt(i)+p4^2))^0.5
end

%-(sum of likelihood function)
likeli=-sum(Lt)

end


二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:function CTI Fun TIO UNC function 初学者

沙发
andrew3335 发表于 2012-9-27 09:24:15 |只看作者 |坛友微信交流群
matlab说程序在哪里出错的?

使用道具

藤椅
catherinehxy 发表于 2012-9-27 15:47:28 |只看作者 |坛友微信交流群
andrew3335 发表于 2012-9-27 09:24
matlab说程序在哪里出错的?
他显示说在p1=parametre那一行not enough input

另外我在编辑vt这个variable的时候,我这样表示滞后项不知道正不正确

谢谢了

使用道具

板凳
andrew3335 发表于 2012-9-27 17:07:58 |只看作者 |坛友微信交流群
首先非常认同你的勇气自己编程做likelihood function
先让我搞清楚几个问题:
1.你这个函数的目的是什么?如果是做maximum likelihood来估计参数的话,parametres不应该是output吗?如果matlab报错not enough input很有可能是在给p1,2等赋值的时候,parametre数组里没有值。
2.vt(i)=p6+p7*(St(i-1)+St(i-2)*(p1-1)-p1*p2)^2+p8*v(i-1); 最后一项应该是Vt(i-1)对不对?

下班了,有问题明天再看

使用道具

报纸
catherinehxy 发表于 2012-9-27 17:34:29 |只看作者 |坛友微信交流群
andrew3335 发表于 2012-9-27 17:07
首先非常认同你的勇气自己编程做likelihood function
先让我搞清楚几个问题:
1.你这个函数的目的是什么? ...
很谢谢你帮我看,
1 他的目的是为maximizer 来估计参数, 参数我命名为parametre,, 刚开始参数是不已知的,所以我没有赋值,只会在求最优的时候给起始值,参数很多有17个,所以用p1 2....表示。 parameter应该是output? 那应该怎么设方程呢?
2谢谢你这里提醒我,应该是vt(i-1)才对。 这个式子没有什么问题吧?之前没有遇到过这种情况

使用道具

地板
andrew3335 发表于 2012-9-28 08:49:13 |只看作者 |坛友微信交流群
vt(i-1)的可以表达 i 滞后一期,没问题的。

如果开始parametre里面没有赋值的话,那么P1~17也就没有值,那么p1=parametre(1);就会出错。

我这里只是提个意见,我也不算太懂。这个程序的作用在我看来是根据已知的参数值来计算likelihood。如果你想用这个程序来做参数估计,你必须要反复的代入不同的Parametre组合,然后看那个组合的likelihood最大。
所以我会在你的程序之前加一段随机生成parapmetre矩阵的语句(注意P1~17的取值范围),再把他存到一个cell里面,程序后面把算得的likeli=-sum(Lt)存到一个数列里的某个位置。最后把整个程序循环10,000次以上(可能还不止,因为你的参数好多)。这样一来你就有10,000likelihood数值,10,000parametre组合,挑个最大的likelihood,找到相应的parametre组合就是你要的。
这样做计算量是海量的,我蛮担心你的电脑会死机。

或者拿支笔和纸自己算参数也行........

使用道具

7
catherinehxy 发表于 2012-9-28 15:25:52 来自手机 |只看作者 |坛友微信交流群
andrew3335 发表于 2012-9-28 08:49
vt(i-1)的可以表达 i 滞后一期,没问题的。

如果开始parametre里面没有赋值的话,那么P1~17也就没有值, ...
这个函数实际上最后想要fminsearch()来求最值,函数里有可以设一个起始值,所以我以为可以先建立方程

使用道具

8
andrew3335 发表于 2012-9-28 15:37:15 |只看作者 |坛友微信交流群
这也可以啊。但是fminsearch()求得的是一个确定参数的方程的最值,参数还要你自己输入,得到的不同方程的最值你还是要自己挑个最大的。所以你程序前后还是要加上我和你说的那两块东西。
既然你已经有这个程序了,没必要用fminsearch了。

我好像有看到matlab可以做自定义likelihood function的参数拟合的,但我不是很确定。

使用道具

9
catherinehxy 发表于 2012-9-28 17:13:56 来自手机 |只看作者 |坛友微信交流群
能帮我改下随机生成参数的语句应该怎么写么?不好意思,这个我不知道怎么写。
我建立的这个方程不属于已经是确定参数的方程么,虽然是不已知的。
我的问题不知道会不会很愚蠢,因为才接触matlab不久

使用道具

10
andrew3335 发表于 2012-9-29 09:18:03 |只看作者 |坛友微信交流群
参数估计起始值的问题我自己也搞不清楚。但我的理解是你试上n多个值应该也行得通。
n是你要重复的次数
function里面把parametre输入的要求取消。
parametre=zeros(n,17);    在for语句外面定义变量可以,节约不少内存,省下计算时间。
p1=p2=p3.....=p17=0;   这里参数其实不用定义,只是为了符合你已经有的程序,其实没有必要。
likeli=zeros(n,1);

for h=1:n
paramtre(h,:)=rand(1,17);  这里只是生成17个0到1之间的随机数。要0到5的话就是5*rand(1,17), 4到6的话就是4+2*rand(1,17) 你自己看着改。

后面都一样,只是改成P1=paramtre(h,1);P2=paramtre(h,2);以此类推

最有  likeli(h)=-sum(Lt(i));

end (这个end和我加上的for对应起来)
[c,i]=max(likeli);

paramtre(i,:)   显示出带来最大likeli值的参数组合,就是你的参数估计。

这样大概就可以了吧。但还是那句话,本人学术水平有限,仅仅是我个人的理解。

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-5-1 15:34