文件交换

图片缩略图

Polyfitn.

版本1.3(56.7 kB) 约翰D 'Errico
1或n尺寸的多项式建模
4.9
74评级

180下载

更新2016年4月27日

查看许可证

Polyfitn是polyfit的扩展,允许用户使用多个自变量创建模型。它还允许用户指定一个通用模型,例如,一个二次模型,有常数和二次项,但没有线性项。
例如,要将多项式模型符合从余弦曲线中选择的点,我们只需要均匀的条款。
x = -2:.1:2;
y = cos(x);
p = polyfitn(x,y,'常数x ^ 2 x ^ 4 x ^ 6');
p.cofficients.
ans =.
[0.99996 -0.49968 0.041242 -0.0012079]
系数当然不会是精确的,因为我只使用了有限数量的项对于本质上是一个截短的泰勒级数,我只有有限数量的点来建立模型。cos级数的前4个系数应该是
>> [1 -1/2 1/24 -1/720]
ans =.
1 -0.5 0.041667 -0.0013889

所以我们得到了预期的结果。

当然,聚苯乙烯可以在更高的维度下工作,因为这是它真正设计来解决的问题。

x =兰德(100 1);
y = rand(100,1);
z = exp(x + y)+ randn(100,1)/ 100;
p = polyfitn (x, y, z, 3);

结果可以转换为符号形式,以更简单地查看模型。这里我将使用我的sympoly工具箱,但也提供了一个polyn2sym函数。

polyn2sympoly(p)
ans =.
* x1 ^2 + 1.4919* x1 ^2* x2 + 0.041084* x1 ^2 + 1.4615* x1 * x2 ^2 - 0.095977* x1 * x2 + 1.2799* x1 + 0.56912* x2 ^3 - 0.15306* x2 ^2 + 1.361* x2 + 0.94819

当然,参数误差估计是为那些想要确定所生成项的重要性的人而生成的。

我还提供了评估这些模型和区分模型的工具。

一个警告-小心使用高阶多项式来拟合你的数据。仅仅因为低阶模型有效,高阶模型并不一定更好。高阶多项式常常在数据点之间产生严重的环。总是绘制你的数据。想想你将要构建的模型。然后绘制结果模型。使用您的眼睛来验证结果,而不是简单地查看r平方系数(尽管我也返回了该参数)。

如果您确实发现高阶多项式模式是必要的,因为您的曲线太复杂了,考虑使用回归或平滑样条模型代替。

引用

John d'Errico(2020年)。Polyfitn.(//www.tatmou.com/matlabcentral/fileexchange/34765-polyfitn), MATLAB中央文件交换。检索

评论和评级(128.

蒂姆

托马斯

优秀的份额,约翰·埃拉莫。但是有一点查询,大多数时候我们使用高阶多项式来模拟大型数据集,独立变量矩阵的列变为线性依赖,矩阵变为单数。
一世。我们可以在正常运行中使用伪反转:232-241的Polyfitn?
II。但是,这导致某些系数的方差变为零和t统计到纳米,如何克服这件事?

Yihan张

看起来很棒,似乎非常准确(比较我手动计算的几个)。但这简单地包裹起来,你可以点击一下你所需要的一切!做得好!

Heehang金

亲爱的,约翰D 'Errico
感谢您分享您的惠益代码
你能解释你用它来找到条款数量的等式吗?实际上我设法基于下面的等式计算二次模型的术语(系数)的数量

no =(n + 2)(n + 1)/ 2%n是变量的数量
目前,如果我使用3度或更多,我面临着计算系数数量的问题。请你帮助我好吗 ?

问候

有人知道如何在gpu上运行这个函数,或者显著加速计算吗?

感谢您的工作。您是否知道如何使用多项式作为可接受优化的函数(例如fminimax)?多齿性的输入必须在此处向变化。

这只是工作正常。拇指向上。

术语[1 1 1 0]是三阶项,至少在Polyfitn如何看待它方面。这是一种三种互动项。如果在模型中需要该术语,则可以始终指定该模型。

做得好!我只有一个问题。当我查看如何生成型号时,对于令我们说:
订单= 2;
p = 4;
我们得到:
modelterms =
2 0 0
1 1 0 0
1 0 1 0
1 0 0 1
1 0 0 0
0 2 0 0
0 1 1 0
0 1 0 1
0 1 0 0
0 0 2 0
0 0 1 1
0 0 1 0
0 0 0 2
0 0 0 1
0 0 0 0
varlist = {'x1'} {'x2'} {'x3'} {'x4'}
我的问题是,为什么有些组合缺失了,比如:
1 1 1 0
1 0 1 1

还是这个包裹的超级粉丝!

嗨,约翰!令人惊叹的工作!我是Matlab的初学者,我正在尝试使用你的工具来获得曲线的等式。我有两组点,x和y,其中命令曲线(x,y)产生所需的曲线(https://imgur.com/a/nq7pqxa.).我想要的是这条曲线的方程。有可能用你的工具来做吗,还是我都做错了?非常感谢:)

请在下面的地址上找到纠正版本的函数,该函数采用Massimo CIACCI解决方案,并在确定系统时修复贝纳因素错误(ndata == nterms)。
http://ecco-qua.modexpeng.com/?fi=ivap1ne6ir&fn=polyfitn.m.

希望它有助于他人

在第419行中找到了一个简单的错误:
-------------
如果没有这种修复,它会用一个术语像'y ^ 2 * x ^ 2'一起射击解析错误
k >> ptot = polyfitn([yy(:),xx(:)],zfunc(:),'y y ^ 2 y * x ^ 2 y ^ 2 * x ^ 2')
使用Polyfitn> ParseModel(第379行)错误
变量不是一个有效的名称:'2'
-------------
解决办法:
术语=术语(1 + k1:结束);%修复解析错误
%术语(K1(1))='';

-------------

使用此修复程序,指数部分也从术语字符串中消耗,而不会留下类似的东西
'x ^ 2 * x ^ 2'
'^ 2 * x ^ 2'
'2 x ^ 2'<---错了
“X ^ 2”<,对吧

这真是太棒了!这招很管用。对于那些有一维向量x y和矩阵Z的人,这样做可能会有帮助
[x,y] = ndgrid(x,y);
p = polyfitn ([X (:), Y(:))、Z(:),“恒X1 X1 ^ 2 X2 ^ X1 * X2”)%
谢谢这个伟大的工具!

loi dang.

桑托什

Zuzkat.

请,如何解决“贝卡因”错误?

一直在找到这个工具非常有用!
这也适用于幂次定律吗?如果是,语法是什么?提前谢谢!

Catsui

对不起,就在发布消息后,我终于找到了“下载”…——“无论如何,非常感谢你

在这里,在文件交换,我发现了工具“permn”。
permn (0:2, 2)
提供完整二次模型的所有9个术语。

伟大的工具!
但是,我注意到,如果我使用polyfitn([x1 x2],y,2),模型术语不含混合术语[2 1]和[11]。仅使用混合项[11]。这是预期的吗?还是一个错误?

@Jacob如果您的数据在10x10网格中组织,x,y和z向量都将每个值都有100个值。x和y将重复10次不同的网格值。这与您使用的散射3绘图功能相同。这样做是更有用的,因为它没有*要求*您的x和y值要组织为网格。

@Chad:
谢谢乍得!是的,我最终算出来了,但我还是不明白为什么z是x - y平面上的数据分布当它的大小不是n_x x n_y?

@Jacob:
polyfitn的语法要求x,y,和z在polyfitn(x,y,z…是列向量或行向量,而不是网格。

嘿,约翰,
谢谢你这个功能!我有一个问题:由于我在matlab中绝对缺乏知识,我无法围绕下面迈出我的头:我有一个(x,y)的飞机/网格 - 让我们说10x10 - 以及z = f的测量数据点(x,y)。所以z是一个10x10矩阵,100个条目。每当我尝试polyfitn([x,y],z,3)matlab告诉我,z必须是向量,而不是矩阵。您的“手动”表示,Z必须具有尺寸NX1,其中n是x或y的大小。但我没有得到z如何只有10个条目而不是10 ^ 2。如果你能帮助我,那就太好了。欢呼雅各

太感谢了!

秦旭

嗨,约翰,
谢谢你的Polyfitn工具箱,这是一个很好的帮助!

我正在处理一个4-5个输入参数(从excel文件导入,一个列向量)和一个参数的问题,其他参数依赖于这个参数。
我用CF工具箱和两个参数验证了我的函数。
当我用第三个输入参数尝试时,我收到警告:

警告:矩阵是接近单数或严重缩放。结果可能不准确。RCOND = 1.794064 e-17。

此外,我检查了R2(=0.9495),我认为结果调整得太好了。

你能想到解决这个问题的可能方法还是我错过了什么?
我以为这个工具箱是专门用来处理多维问题的。

如果你能想到任何可以帮助我的事情,我将非常感激!

非常感谢,
欢呼托比亚斯

这是我的编码。

x = durchmesser3;
y = plattendicke3;
w = emodulniet3;
z = Kraft3;

p = polyfit ([w] x, y,, z, 2);

如果存在('sympoly')== 2
polyn2sympoly(p)
结尾
如果存在('sym')== 2
polyn2sym(p)
结尾

@Ramon:

a + b * sqrt (x):
Polyfitn(x,y,[0; 1/2])

a + b / x:
polyfitn (x, y, [0, 1])

Jaime

约翰! !谢谢。不用多说了,我要给它编程。谢谢!;)

它是polyfit,能够适合以下功能:

a + b * sqrt(x)或a + b / x

非常感谢这个工具箱,很棒的帮助!

它是否能够替代统计工具箱中的stepwiseglm功能?

是否有任何特定的会议论文,解释了Polyfitn的全过程?
它真的有助于挖掘算法,而不是试图了解编码。
谢谢

有没有人有一个例子是如何在3D中使用它?

谢谢!

我正在寻找一种使用多项式适应3D字段的方法。此功能完全快速地解决了任务。

感谢您分享这个!

嗨,约翰!我是Matlab的起动器。我需要找到从表面的多项式拟合,具有两个值x和y的载体。

X是1x191, y是1x51。

然后我有飞机z,哪个尺寸为51x191。

我可以用:
表面(x, y, z)

但我无法安静地了解我如何使用文件才能找到我的等式。

谢谢你的回答!

安培

我已经克服了新手的身份,并且成功地利用了它。完整的魔法!谢谢你!

嗨,约翰,
我可以开始说我是一个严峻的matlab新手。我有三组记录的数据,我使用scatteredInterpolant和meshgrid创建一个表面图。现在我要找到这个曲面的公式。但是当输入三个数据集时,我得到“错误使用betainc
z必须是真实的
非负面。

Polyfitn错误(线条
266)
polymodel。P =
Betainc(polymodel.dof ./(t。^ 2
+
polymodel.DoF)、polymodel.DoF / 2 1/2);“

Z变量都是25到26之间的正数。我不确定这是否是使用三个特定的数据集而不是从函数中获取数据的问题。

非常感谢。

MIMO - 我不确定你在问什么。

你问的是,是否只有一个变量x,但有多个y向量?Polyfitn不是用来解决这种形式的问题,但它将只是Polyfitn内部的一个循环。我想我可以写polyfitn来循环y的列。这是我下次发布的一个想法。:)

问题是您使用Polyfitn来简单地计算回归系数,或者如果您想要整个九个码,即标准错误,R ^ 2等。

例如,如果你的问题就像你描述的那样简单……

假设X是数据的NX1列向量,独立变量向量,修复了所有问题。Y是NXP阵列,因此您需要解决P分开问题。然后可以轻松找到回归系数:

ab = [(n, 1), x (:)] \ y;

数组AB将是2xP阵列,其中每列AB是一组回归系数。所以第一行AB将是每个问题的常量术语。

: = ab (1);
b = ab(2,:);

同样,这没有提供任何统计数据,R^2等等。但对于你提出的问题,这是一个简单的解决方法。

米姆

嗨,约翰,
这个功能很神奇。我刚刚遇到了一个问题是否有可能找到一个多元线性回归的形式是" y(I)=a(I)+b(I) "只有一个变量X,通过找到向量a(i)和b(i)?

假设和是变量,那么就这样做:

mdl = polyfitn([φ(:),θ(:))、z (:), 2);

您可能需要使用meshgrid或ndgrid(根据需要)来生成phi和theta。

嗨,伙计们!我一直在做一个三维图,(从- /3到/3的点)和都是一样的,每个点都有一个值z,所以最后我得到了和的每个可能组合的矩阵。我想多项式地近似矩阵中的点在和的函数中。我已经看了polyfit但是你必须放的点(z)不可能是一个矩阵。Polyfit也不行因为它只适用于2D (,z)或(,z)

好工作!

除了基本的东西,什么都没有。(我承认旁观者清。)就是经典的多元线性回归。参见Draper和Smith关于回归分析的任何文本。所以任何来自统计工具箱的工具都可以做同样的事,只要你为你的模型准备了适当的设计矩阵。

亲爱的约翰

谢谢你的好工具。我积极使用它,它的工作量很好。我想学习你正在使用的方法。我想知道你是否知道在哪里可以找到相关理论。

欢呼,

塞巴斯蒂安

netorha

你好约翰,
非常感谢你的精彩剧本。它工作得非常非常好!

但是,我有一个关于一个问题的问题,这有点困难......实际上我通过使用以下代码(其中Arr_node_coords_y,_x和Arr_temperuiteField是33x5矩阵的Matlab Fit()执行数据拟合:

[xData, yData, zData] = prepareSurfaceData(arr_node_coords_y, arr_node_coords_x, arr_temperaturefield);

%设置安装类型和选项。
ft = fittype('poly24');
选择= fitoptions(ft);

%适合数据的模型。
[fitresult, gof] = fit([xData, yData], zData, ft, opts);

%的阴谋
子图(2,2,2);
h = plot(fitresult, [xData, yData], zData);
轴([0 2.5 0 8 20 60]);
xlabel('宽度[m]');
ylabel('高度[m]');
Zlabel('温度[°C]');
标题('Fit'的温度);
网格;
用([8 8 60]);
彩色杆;

......有可能,用polyfitn()执行相同的东西吗?... - 我以几种方式尝试了,但不幸的是我没有找到工作解决方案。

也许有人可以帮助我......?

rihab.

你好,约翰
我将100x1,100x1的数据作为一个独立的变量和依赖变量作为100x100,也是它的复杂号码。您可以帮助我解决多项式适合吗?
当我一直试图为一个因变量的对角线元素做polyfit,它显示'错误使用betainc
输入必须是实数、满值和双或
单身的'。
它意味着什么,我如何克服这个问题?

@Sagar -但这不是一个多项式模型。所以你不能用多项式模型的工具来适应任何一般的非线性模型。使用非线性回归工具。曲线拟合工具箱是最简单的选择,但对于新手来说,统计或优化工具箱中还有许多其他选择。或者使用像fminsearch或fminbod这样的优化器,但在那里你需要最小化残差平方和。

Sagar.

嗨,优秀的功能。我知道我们可以做到:poly_fit = polyfitn(x,y,3);用于测试输入变量的所有组合(例如x1和x2)。但是,如果我想构建自定义输入指数,我该怎么办,我想适合这样的东西:
Poly_fit = 2.3x1^3 + 1.5e^-x2

我该怎么做呢?

Akash.

修复了南问题。对于那个很抱歉。

乍得格林

约翰·德埃里科(John D’errico)提交的众多优秀作品之一。

如果因变量包含任何nan,就会产生令人困惑的betainc错误。我建议在代码的早期添加这个错误检查:

断言(SUM(ISNAN(DEPVAR))== 0,'依赖变量不能包含任何NAN。')

JinSun

难以置信的谢谢你的贡献!

Akshay.

工作伟大,应该包括在标准包

Christoph

嗨,约翰,

我使用“Polyfitn”找到基于三个输入变量的非线性系统的不同参数的多项式。在三个方程中插入这些多项式,然后我试图“向其定位”,但通过插入不同订单的多项式,我无法收敛到一个解决方案。

我一直在浏览你的文件交换列表,寻找其他相关代码。我想知道我是否应该尝试使用一些样条方法而不是'polyfit ',但我不确定如何插入它的方程和解决他们。同时给出了求解三个非线性方程组的其他方法。

谢谢

约翰

我很抱歉,但我只能假设像米奇一样的豪华,正在使用一个相当旧的matlab释放。

如果您真的想解决问题,您将为我提供足够的信息,以了解这是这种情况。自测试案例是完美的,因为我在这里展示了,我的建议是使用一个合理的最近的发布,而且米奇说他正在使用7岁的雷发布并得到同样的错误,我认为是这种情况.

如果您确实在使用一个最近的版本,并且仍然有问题,那么我只能假设您使用不当,或者您安装了导致问题的其他东西。例如,当我执行这个测试时,它运行得很完美,但我没有一个7年前的MATLAB版本,我甚至不能运行那么旧的东西。

indvar =兰德(12,2);
depvar =兰特(12,1);
M = [0 0;1 0;0 1;2 0;1 1;0 2;3 0;2 1;1 - 2;0 3];
P = Polyfitn(Idvar,depvar,m)
P =

ModelTerms (10 x2双):
系数:[-0.0610 -4.6966 5.5355 27.4400 -24.9658 -0.4228 -32.4825 42.3187 -18.4250 5.9917]
ParameterVar: [12.5177 249.5518 129.5089 850.2142 511.0641 282.0906 504.6530 953.0042 477.2848 209.7347]
Parameterstd:[3.5380 15.7972 11.3802 29.1584 22.6067 16.7956 22.4645 30.8708 21.8468 14.4822]
DOF:2
P:[0.9878 0.7943 0.6748 0.4460 0.3845 0.9822 0.2851 0.3040 0.4878 0.7192]
R2: 0.6497
调整后_2:-0.9265
RMSE:0.1327
varnames:{'''}

没有你的有用信息,我无法猜出问题是什么。我在此上下文中引用的信息将涉及告诉我您拥有的Matlab版本。它将涉及告诉我完整的错误消息,而不仅仅是一个错误消息的片段。

顺便说一下,尝试适合只有12个数据点的数据集,其中具有10个术语的模型将产生几乎毫无意义的结果。我会称之为大规模过度使用数据的情况。

Gautam

D'Errico先生,非常感谢您的提交。它看起来非常有用,除了我给出12 x 2矩阵作为独立变量矩阵和从属变量的12 x 1列矩阵时,它会显示以下结果:
未定义的功能或变量“Varlist”。

多晶硅误差(第233行)
polymodel。VarNames = varlist;

我使用的模型是这样的:
M = [0 0;1 0;0 1;2 0;1 1;0 2;3 0;2 1;1 - 2;0 3];

有关如何为我工作工作的任何建议将非常有帮助和极大地赞赏。非常感谢你。
高坦。

米奇,

它与你认为它在你的测试中被正确定义无关。我只是不知道它的定义是什么,因为你给了我除了这个变量以外的所有东西。所以除非你能给我一个可建构的失败的例子,否则我不知道你在做什么。我使用了一个不同的变量名是完全不相干的。我可以把传入的变量命名为Fred和Barney,它就会运行。

我也不知道这个旧的MATLAB版本是否有问题。这个网站告诉我,我用R2007b编写了这个工具,所以它应该对你有用,但也可以想象,多年来对它做的一个mod现在在旧版本中失败了。这是我无法测试的东西,因为我不能使用那个旧的MATLAB版本。

所以我的第一个建议是运行我给出的测试。验证它是否正常运行。如果它不能运行,那么您需要查看您所拥有的测试中的输入参数有什么不同。或者,如果你不想在网上发布,你可以把你有的数据发给我。

如果问题是您的旧版本确实是问题,那么您将需要学习使用反斜杠(并不是那么困难)来解决问题,或者也许可以获得统计工具箱的副本。

嗨,约翰,
谢谢你的快速回复。
对于我的问题中缺少的数据感到抱歉,但我的变量称为err_func是您的outpar,它已定义。
我检查了所有变量的尺寸,它们是正确的。
然后我尝试复制并浏览您的榜样并显示相同的错误:

???未定义的功能或变量“Varlist”。

==> Polyfitn误差232
polymodel。VarNames = varlist;

可以是我的matlab版本(r2007b)的问题?

提前致谢
米奇

米奇,

我不知道你在干什么。我最初的猜测是,您试图通过编辑器或类似的工具“运行”该函数。你不会这样运行函数,尽管很多人尝试这样做。

我确实看到您没有在示例中定义变量err_func,所以我甚至不能真正猜出您的错误是什么。

inpar =兰特(20,2);
outpar =兰特(20,1);
Model_exp = [1 0;2;0];
p = polyfitn (inpar outpar model_exp);

此测试用例很好地运行。

嗨,约翰,
谢谢你的投稿。
我试着在我自己的数据上使用它。但是我不能正确设置modelterms参数:

IE。

in_par =(ζθ);
Model_exp = [1 0;2;0];
p = polyfitn(in_par,err_func,model_exp)

运行后出现以下错误:

???未定义的功能或变量“Varlist”。

==> Polyfitn误差232
polymodel。VarNames = varlist;

错误在==> launch_regr在14
p = polyfitn(in_par,err_func,model_exp)

请你帮我吗?

我想它仍然回避了一个问题,polyfit是否需要有能力拟合多个右手边,即,同一个模型,但有多个因变量?

就个人而言,我发现这只需要稍微很少,并且当我们在先前的化身支持一大群色彩科学家中使用此类能力时,它真的只适用于构建监视器模型。金宝app从那时起,监视器更复杂,从而较少的线性。我猜想较新的监视器,使用更复杂的型号更好地处理。对于打印机等,这肯定是真的,它最好使用3-D查找表来处理,符合我自己的GridFit等工具。

但事实是,我经常惊讶地发现别人以我没想到的方式使用这些工具。

因此,如果我看到至少有一些要求这种能力的人,我会考虑添加它。在此之前,我的偏好是为了简化代码在这方面。(嘿,我应该退休!)

我完全同意约翰的观点;我轻率地提出了那个建议,没有全盘考虑。对不起,我把你引入歧途了。谢谢约翰的建议和卓越的数学工具-它们是无价的!

我很抱歉,但我完全不同意马克给安德森的建议。

具有多个输出变量的系统不再需要Polyfitn的简单环路。该循环的成本根本不足以提高代码的复杂性和接口的复杂性。

建议,而是一种使用像Gauss-Newton,LSQNONLIN或LSQCurveFit等这样的迭代方案,这些都是荒谬的方法。您仍然需要循环,或者您需要基本上生成一个块对角线族族矩阵的大问题。所有这些都避免一个简单的循环?或者你会写一个循环,只是为了避免循环?请注意,在Mark的建议中,您需要编写一些代码只是为了评估模型。如果您使用像LSQNONLIN或LSQCurveFit等工具,则需要提供雅可碧展,或者您需要让工具呼叫您的目标函数,只是为了计算有限差异以生成雅各的差异。

不要为了避免一个简单的循环而把迭代工具扔到一个问题上,在一个真正能用基本线性代数解决的问题上。请注意,即使迭代工具会迅速收敛,这些工具也会尝试进行多余的迭代,直到它有效地意识到它确实收敛了为止。这将需要一个备用的雅可比矩阵求值。

@anderson,你可以使用牛顿曲面(//www.tatmou.com/matlabcentral/fileexchange/43097-newton-raphson-solver)或如果您有优化工具箱lsqcurvfit或lsqnonlin (//www.tatmou.com/help/optim/nonlinear-least-squares-curve-fitting.html.

安德森

这个工具看起来非常有用。但我是否正确理解,它不会拟合具有多个输出变量的系统?如果是这样,是否有人知道一种工具,可以为具有多个输出变量的系统进行多项式拟合吗?

Eran -这对一些人来说可能很有趣,但我认为这将鼓励人们去适应那些订单太高的模型,而我经常被迫告诫人们不要这样做。

由于您的想法需要为代码添加更多选项,因此它会使代码更加复杂。此外,使用该工具将不那么简单,因为生成并返回了许多模型,那么PolyValn和Polyn2sym等工具将无法直接工作,或者还需要修改。

就效率的显着增长而言,请记住,只要代码中有更多选项,就会对基本用户变得效率较低。复杂的代码也更有可能有意外的错误。

所以我自己不会去做这种改进。你自己能做到吗?是的,理论上是可以的。为了提高效率,需要在建模过程中封装一个循环,可能使用qrupdate函数从模型中添加或删除术语。我不确定这与围绕整个代码的简单循环相比是否值得,只是重复调用polyfitn,除非您广泛使用该工具。

伊兰

你好,我们又见面了,

非常感谢你的最后一个答案!
当然这是一个愚蠢的问题:)

我有另一个问题,这可能有点棘手 -
假设有一个n个点的集合。
我想要检查什么多项式适合每k当然,我可以做一个“for”循环并得到我的答案......但这是非常效率的。

有没有办法修改代码拆分,以便这将是工作?

我认为主要问题是您定义“Design Matrix”的部分。

再次感谢您的快速帮助!

作为一个延续,让我这样解释一下,因为这是回归中的常见问题。

创建DataSet时,其中y = x / 2,您的数据在不填充(x,y)平面的区域的区域中。相反,它完全在y = x / 2线上生活。实际上,给定X的X和Y完全依赖于彼此,我们知道Y的值。

问题是,当您的点脱落该线路时,我们没有关于z发生的事情的信息,因此没有估计完整模型的系数可能是令人满意的。

为了帮助说服您发生了什么,让您从您创建的原始函数z开始。

z = 4 + x + x。^ 2 + x。* y;

将已知关系替换为z,以将其作为x的函数。然后我们会有:

Z = 4 + x + 1.5*x^2

看到我们可以将z算作x仅x。

Out = Polyfitn(X,Z,2)
出=
Modelterms:[3x1双]
系数:[1.5 1 4]
参数var: [1.5362e-32 1.6407e-28 7.6808e-26]
std参数:[1.2394e-16 1.2809e-14 2.7714e-13]
R2: 1
AdjustedR2: 1
RMSE: 9.327 e-13
varnames:{'x1'}

这里没有任何警告,而且基本上吻合得很好,得到了我们期望的系数值。我也可以简单地把z写成y的函数。

嗨eran,

但想想你在做什么。

乍一看,我认为x比较大,因此这只是一个缩放问题。然后我看了看你的问题。这就是问题所在!

y = x / 2

您的模型在x和y中是二次的,因此它有条款x。^ 2,x。* y和y。^ 2。当然,您希望Polyfitn将告诉您x的系数为零,因此隐含地是您创建数据时。

但是你创建了y作为x的简单倍数。你应该看到x。* y == 2 * y。^ 2 == x。^ 2/2。

世界上没有线性代数方案,可以智能地恢复这些术语的系数,并知道您从中启动的一组系数。解决方案根本不是唯一的。这就是为什么你得到关于奇点的警告。你会得到一个答案,但不是一个独特的答案。

这里的故事是垃圾,垃圾出来。您的数据无法充分支持估计您希望适合的型号。金宝app

伊兰

嗨,乔恩,

非常感谢您提供了这个必要的功能。很遗憾matlab不支持这个…金宝app

我尝试使用此功能,并遇到了一个小问题。
我使用:
x = 0:100;
y = x / 2;
z = 4 + x + x。^ 2 + x.y;
在= [x'y'];

Out = Polyfitn(Z,2);

我得到的是一个关于由函数qr产生的矩阵R的奇异性的警告。当然,当我用“\”时,实际上是用了“R”的逆。
在使用函数“qr”后,这在行中发生了两次。

您是否有任何建议如何解决此问题?

当然,我问这个问题,因为我得到了“Polyfitn”产生的系心与你所期望的那些......

非常感谢你!

嗨,亚历克斯,

我觉得你想用ezsurf,而不是ezplot。例如,这对我来说很有效:

xy =兰德(100 2);
Z = 3 + 2 * SUM(XY,2)+ SUM(XY。^ 2,2)+ 4 * PROD(XY,2)+ RANDN(100,1)/ 10;
型号= Polyfitn(XY,Z,2);
有趣= polyn2sym(型号);
ezsurf(乐趣)

生态队伍

嗨,约翰,

这些功能很棒!

我正在使用它来模拟两个垂直锥体的相交,这为我提供了3D空间的抛物线。我想知道,是否有一种内在的方式来绘制拟合曲线的尺寸?我尝试使用polyn2sym工具然后使用ezplot,但它无法正确显示3D曲线。

谢谢,
亚历克斯
Ecosat团队

嗨雷蒙德,

这些参数的推导是为了适用于有噪声的模型。例如,假设我在一个点上得到了一个给定过程的10个度量值。常数模型的最小二乘最佳估计,因此y=c,由样本的均值给出。与此同时,我们可以计算均值估计值中的不确定性估计值,用它来计算参数周围的近似置信区间。我们可以用更复杂的回归模型做类似的事情,根据数据中感知到的噪声,对模型中的参数和这些参数周围的不确定性进行估计。噪声被认为是模型估计后剩下的东西。再一次,这将给出标准差的估价值我们可以把它放到参数上。(将提供的标准差乘以学生的t统计量,得到一个近似的置信区间。使用大约+/- 2或3 σ是得到置信区间的常用方法)

事实上,大多数时候你有更多的数据点比参数适合模型,我们也可以在这些参数中形成我们不确定性的估计。您拥有的数据越多,当然越好,因为它允许我们更好地估计参数。一件好事是我们甚至不需要纯粹的复制来形成对参数中不确定性的估计。不确定性基于模型无法在数据中预测的内容。

传统上,对于多项式模型,这些标准差估计是决定在模型中删除项的一种方法。如果置信区间包含0作为一种可能性,那么我们可以得出结论,我们不能将给定参数的估计与零区分开来。

至少这在传统模型中是真的,我们正在尝试将正确的模型适应我们的数据,并且所有阻碍这种过程的所有内容都是随机(高斯)噪声的存在。上述近似也假设参数是独立的,因此根据数据,x和x ^ 2通常不会是正交变量。缺乏正交性的缺乏在回归估计中引入了相关性,这是在用于报告的参数标准偏差的近似值中忽略了这一点。

当模型中缺乏适合时,这种方法存在额外的问题。在这里,我们正试图将一个模型适合数据,但实际上,该过程不是真正基于该模型的。我们选择的模型可能只是现实的近似,或者它可能是错误的。假设您有一个曲面,并且您尝试估计线性模型。在这种情况下,将有缺乏契合,因为该数据不受模型表示的很好。

当然,线性代数不明白缺乏适合不仅仅是纯粹的噪音。在这方面,数学是有点愚蠢的。它无法看到残留物中的模式。它只是相信残留物是纯噪声,并使用该噪声在使用标准统计技术中产生对参数中的不确定性的估计。

最后,我想说的是这些标准偏差是基于您提供的数据估计参数的粗略措施,根据您提供的数据,基于多个近似,并基于模型的有效性这个数据。

嗨,约翰,

这是一个很棒的工具!我正在使用它来适应三维晶片上的磁场的二次函数。

我对适合参数的不确定性感兴趣。解释“parametersts”是正确的,因为这种不确定性?(如果不是,那是什么?),关于我如何确定如何鉴于我没有向代码提供测量不确定性的“parameterstsd”是有点困惑。你能解释一下这个“parameterstd”是如何计算的?

谢谢你!
雷蒙德

yonatan - 系数的绑定约束不是选项之一。您可以使用像LSQNONNEG这样的工具用于基本的基本非负性约束。例如,如果x和y是列向量,则将A和B的非负系数作为向量,您将执行此操作:

Ab = lsqnonneg([x, x.^2],y);

对于对系数的更复杂的约束,您通常希望从优化工具箱中等更换LSQLIN等工具。例如,如果您只想约束其中一个系数或者需要对系数的总和上的约束,则LSQLIN将是有用的。缺少该工具箱,还有其他工具,就像我自己的lee等文件交换,可以沿着这些行为您做一些东西,并且随着一些努力,您可以始终将许多常规问题转换为LSQNONNEG可以处理的那样。

yonatan.

这很棒!
有没有办法限制这个函数只有正系数?
例如,f(x)= a * x + b * x ^ 2用于正A和B?
预先感谢。

安德鲁

这很棒!

Syeda.

陈云潘

你需要在模型中列出术语。例如,要指定一个总顺序不高于3,但y中没有立方项的模型,您可以指定modelterms参数为

modelterms = [3 0
2 1;
2 0;
1 - 2;
1 1;
1 0;
0 2;
0 1;
0 0]

或者,您可以通过为同一模型提供作为字符串的字符串列表来进行:

modelterms ='x ^ 3,x ^ 2 * y,x ^ 2,x * y ^ 2,x * y,x,y ^ 2,y,常数'

马丁

嗨,约翰,首先,干得好!
我的问题:是否有可能为我的多项式使用两个不同的订单?因为我设法将我的功能(3D)与订单6的多项式适合(n = 6)。但是,用多项式为单项方式拟合我的功能是很好的。5在一个方向上,另一个方向,另一个方向(m和n)。
z(x,y)= a(n)* x ^ n + b(m)* y ^ m + a(n-1)* x ^(n-1)+ b(m-1)* y ^(M-1)......

杰夫 - Polyfitn返回结构的原因是因为模型可能有些复杂,用户在多个变量中指定的一般术语。1-D多项式更容易描述为系数列表,因为1-D Polyfit总是假设一个非常特定的模型形式。

然而,从返回的结构中提取系数完全没有问题。例如,考虑这个简单的模型z(x,y)。

一些简单的数据…
x = rand(10,1);
y = rand(10,1);
Z = x + 2*y + 3 + randn(size(x))/10;

生成一个模型
mdl = polyfitn (x, y, z,{“x”、“y”、“常数”})
mdl =
ModelTerms (3 x2双):
系数:[0.9706 2.0162 3.0302]
parametervar:[0.0214 0.0266 0.0093]
parameterstd:[0.1462 0.1631 0.0966]
R2: 0.9787
调整频调整:0.9726
RMSE: 0.1180
VarNames: {' x ' ' y '}

当然,系数只是结构字段中的数字。所以我们可以将系数提取为向量:

格式长
C = mdl。系数
C =
0.970599545975740 2.016179608143575 3.030225230230983

它们不是我所投入的内容,而是随机噪声对数据损坏了一点。

或者我们甚至可以把这个结构转换成一个符号多项式,一个符号,或者我自己的符号形式。

Polyn2sympoly(MDL)
ans =.
*x + x *y + x *y + x *y + x *y + x *y + x *y + x *y + x *y + x *y + x

我们可以在我们自己的情况下评估多项式,而无需Polyvaln,只要您知道模型是什么。(并且由于每个术语的指数都存储在结构中,这也很容易。)

C(1)*。5 + C(2)*。25 + C(3)
ans =.
4.019569905254746

比较:
polyvaln (mdl [5, .25])
ans =.
4.019569905254746

杰夫

约翰-干得好。问:我想我读到过用polyfitn解决的系数只能用polyvaln来解释。那是正确的吗?如果我想使用polyfitn来寻找数据拟合练习的系数,然后将它们应用到matlab之外的未来数据集(因此没有polyvaln),这是不可能的吗?或者,我误解了什么?

eric h.

丹尼斯·伍特斯
感谢提供这个修复。它的工作原理!

约翰,好工作。
我遇到了一个小故障。
当将modelterms指定为指数数组时,变量“varlist”没有被赋值。
我通过在第160行插入以下内容来解决此问题:
Else varlist = repmat({"},1,p);

尽管我写过polyfitn,高阶多项式(尤其是多维)很少能很好地替代选择具有适当行为的非线性模型。也就是说,如果您有这样一个模型。这些多项式会给你带来麻烦,尤其是在推断的时候。除非您有足够的数据,否则即使在您的数据中,模型也可能表现奇怪。我称之为内插问题。

基本上,您需要非常小心,高阶多项式适合。

顺便说一下,nlinfit确实处理多个独立变量。你建议它没有,但没有关于这一点的限制。问题是在多维中选择智能模型。这通常非常困难。一个好理由是像w = f(x,y,z)这样的功能形式是难以想象的。

就个人而言,我的偏好一直是为了这些问题而转移到样条状模型。我常常无法从薄的空气中拉出模型,我更愿意避免高阶多项式。我自己的gridfit是一个简单的例子,具有2个独立变量。

Karan.

你好约翰,

谢谢你的建议。我真的很感谢你的帮助。从我的理解是,数据是不够的,使用这样一个高次多项式拟合。实际上,我正在考虑将数据拟合到我自己的自定义方程,但还没有找到一个模型-类似于nlin拟合,但有多个独立变量。如果你有任何建议,请告诉我。

谢谢你。

Karan.

嗨Karan,

你已经陷入了回归建模中的常见谬论。它如下:“如果n是好的,那么n + 1更好,n + 2必须真的很精彩。”

谬误很容易开始。我们在我们的数据上尝试一个线性模型。它有效,好的,但不是很好。毕竟,必须出现问题只是当地线性。所以我们尝试一个二次模型。它适合更好。缺乏契合减少了。但模型中仍存在问题。符合我们数据的形状不充分。

既然我们在二次方程上做得很好,那就试试三阶模型。是的,它做得更好。哇。继续推进,直到我们有第6个订单,或者第10个订单。多项式模型就像泰勒级数近似,所以更多的项一定会给出更好的结果。但最终,这一切都变成了我们眼前的数字垃圾。那么发生了什么?

这里有3个变量。一阶模型有常数项,还有x, y, z项。模型中有4项。你有74个数据点,估计相应的系数肯定没问题。

二次模型在6种术语中增加了6个,x ^ 2,y ^ 2,z ^ 2,也是横向产品项x * y,x * z和y * z,因此总共10个系数来估计。

我们谬论的诅咒是,当我们按顺序向上移动时,项的数量增长得越来越快。在3阶,我们有20项需要估计,35项在4阶,56项在5阶,84项在6阶。第10个订单的型号将有286个条款。

你的数据怎么样?您只有74个数据点。(在我做一些统计咨询的早期时,我的客户总是问他们需要多少数据。我的答案几乎总是“比你更多。”

每个不同的数据点至多是一条额外的信息。(重复的分数在这里不算数。他们所做的就是减少你估计中的不确定性。因此,复制是好的,但在某些方面不如不同的点那么有价值。)

更糟糕的是,新的数据点并不总是提供新的信息。例如,两个点决定一条线。直线上的第三个点对直线的斜率和截距没有增加新的信息。同样,就像一个复制,它所做的就是减少你对系数估计的不确定性。

那么当你试图估计一个只有74个数据点的六阶模型时,会发生什么呢?您的数据中包含的信息太少,无法支持这么大的模型。金宝app返回的信息来自MATLAB,告诉你你的矩阵在数值上是奇异的(秩不足)。

有了这一切,事情可能会变得更糟,使问题变得更加困难。一些数据比其他数据更糟糕。例如,如果将1E6添加到所有自动变量,则某些给定顺序的多项式仍将在数学上进行估计(理论上),但它可能导致数字单数的矩阵。这是因为使用双精度浮点算术编写线性代数。这些数字可以简单地躺在太宽范围内的动态范围,以便代数成功。(当你提出1E6的顺序到连续更高的力量时会发生什么?)

所以当你估计的系数比数据点多的时候,你总是会得到一个缺秩矩阵,但取决于数据本身,你可能仍然会有缺秩问题。

如果您的中心和缩放变量,某些多项式模型将变得更加易于估计。因此,使每个变量使其具有零的平均值,并且大致在间隔[-1,1]中。请参阅升高为+/- 1到更高权力的募集数字不会创建动态范围问题。这将迫使您改变问题,但它通常允许您获得其他难以解决的问题的可行估计。(使用正交多项式是另一种经常有帮助的方法。)

我希望这有帮助。真的,这是一个我看到作为一个学期的长期课程的主题,所以我只触及了表面。

约翰

Karan.

非常感谢你做的这些。我正在得到这个警告 -
警告:Rank deficient, Rank = 64, tol = 5.8216e-010。
我用了3个自变量,74个数据点,用了6度。您能帮我理解一下这是什么意思吗?谢谢你。

约翰,

像往常一样,很棒的代码!

只有一个数据点时似乎失败了。

n = 1;
x =兰德(n, 2);
Y = EXP(SUM(X,2))+ RANDN(N,1)/ 100;
p = polyfitn (x, y, 3);

虽然失败在某些情况下可能是可取的,但它实际上应该抛出一个错误。您的代码确实为n-1个输入提供了n-param输出,因此处理这种情况并不矛盾。

我认为这是在第120行之后的逻辑中——检查输入的大小并相应地进行转置。

谢谢!

约翰 - 这里有两种可能的问题。首先,如果您遇到了已知多个右侧侧面的问题,那么是的,它是非常可矢量的。由此,我的意思是与相同的独立变量集的问题,但不同的依赖变量集。然后反斜杠是去的方式,允许您为大量节省提供一次次要方程式。您需要建立设计矩阵当然,但这不是一件难点。

然而,如果您有多个问题,每个问题都有不同的自变量集,那么向量化将要求您构建一个稀疏块对角设计矩阵。因此,您可以在这种努力中获得一些收获,但收获的意义不像第一种情况那么大。您需要将设计矩阵构建为一个稀疏矩阵。这里的技巧是将块作为单独的稀疏矩阵提供给blkdiag。因此,在单元格数组中创建独立的(稀疏的)设计矩阵,然后将其作为逗号分隔的列表传递给blkdiag。你能足够有效地做到这一点,使反斜杠解决比循环调用更有效吗?是的,但就像我说的,这需要一些努力。

您可能会从我的回复中收集,以至于将结果从此代码中的结果传染措施不会是一个琐碎的动作,但您可以在投资的某个时间更有效地进行事物。

约翰

很棒的功能!

您能否建议任何方式向用户矢量化?我有一个标量函数,它取决于它在空间f(x,y,z)中的位置,并且我计算围绕n尸体的这个函数。目前,我为每个身体运行循环,但有没有办法修改代码,以便反斜杠运算符一次在它们中都在跨越所有,返回n个系数?

这应该这样做......

看看下面这两行:

[q,r,e] = qr(m,0);

polymodel.coffients(e)= r \(q'* depvar);

假设一个权重为W的列向量,每个数据点一个。将以上几行改为:

[q,r,e] = qr(bsxfun(@ times,w(:),m),0);

polymodel.coffients(e)= r \(q'*(w(:)。* depvar));

这应该为您提供参数的加权估计。我认为参数的统计数据也将工作,以及R ^ 2等。当然,您需要在体重向量中作为一个参数传递。

上面的更改假设您使用具有BSXFUN的版本。它已经存在了一段时间,所以不应该是一个问题。即使没有,对Repmat的呼叫也会替换它。

伟大的功能!谢谢你!有没有简单的方法把它转换成加权最小二乘。我想自己试着做,也许你有什么见解或警告?

线性回归(polyfitn)在其核心使用反斜杠。例如,假设一个人希望使用polyfit估计一个变量的二次模型。模型是

Y = A1 * x ^ 2 + a2 * x + a3(+噪声)

Polyfit能够通过以最小化残差的平方和的方式求解线性(但过度的)方程式的线性(但过度的)系统来估计三个未知系数[A1,A2,A3]。同样,反斜杠是这里下面的发动机。

现在,假设有人想要估计一个更复杂的模型,它有两个独立变量z(x,y)。我把它写成一个完整的两变量二次模型,有6个未知数系数。

Z = A1 * x ^ 2 + A2 * x * Y + A3 * Y ^ 2 + A4 * X + A5 * Y + A6 +噪声

只要你有足够的数据来估计这六个未知系数,问题本质上是一样的。它们以线性的方式进入问题就像我们之前看到的单变量问题一样。反斜杠再次可以解决估计系数的超确定问题。

实际上,Polyfit和Polyfitn都使用设计矩阵的QR分解来实现其目标。这是因为它们都设计成在参数上生成协方差矩阵估计。QR分解是服务两个目的的最简单方法,但它只是线性代数。

谢谢..你的功能解决了我的问题,但老实说,我很好奇2D表面线性回归的概念。我们是否必须在每一行上做Polyfit(第一个订单)以获得最佳的表面拟合平面?

谢谢。

更新

1.3

为p和DoF添加了文档,在帮助中也添加了一个示例。

1.2.0.0

删除适合数据的NANS

1.1.0.0.

在系数上添加了p值。

Matlab释放兼容性
使用R2007B创建
与任何版本兼容
平台的兼容性
视窗 苹果系统 Linux

polyfitntools / demo / html /