声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 3890|回复: 11

[编程技巧] 求助非线性回归的最小二乘法

[复制链接]
发表于 2007-5-29 10:27 | 显示全部楼层 |阅读模式

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

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

x
函数为y=(a+b*x1^c)*(1+d*log(x2/0.00057))*(1-((x3-293)/293)^f)
a,b,c,d,f为要拟合的参数,y为因变量,x1,x2,x3为三个变量,x为52*3的矩阵,y为52*1的矩阵。打算用nlinfit来算, a,b,c,d,f初植为[1000 600 0.4  0.1 0.5]。

命令窗口:
x=[0.028 0.00057 293;0.037 0.00057 293;0.045 0.00057 293;0.053 0.00057 293;0.061 0.00057 293;0.072 0.00057 293;0.08 0.00057 293;0.089 0.00057 293;0.093 0.00057 293;0.106 0.00057 293;0.113 0.00057 293;0.124 0.00057 293;0.133 0.00057 293;0.028 1500 293;0.037 1500 293;0.045 1500 293;0.053 1500 293;0.061 1500 293;0.072 1500 293;0.08 1500 293;0.089 1500 293;0.093 1500 293;0.106 1500 293;0.113 1500 293;0.124 1500 293;0.133 1500 293;0.028 1500 183;0.037 1500 183;0.045 1500 183;0.053 1500 183;0.061 1500 183;0.072 1500 183;0.08 1500 183;0.089 1500 183;0.093 1500 183;0.106 1500 183;0.113 1500 183;0.124 1500 183;0.133 1500 183;0.028 1500 163;0.037 1500 163;0.045 1500 163;0.053 1500 163;0.061 1500 163;0.072 1500 163;0.08 1500 163;0.089 1500 163;0.093 1500 163;0.106 1500 163;0.113 1500 163;0.124 1500 163;0.133 1500 163]
y=[1070 1080 1090 1100 1120 1130 1150 1150 1160 1170 1180 1190 1195 1410 1420 1430 1440 1450 1460 1470 1470 1480 1470 1480 1480 1495 1530 1600 1615 1610 1605 1610 1620 1620 1620 1615 1620 1620 1625 1690 1720 1730 1740 1740 1760 1760 1760 1750 1755 1740 1725 1730]’
beta=[1000 600 0.4  0.1 0.5];
betafit=nlinfit(x,y,'model',beta)
model.m文件
function yy=model(beta,x)
yy=(beta(1)+beta(2)*x(:,1)^beta(3))*(1+beta(4)*log(x(:,2)/0.01)) *(1-((x(:,3)-25)/1643)^beta(5));
请帮忙解决,谢谢!!
是不是()*()有交叉项nlinfit不能算?我又两边取对数。但在指数项可能又不能算,报错
error==>mpower
matrix must be suqare
之后又把幂的底数换为e后,数据少的话可以算,但为复数,数据多时又报错。
无word只好传了txt

newproblem.txt

1.7 KB, 下载次数: 20

回复
分享到:

使用道具 举报

 楼主| 发表于 2007-5-29 10:29 | 显示全部楼层

望大侠指教.

不知道是不是nlinfit中有两括号相乘有交叉不能算啊?
发表于 2007-5-29 10:38 | 显示全部楼层



请注意点运算和矩阵运算的区别,对此可看看 置顶贴:聚宝盆 中提到的精华贴

[ 本帖最后由 eight 于 2007-5-29 10:43 编辑 ]
发表于 2007-5-29 11:49 | 显示全部楼层
下面是用1stOpt算的:

均方差(RMSE): 35.5323096770365
残差平方和(SSE): 65652.3416112108
相关系数(R): 0.987565402796316
相关系数之平方(R^2): 0.97528542480025

参数        最佳估算
----------        -------------
beta1              1904.23420458104
beta2              -1.04525293293857
beta3              -1.30971896814068
beta4              0.0403272929669862
beta5              0.5672148098383
 楼主| 发表于 2007-5-29 12:02 | 显示全部楼层

多谢,可否贴出程序?

多谢,可否贴出程序?,用1stOpt算和nlinfit差别大吗?我估计beta0(2)应在100以上.
发表于 2007-5-29 12:19 | 显示全部楼层
1stOpt不需猜初值,适应性好。如果模型参数没有物理意义的限制或约束,上面结果应是最好的。nlinfit对初值太敏感,不好使,稍微难点的问题,光猜初值就要花费大量精力和时间,还不能保证所得结果最优。

1stOpt代码:

Algorithm = LM2;
Function y=(beta1+beta2*x1^beta3)*(1+beta4*log(x2/0.01)) *(1-((x3-25)/1643)^beta5);
Data;
0.028        0.00057        293        1070
0.037        0.00057        293        1080
0.045        0.00057        293        1090
0.053        0.00057        293        1100
0.061        0.00057        293        1120
0.072        0.00057        293        1130
0.08        0.00057        293        1150
0.089        0.00057        293        1150
0.093        0.00057        293        1160
0.106        0.00057        293        1170
0.113        0.00057        293        1180
0.124        0.00057        293        1190
0.133        0.00057        293        1195
0.028        1500        293        1410
0.037        1500        293        1420
0.045        1500        293        1430
0.053        1500        293        1440
0.061        1500        293        1450
0.072        1500        293        1460
0.08        1500        293        1470
0.089        1500        293        1470
0.093        1500        293        1480
0.106        1500        293        1470
0.113        1500        293        1480
0.124        1500        293        1480
0.133        1500        293        1495
0.028        1500        183        1530
0.037        1500        183        1600
0.045        1500        183        1615
0.053        1500        183        1610
0.061        1500        183        1605
0.072        1500        183        1610
0.08        1500        183        1620
0.089        1500        183        1620
0.093        1500        183        1620
0.106        1500        183        1615
0.113        1500        183        1620
0.124        1500        183        1620
0.133        1500        183        1625
0.028        1500        163        1690
0.037        1500        163        1720
0.045        1500        163        1730
0.053        1500        163        1740
0.061        1500        163        1740
0.072        1500        163        1760
0.08        1500        163        1760
0.089        1500        163        1760
0.093        1500        163        1750
0.106        1500        163        1755
0.113        1500        163        1740
0.124        1500        163        1725
0.133        1500        163        1730

评分

1

查看全部评分

 楼主| 发表于 2007-5-29 12:31 | 显示全部楼层

多谢大侠!!

多谢牛人,你觉得还有其它解法吗?理论上这个问题的解,5个参数都该是正数的
 楼主| 发表于 2007-5-29 12:38 | 显示全部楼层

疑问!

我这只有matlab,请问此题用matlab是否可以解?毕设论文要用,请帮帮我!!谢谢!!
发表于 2007-5-29 14:19 | 显示全部楼层
如果要求所有参数值都为正,在“Function"语句前加一句:
ParameterDomain = [0,];
就能保证都大于0了,只是最终结果要比无约束的差点:

均方差(RMSE): 36.1310600109825
残差平方和(SSE): 67883.5818708952
相关系数(R): 0.987139800063916
相关系数之平方(R^2): 0.974444984870228
决定系数(DC): 0.974443180407927

参数        最佳估算
----------        -------------
beta1              1.89407786386106E-9
beta2              2020.68374271964
beta3              0.0307379431368949
beta4              0.0403234376567827
beta5              0.567388200207612

Matlab自然能解,但上面解释过了,涉及初值的选取再加上约束,成功率不敢保证。
 楼主| 发表于 2007-5-30 08:24 | 显示全部楼层

用nlinfit计算时对初值敏感意味着什么?

调用nlinfit做回归分析时对初值敏感意味着什么呢?
问题http://forum.vibunion.com/space/html/93/t-44593.html,我用matlab计算调用nlinfit,
 楼主| 发表于 2007-5-30 08:32 | 显示全部楼层

我的计算是这样的

model.m文件
function yy=model(beta,x)
yy=(beta(1)+beta(2).*x(:,1).^beta(3)).*(1+beta(4)*log(x(:,2))) .*(1-((x(:,3)-25)/1643).^beta(5));
%第二个括号中对数运算值有小改动,数据还是那组,命令窗口如下:
x=[0.028 0.00057 293;0.037 0.00057 293;0.045 0.00057 293;0.053 0.00057 293;0.061 0.00057 293;0.072 0.00057 293;0.08 0.00057 293;0.089 0.00057 293;0.093 0.00057 293;0.106 0.00057 293;0.113 0.00057 293;0.124 0.00057 293;0.133 0.00057 293;0.028 1500 293;0.037 1500 293;0.045 1500 293;0.053 1500 293;0.061 1500 293;0.072 1500 293;0.08 1500 293;0.089 1500 293;0.093 1500 293;0.106 1500 293;0.113 1500 293;0.124 1500 293;0.133 1500 293;0.028 1500 183;0.037 1500 183;0.045 1500 183;0.053 1500 183;0.061 1500 183;0.072 1500 183;0.08 1500 183;0.089 1500 183;0.093 1500 183;0.106 1500 183;0.113 1500 183;0.124 1500 183;0.133 1500 183;0.028 1500 163;0.037 1500 163;0.045 1500 163;0.053 1500 163;0.061 1500 163;0.072 1500 163;0.08 1500 163;0.089 1500 163;0.093 1500 163;0.106 1500 163;0.113 1500 163;0.124 1500 163;0.133 1500 163]
y=[1070 1080 1090 1100 1120 1130 1150 1150 1160 1170 1180 1190 1195 1410 1420 1430 1440 1450 1460 1470 1470 1480 1470 1480 1480 1495 1530 1600 1615 1610 1605 1610 1620 1620 1620 1615 1620 1620 1625 1690 1720 1730 1740 1740 1760 1760 1760 1750 1755 1740 1725 1730]’
beta=[1000 600 0.4  0.1 0.5];
betafit=nlinfit(x,y,'model',beta)
.^与^的区别已分清,还有*与.*,但现在结果对初值敏感,换初值结果变化大,用1stopt计算,写函数时老报错,
Function y=(beta1+beta2*x1^beta3)*(1+beta4*log(x2)) *(1-((x3-25)/1643)^beta5);
请大侠们指教!
发表于 2007-5-30 09:31 | 显示全部楼层
这是很多软件都存在的问题.--- 一般都要有一定经验才可以较好地得到收敛解.
当然很多情况下,还是可以得到较好的结果的.
1stOpt的强项是拟合优化,所以这个问题用1stOpt求解较好.
对于微积分,方程求解等,则它就无能为力了,这就要用我们熟知的Matlab(或类似软件)了。
总之,要善于利用不同软件的优点,这样才能更好地解决问题.
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

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

GMT+8, 2024-12-12 16:30 , Processed in 0.064230 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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