lan397 发表于 2010-9-29 15:18:59

多元非线性回归问题

本人遇到以下问题,需做多元非线性回归,我自己初拟一个指数函数,但是效果非常不理想,改变几次初值,最好相关系数到0.58(excel手算的,相关系数计算小程序不准确),该如何选定回归函数及给定初值呢?希望高手不吝赐教。
x=[100 10.7 0
100 10.7 1
100 10.7 2
100 10.7 3
100 10.7 4
100 10.7 5
100 10.7 6
100 10.7 7
200 10.7 0
200 10.7 1
200 10.7 2
200 10.7 3
200 10.7 4
200 10.7 5
200 10.7 6
200 10.7 7
300 10.7 0
300 10.7 1
300 10.7 2
300 10.7 3
300 10.7 4
300 10.7 5
300 10.7 6
300 10.7 7
100 15.98 0
100 15.98 1
100 15.98 2
100 15.98 3
100 15.98 4
100 15.98 5
100 15.98 6
100 15.98 7
200 15.98 0
200 15.98 1
200 15.98 2
200 15.98 3
200 15.98 4
200 15.98 5
200 15.98 6
200 15.98 7
300 15.98 0
300 15.98 1
300 15.98 2
300 15.98 3
300 15.98 4
300 15.98 5
300 15.98 6
300 15.98 7
]
y=[110.80301
104.54847
84.84117
82.52244
92.32921
83.87712
83.96642
75.53389
123.73915
113.16948
97.96604
100.56338
102.22341
101.01701
99.90815
104.6684
132.8442
122.48814
116.48945
112.85501
116.04544
125.10151
116.39448
122.91425
135.56231
132.88212
77.77271
107.49568
108.52345
98.69237
111.2504
108.052
179.24035
180.45719
112.78747
123.59022
123.94181
121.77485
127.45383
127.55048
229.56915
233.42255
134.94563
133.17741
138.31906
137.60706
147.51052
153.53207
]
myfunc=inline('beta(1)*x(:,1).*exp((beta(2)*x(:,2))./(beta(3)*x(:,3)+beta(4)))','beta','x')
beta=nlinfit(x,y,myfunc,)
a=beta(1),b=beta(2),c=beta(3),d=beta(4)
yy=a*x(:,1).*exp(b*x(:,2))./(c*x(:,3)+d)
plot(y,yy,'*');hold on;plot(y,y,'r-')
%计算复相关系数
sum = 0.0;
absolute y1 = abs(yy-y);
for i = 1:length(absolute(y1))
sum = sum+(absolute(y1(i))).^2;
end
sum;
mean y = mean(y);
absolute y2 = abs(y-mean y);
sum1 = 0.0;
for i = 1:length(absolute(y2))
sum1 = sum1+(absolute(y2(i))).^2;
end
sum1
r = sqrt(1-sum/sum1)

lengyunfeng 发表于 2010-9-29 16:47:07

有几个问题哈:
1)myfunc你用的是内联函数,建议不要用它,改用匿名函数。
2)不知道你plot那一行有什么意义?按你函数的定义,y是带四个参数的3自变量函数,你画的图又是二维的,而且自变量用y,函数值用yy和y,这样画出来想体现什么?
3)你的自变量的名字有点问题,sum是matlab的一个函数,你又用sum来作为变量名,会出错的。
4)你的absolute y1 = abs(yy-y); 和mean y = mean(y); 是什么意思?我用的matlab7.0里没这样的语法,也没这样的函数。
5)你的mean y = mean(y); 把我弄得有点晕,y应该是实验结果值,你把y求平均后又传递给y,这样不把实验结果删掉了吗?那你的absolute y2 = abs(y-mean y); 不是0吗?
6)相关系数有直接的matlab函数可以求的,corrcoef。
自己再改改吧

lan397 发表于 2010-9-30 09:02:19

非常感谢版主的回答,我再仔细改改看看
MATLAB初学,问题确实太多:L

lan397 发表于 2010-9-30 09:30:54

不好意思,我还想麻烦各位,我是想求y(带四个参数的3自变量函数),如何选择一个合适函数(版主所说匿名函数),并验证其相关性呢?

lengyunfeng 发表于 2010-9-30 10:18:38

4# lan397
其实你的思路本身是对的,就是先从自己问题的背景里找到与模型相关的最接近的一个函数,利用实验结果来对函数进行最小二乘拟和,以此来确定函数里的参数。然后利用求出来的函数,代入实验时的自变量,求出理论结果,再对实验结果和理论结果进行验证相关性操作。这个函数一般情况下我们只能通过背景知识来获得,外行人帮不了你的,当然一些经典问题也有一些典型函数,比如人口问题就与指数函数相关等等。其实我觉得这些典型函数的获取往往是由微积分得来的,也许你可以从这个角度去想一下。
btw,你要搞清楚相关性代表什么意思,相关说简单一点就是两个变量之间是否具有确定关系,比如一个变量增加,另一个变量也增加,而且增加的幅度也大致相同的话,那么它们的相关性就强,相关系数就越接近1,反之二者之间若无明显的变化关系,则二者相关性弱,相关系数就越接近0。如果是在你这种情况的话,当然是相关性越强越好,所以你说的相关性系数为0.58,这样的结果不算很好,估计是你的函数选得有问题

lan397 发表于 2010-9-30 10:23:09

非常感谢,我还是应该多看一些书籍资料,急功近利终不可取!
学习去了!

shamohu 发表于 2010-9-30 10:29:43

看下这个式子:
y = (p1+p2*x1+p3*x1^2+p4*x3)/(1+p5*x1+p6*x3+p7*x3^2+p8*x3^3)*x2;


均方差(RMSE): 15.4138610447032
残差平方和(RSS): 11404.1813906601
相关系数(R): 0.894784718795659
相关系数之平方(R^2): 0.800639692990227
决定系数(DC): 0.767726303938625


参数 最佳估算
---------- -------------
p1 7.71069671843448
p2 -0.0148149843457423
p3 -8.82608729025376E-5
p4 -2.83613545360826
p5 -0.00445303747172456
p6 -0.205566257114756
p7 -0.0628607512029045
p8 0.00645592737472256

lan397 发表于 2010-9-30 13:31:55

感谢楼上的回答,您是用什么方法做的呢?

shamohu 发表于 2010-9-30 15:47:35

用1stOpt找的拟合公式。

lan397 发表于 2010-10-8 10:41:53

shamohu 版主,您好,请问您是随机挑选的公式么?
我也下载了一个1stOpt,但是不知该如何操作,把您的公式输入后选了几种算法,好像结果和您的都不太一样啊?
页: [1]
查看完整版本: 多元非线性回归问题