主题:请问matlab中有没有直接求最小二乘法拟合的相关系数的方法?
永恒的回忆
[专家分:810] 发布于 2007-12-21 12:54:00
请问matlab中有没有直接求最小二乘法拟合的相关系数的方法?
我用[a,res]=lsqcurvefit(fun,a0,x,y)求出来的res能反应精度但不是相关系数,它究竟是一个什么东西呢?[em10]
回复列表 (共10个回复)
沙发
永恒的回忆 [专家分:810] 发布于 2007-12-21 13:36:00
我自己编了一给求相关系数的函数
function res=res(x,y,n)
%RES 求的是最小二乘法的相关系数r,其中
%x,y为数据,n是数据的个数
lxx=sum(x.^2)/n-(sum(x)/n)^2;
lyy=sum(y.^2)/n-(sum(y)/n)^2;
lxy=sum(x.*y)/n-sum(x)/n*sum(y)/n;
res=lxy/(sqrt(lxx*lyy))
但运行是出错说
??? Subscript indices must either be real positive integers or logicals.
我尝试了很多次,发现把function res=res(x,y,n)改成function res=Res(x,y,n)却行了
这是什么回事啊?有哪位高手能告诉我
板凳
blivfate [专家分:720] 发布于 2007-12-26 15:59:00
polyfit函数就可以,他拟合出来的就是一个多项式,而多项式的系数都是用最小二乘法得出的。
可以用help polyfit来看帮助,会发现有这么一句话:
P = POLYFIT(X,Y,N) finds the coefficients of a polynomial P(X) of
degree N that fits the data Y best in a least-squares sense.
3 楼
永恒的回忆 [专家分:810] 发布于 2007-12-26 23:37:00
我明白你的意思,但我说的是最小二乘法中的相关系数r,这和多项式的系数是不同的。相关系数是一个描绘拟合程度的一个量!!!
4 楼
blivfate [专家分:720] 发布于 2007-12-27 21:57:00
我用下面的程序试了你的函数,结果出现的结果如下:
>> x=0:0.1:2;y=sin(x);
>> res=res(x,y,21)
??? Error: "res" previously appeared to be used as a function or command,
conflicting with its use here as the name of a variable.
A possible cause of this error is that you forgot to initialize the
variable, or you have initialized it implicitly using load or eval.
于是,我把返回变量名改为了re,就是程序变为如下:
function re=res(x,y,n)
%RES 求的是最小二乘法的相关系数r,其中
%x,y为数据,n是数据的个数
lxx=sum(x.^2)/n-(sum(x)/n)^2;
lyy=sum(y.^2)/n-(sum(y)/n)^2;
lxy=sum(x.*y)/n-sum(x)/n*sum(y)/n;
re=lxy/(sqrt(lxx*lyy));
再次运行上条命令:re=res(x,y,21)
就得到如下结果:
>> re=res(x,y,21)
re =
0.9162
没有了错误提示了。
因此,我想是因为你返回变量名和函数名冲突的问题。你可以试下!
注:我用的的是Matlab2007b版本
5 楼
永恒的回忆 [专家分:810] 发布于 2007-12-28 19:04:00
谢谢了,可能是版本的原因吧,我的是matlab7.01,在我这我原来的改法,和你的改法都行,但后来我用新的一个函数来实验:
function aaa=aaa(x,y)
aaa=x+y
运行
>> aaa(1,2)
aaa =
3
ans =
3
哈哈,怎么在这里又行了,变量和函数名都是一样的。
且我还有个郁闷的地方,matlab是区分大小写的,res与Res应该是不同的吧,
我想的是不是我的函数的问题,而是你调用这函数的问题:
>> res=res(x,y,21)
电脑在这才无法判断是变量,还是函数名。你不用改我的函数,直接改下这句调用
>> re=Res(x,y,21)也是行的。你试下啦~~~~~~~
还有我原来运行的错误提示是
??? Subscript indices must either be real positive integers or logicals
说什么是下标的问题,郁闷,不可理解。
不过这些都是小细节问题,讨论下娱乐下,哈哈
6 楼
blivfate [专家分:720] 发布于 2007-12-29 20:58:00
aaa(1,2)
能成功是因为你没有用返回变量,你可以试着用aaa=aaa(1,2)
来调用下,肯定是不成功的。
aaa=aaa(1,2)
??? Error: "aaa" previously appeared to be used as a function or
command, conflicting with its use here as the name of a variable.
A possible cause of this error is that you forgot to initialize the
variable, or you have initialized it implicitly using load or eval.
7 楼
永恒的回忆 [专家分:810] 发布于 2007-12-30 11:37:00
我想你还没弄懂我的意思,这些错误报告都不是来自于函数本身,而是你函数调用!!
aaa=aaa(1,2) 或 res=res(x,y,n)这样调用的,肯定存在二义性,
说白了你去这样调用polyfit=polyfit(x,y,n) sin=sin(x) sum=sum(x)
这些都是同样的错误,但你能说polyfit sin sum这些函数本身有错吗?!!!!
至于我原来的函数定义里function aaa=aaa(x,y)不存在二义性,我想最大的原因之一是matlab优先把aaa当作变量来处理,而aaa函数体内又没有再次调用aaa函数(递归),就不会出错。如果在函数体内出现递归,那么就和电脑原先认为aaa是个变量冲突,才出错。比如
function aaa=aaa(x,y)
if y>0
aaa(x,y-1)
end
这个无论你怎样调用都出错的。
>> aaa(1,3)
??? At compilation "aaa" was determined to be variable. As a variable,
it is uninitialized, but function "aaa" is now in context.
In MATLAB 7, you cannot use the same name in a single function as
both a function and a variable.
Error in ==> aaa at 3
aaa(x,y-1)
但
function aaa=aaa(x,y)
if y>0
aaa=x+y
end
却没有,就是这个原因。
8 楼
easy715 [专家分:0] 发布于 2008-06-27 12:35:00
[quote]我自己编了一给求相关系数的函数
function res=res(x,y,n)
%RES 求的是最小二乘法的相关系数r,其中
%x,y为数据,n是数据的个数
lxx=sum(x.^2)/n-(sum(x)/n)^2;
lyy=sum(y.^2)/n-(sum(y)/n)^2;
lxy=sum(x.*y)/n-sum(x)/n*sum(y)/n;
res=lxy/(sqrt(lxx*lyy))
但运行是出错说
??? Subscript indices must either be real positive integers or logicals.
我尝试了很多次,发现把function res=res(x,y,n)改成function res=Res(x,y,n)却行了
这是什么回事啊?有哪位高手能告诉我[/quote]
即使能得出结果也是不对的,相关系数的公式表达有误。
9 楼
kmzqa [专家分:40] 发布于 2008-11-04 10:14:00
用excel不是5秒就摆平,干嘛要用matlab,非要用,抄抄树上的公式也就可以了
10 楼
forgeteverything [专家分:0] 发布于 2008-11-08 21:03:00
可不可以用regress函数来反应?[em8][em15][em18]
我来回复