声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 2106|回复: 10

[综合讨论] MATLAB估计参数程序问题求助

[复制链接]
发表于 2009-2-10 16:57 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
各位大侠,我写了一个估计混合概率分布的才程序,但是运行总是出现问题,请大家帮忙看看到底哪里出了问题,应该怎么修改?小弟先谢过了。

主函数:
function [al,de,mu,eps_b,eps_s]=myestimate(mydata)
% parameters need to be estimated: al,de,mu,eps_b,eps_s
% data inputed: mydata
mydata=xlsread('pufa.xls');
b=mydata(:,1);
s=mydata(:,2);
lb=[0 0 0 0 0];      % lower bound of parameters
ub=[1 1 [] [] []];   % upper bound of parameters
f=likelihoodfunction(b,s);
set(0,'RecursionLimit',10000)
[al,de,mu,eps_b,eps_s]=fmincon(f,[0.1,0.1,10055.76763,100.5577,893.7203],[],[],[],[],lb,ub)

子函数:
function f=likelihoodfunction(b,s)     % maximum likelihood estimation function
k=length(b);
for i=1:k
    m(i)=min(b(i),s(i))+max(b(i),s(i))/2;
    f(i)=-1*eps_b+m(i)*log(eps_b/(mu+eps_b))+b(i)*log(mu+eps_b)     % likelihood function
              -1*eps_s+m(i)*log(eps_s/(mu+eps_s))+s(i)*log(mu+eps_s)
              +log(al*(1-de)*exp(-mu)*(eps_s/(mu+eps_s))^(s(i)-m(i))*(eps_b/(mu+eps_b))^(-m(i))+al*de*exp(-mu)*(eps_b/(mu+eps_b))^(b(i)-m(i))*(eps_s/(mu+eps_s))^(-m(i))+(1-al)*(eps_s/(mu+eps_s))^(s(i)-m(i))*(eps_b/(mu+eps_b))^(b(i)-m(i)));
f=-sum(f);
end

运行结果:
??? Maximum recursion limit of 500 reached. Use set(0,'RecursionLimit',N)
to change the limit.  Be aware that exceeding your available stack space can
crash MATLAB and/or your computer.
Error in ==> likelihoodfunction at 2
f=likelihoodfunction;

附件是相应数据

pufa.txt

2.36 KB, 下载次数: 2

回复
分享到:

使用道具 举报

 楼主| 发表于 2009-2-10 17:00 | 显示全部楼层
路过的大侠们帮忙看看哈,谢谢
发表于 2009-2-10 19:57 | 显示全部楼层
不懂你这玩意儿,不过根据提示,你可以试试
set(0,'RecursionLimit',1000)
 楼主| 发表于 2009-2-10 23:27 | 显示全部楼层
感谢sogooda的回复,我甚至把最大的迭代次数改为10000试过了,运行还是会出现这种问题,我想是不是程序哪里出了问题,有懂的大侠帮忙看看啊!!!
发表于 2009-2-10 23:42 | 显示全部楼层
是建议改小试试!
 楼主| 发表于 2009-2-11 09:25 | 显示全部楼层
为什么我改小后仍然出现同样的错误提示呢?
发表于 2009-2-11 11:36 | 显示全部楼层
我试跑下!
子函数中eps_b根本未定义??
 楼主| 发表于 2009-2-11 23:43 | 显示全部楼层

请各位大侠帮忙检查一下极大似然估计程序的问题!

我写了一个估计混合泊松分布的程序,但是我修改了多次后运行还是出现错误提示,请各位大侠帮忙检查一下到底程序哪里有问题?小弟先谢过了。
以下是程序:
function f=lik_fct(al,de,mu,eps_b,eps,s)     % maximum likelihood estimation function
% input data: b and s
% output parameters: al de mu eps_b eps_s
syms al de mu eps_b eps_s
b=[1242;855;1123;1072;1191;1066;1153;1379;1172;1170;1298;1121;1173;1001;1265;
  1007;1171;981;1114;1000;881;1080;772;1303;847;955;1103;793;1004;876;862;1066;
1320;1569;1526;1069;1131;1105;910;1236;939;1145;1195;1043;1359;1175;1046;1016;
1156;1180;1031;1128;932;1252;1207;1174;910;931;885;879;1026;1159;1100;1078;865;1162;
1044;1029;1387;1446;1285;1238;808;707;719;794;763;835;684;846;623;635;761;833;792;622;
548;548;776;593;580;460;602;634;518;770;692;749;1000;657;820;819;595;783;857;728;802;803;
811;699;657;886;708;953;800;766;853;740;1012;586;725;807;739;827;943;1013;843;1027;1195;
1082;1212;1255;1180;992;1229;1234;1310;1432;1268;1189;1514;1121;1122;1009;1067;1186;1306;
981;1199;1086;1025;831;800;977;1224;1340;1184;1001;920;791;749;970;1229;1270;1429;1133;
824;1014;1213;1244;922;889;1512;1079;851;1140;1022;802;1041;1114;1064;990;823;922;975;
1002;1053;906;1010;1023;977;729;958;877;1051;1227;1219;1220;1479;995;946;926;817;960;
911;1042;1118;1126;1196;830;1140;1303;1485;1123;1359;903;785;665;663;967;799;943;819;
787;818;808;1448;1309;1723;1366;1342;1290;1371;1075;1014;917;976;691;898;1183;778];
s=[1099;881;1032;1194;1122;1006;1070;919;1075;1145;1132;1168;1086;1366;1037;1223;1219;
   1046;1013;1039;1008;965;1225;961;1388;1013;853;906;966;1024;992;1135;1037;923;959;
1141;1036;1054;1486;1201;1198;1250;1026;917;759;961;1174;1535;1033;1265;1274;1213;1166;
971;1052;1281;1157;1266;1226;1116;1045;1025;979;1138;1332;935;1033;1088;931;901;1016;998;
585;571;597;500;570;520;725;700;836;772;684;632;635;779;725;605;701;723;834;740;678;837;
933;803;906;828;796;619;598;507;667;765;773;858;920;796;817;713;904;1003;827;762;805;736;
845;668;621;838;829;774;878;784;1048;773;880;837;1105;1133;1370;1254;1105;1064;986;890;913;
938;1115;1156;894;1339;1241;1104;1214;1083;1127;1301;1071;1060;1350;1110;1364;1407;1022;
1113;944;1077;1024;1061;1181;1119;964;863;770;1068;1255;1018;872;841;1113;1130;811;810;
995;1023;976;948;1005;956;1052;1404;1261;1138;1123;1262;1053;998;1032;1080;852;1078;928;
1266;1250;1159;1146;1006;836;1258;1082;996;797;697;909;933;1111;891;997;1194;662;932;767;
981;819;1004;1257;754;810;1337;1105;1006;1132;882;1228;941;941;953;783;902;911;1047;972;
942;1202;1288;1228;1202;1122;1155;1448];

lb=[0 0 0 0 0];      % lower bound of parameters
ub=[1 1 [] [] []];   % upper bound of parameters
al=0.1;
de=0.1;
mu=10055.76763;
eps_b=100.5577;
eps_s=893.7203;
k=length(b);
for i=1:k
    m(i)=min(b(i),s(i))+max(b(i),s(i))/2;
    f(i)=-1*eps_b+m(i)*log(eps_b/(mu+eps_b))+b(i)*log(mu+eps_b)     % likelihood function
              -1*eps_s+m(i)*log(eps_s/(mu+eps_s))+s(i)*log(mu+eps_s)
              +log(al*(1-de)*exp(-mu)*(eps_s/(mu+eps_s))^(s(i)-m(i))*(eps_b/(mu+eps_b))^(-m(i))+al*de*exp(-mu)*(eps_b/(mu+eps_b))^(b(i)-m(i))*(eps_s/(mu+eps_s))^(-m(i))+(1-al)*(eps_s/(mu+eps_s))^(s(i)-m(i))*(eps_b/(mu+eps_b))^(b(i)-m(i)));
end
f=-sum(f);
set(0,'RecursionLimit',1000)
[al,de,mu,eps_b,eps_s]=fmincon('lik_fct',[0.1,0.1,10055.76763,100.5577,893.7203],[],[],[],[],lb,ub)

以下是错误提示:
Error using ==> fmincon
FMINCON cannot co
Error in ==> lik_fct at 503
[al,de,mu,eps_b,eps_s]=fmincon('lik_fct',[0.1,0.1,10055.76763,100.5577,893.7203],[],[],[],[],lb,ub)

[ 本帖最后由 ChaChing 于 2009-2-12 08:57 编辑 ]
发表于 2009-2-12 09:23 | 显示全部楼层
建议相同题目继续即可! 不必发新帖, 方便别人容易了解前因後果!
还有行矩阵可以使用分号隔开, 否则帖子过长阅读不易!
若造成不便, 深深抱歉!

[ 本帖最后由 ChaChing 于 2009-2-12 10:41 编辑 ]
发表于 2009-2-12 10:09 | 显示全部楼层
没仔细看你的程序,根据错误提示,你的程序用到了递归,而且递归深度超过了你可以利用的内存栈空间。一方面可以通过加大内存解决,但是这样不是好的解决办法,最好的办法是修改程序思路。但是就你一楼给的程序来看,信息肯定不全。你用递归那部分没给出来,而且好多参数未定义。

评分

1

查看全部评分

 楼主| 发表于 2009-2-12 15:25 | 显示全部楼层
感谢rocwoods的回复,我重新发了个新帖,大家可以再帮忙看看。
关于参数定义的问题,我也很无助,因为涉及到混合概率分布的问题,真是不知道怎么定义,所以只能先赋予初始值,用迭代的办法来进行估计。
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-9-22 21:24 , Processed in 0.063059 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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