工具:MATLAB
警告:Equation is badly conditioned. Remove repeated data points or try centering and scaling.
出现这一警告的一般是因为数据在横坐标方向上跨度太大,在这种跨度很大的多项式拟合里,为了提高拟合精度,通常希望让横坐标变得更加集中,因为在一个相对狭窄的小区间上去拟合,要比在一个相对很宽的区间上拟合更容易,且能提高拟合精度。MATLAB推荐的做法是: centering and scaling transformation,即以横坐标的均值为中心、以横坐标的标准差来做归一化因子,将数据变得相对集中。
比如将这段代码:
x=1990:1:2008;
y=[34.1972 38.0773 42.3786 47.1423 52.4127 58.2367 64.6644 71.7483 79.5432 88.1057 97.4938 107.7658 118.9796 131.1914 144.4542 158.8166 174.3208 191.0005 208.8791];
n=2;
p=polyfit(x,y,n);
变成:
x=1990:1:2008;
y=[34.1972 38.0773 42.3786 47.1423 52.4127 58.2367 64.6644 71.7483 79.5432 88.1057 97.4938 107.7658 118.9796 131.1914 144.4542 158.8166 174.3208 191.0005 208.8791];
n=3;
mu = [mean(x); std(x)];
x1 = (x - mu(1))/mu(2); % 手动实现 centering and scaling
p1 = polyfit(x1,y,n);
plot(x,y,'bo',x,polyval(p1,x1),'r-')
legend('data','fitted',2)
警告:
Warning: Duplicate x-y data points detected: using average of the z values.
意思就是,你的(x,y) 坐标值出现了重复的点,计算时会取z的平均值来计算。
一个个检查有没有重复可不是什么好办法。好在看见网上有人出了一个很聪明的方法:先建立一个新的矩阵A,使得A=x+sqrt(-1)*y. 这样就使得xy坐标变成了一个复数。接着借助unique()函数,这个函数可以判断出一个矩阵中所有不重复的值。举个例子,如果A=[1 1 2 3 4 5 5 6], unique(A)=[1 2 3 4 5 6],因为A中出现了1到6. 这样利用unique(x+sqrt(-1)*y)就可以判断出数组中有没有重复的了。
可是我的数据经过这样的处理,发现并没有重复的xy值。这是怎么回事?
查询matlab的help文件,上面有这么一句话:
“this means that there are two or more data points where the input values (x, y) are the same or very close together.”
这就是说,如果两个值差得很近,也许也

最低0.47元/天 解锁文章
2005

被折叠的 条评论
为什么被折叠?



