在matlab中我有2个数据集,每个数据集由192个点组成,我使用matlab曲线拟合工具箱来查找数据之间的相关性。它对数据进行多项式拟合得到r平方值。直到现在没有问题,但我正在为更多的数据集做同样的程序,我得到了以下适合我看起来不对。原始数据有点嘈杂,但不那么嘈杂,相关性会很小。
在进行此拟合之前,我没有对数据集进行任何标准化或规范化。我只是打开cftool
,然后在x轴上绘制一个数据集,在y轴上绘制另一个数据集然后它给我一个拟合。
此特定图的我的x数据是(它是1x192向量):
[0.00567884422104210 0.00569408830031418 0.00572138721599404 0.00569975708436488 0.00570545448583814 0.00569369374744166 0.00569563036622742 0.00566596177157741 0.00564522789669859 0.00564777221738393 0.00569035412216911 0.00567315592749138 0.00569878611862423 0.00569518382892348 0.00570283089572832 0.00567842496456661 0.00568067523788957 0.00566608538366334 0.00570454736884095 0.00566818166357483 0.00570961691287243 0.00572044020550668 0.00574088624152054 0.00566479613576671 0.00566608538366334 0.00566640778733622 0.00571469547537104 0.00566963384315990 0.00579483752389121 0.00553722841745620 0.00546670792516501 0.00573609142438767 0.00566173652214560 0.00566705270476430 0.00568400872896068 0.00568925305209833 0.00570380259930853 0.00569585871152685 0.00573213608623289 0.00571606342327985 0.00570972175158768 0.00571091687663606 0.00569708052924811 0.00568509554179675 0.00567202993133767 0.00566417423795219 0.00569597250745323 0.00567864418006962 0.00568891146251751 0.00569579324896427 0.00567684749344899 0.00569558715400373 0.00567844008671576 0.00570959789841987 0.00573349711019414 0.00570907582131189 0.00571094284081769 0.00571231953756342 0.00571123926053416 0.00568473432845418 0.00564484259733881 0.00566433279754403 0.00566439804473876 0.00568613333023755 0.00567631361064464 0.00567379185182118 0.00570342823629353 0.00568363772351148 0.00568505478199934 0.00568845947423812 0.00566499368455101 0.00568390381379168 0.00570081854849188 0.00571914776237673 0.00570766987394644 0.00571470680144348 0.00566915578039862 0.00565964601579385 0.00566302033316934 0.00566430371497644 0.00566961965465689 0.00567931476686888 0.00569099378053500 0.00568676388316038 0.00568351321709490 0.00569420010875536 0.00568090747310061 0.00567817959036125 0.00567496918909057 0.00568601151761792 0.00570068432296731 0.00568152083831520 0.00569698510782558 0.00567267156373908 0.00567738630382919 0.00567644084952437 0.00565230197496677 0.00568102525133482 0.00567619348815465 0.00567783704226933 0.00568029144278347 0.00570161890971965 0.00568436017206210 0.00569265664596718 0.00567127030453059 0.00567499736589668 0.00569610702265938 0.00569839910466992 0.00568783186020722 0.00567342243258319 0.00568817765560068 0.00569436802133702 0.00568154577259346 0.00569015913920067 0.00569374830185126 0.00567963282984794 0.00567171804390853 0.00567366726894102 0.00571257082933444 0.00568497453785619 0.00568885763847554 0.00568008265357695 0.00569387121280633 0.00566680261731652 0.00569677457803111 0.00570214269919954 0.00565244753071010 0.00564394435584691 0.00566157836051888 0.00566381845950213 0.00566847923265304 0.00569407028359330 0.00571005428023826 0.00568591442803343 0.00569223802921068 0.00568280396557755 0.00569379429701353 0.00568185797845967 0.00567578846141909 0.00567894666171056 0.00567320653743196 0.00564915245464934 0.00564795336885811 0.00563876138924631 0.00570327030061123 0.00572680520535131 0.00571341874853335 0.00570107369687699 0.00569366065757143 0.00568594220398016 0.00567630269020819 0.00567557721022348 0.00570737562187293 0.00568463677306191 0.00568722490736285 0.00569534732529629 0.00570479990114402 0.00571411996406732 0.00571919739151671 0.00570542626235309 0.00566178844454233 0.00566838603319001 0.00568828948707550 0.00567046602172531 0.00570652500348306 0.00574602789466369 0.00572372616038287 0.00569588990905875 0.00570224072822409 0.00566492842363350 0.00569041869408171 0.00568476030982822 0.00569910124619053 0.00574897246393032 0.00574568231591548 0.00572309009522084 0.00570247024465303 0.00570511017839644 0.00572662555187936 0.00571990918102634 0.00571698038953088 0.00571766341142988 0.00571654118780795 0.00568621131344125 0.00567004964850449 0.00569846565094612 0.00569116456760390 0.00569510598289396 0.00568087262388984 0.00570926927674283 0.00572360544301340 0.00570546782794645]
我的y数据是:
[0.0722052523936974 -0.116284726028758 -0.0344955010810505 0.276009056945174 0.539214054114762 0.697655655788995 0.876703275086714 1.35496012084228 2.01348390764194 2.37342873676440 2.07957359248374 1.26036319473217 0.929334696235048 0.590598025351673 0.235834445927379 -0.634855444766222 -0.196035504475008 0.0607926210102202 0.143712062082165 0.261387916727359 1.15208072958088 2.26956029539525 2.14140323725389 1.32527937956009 0.429278098437174 0.187344008350156 0.0921821895387395 -0.596412065951111 -0.639186355715831 -0.0337201126995248 0.315383126436722 -0.303408538825290 0.402049748955380 -0.207361277768321 -0.761283125558432 -0.778208393542492 -0.227622649685446 -0.0288009492235658 0.262994409393257 0.708909565660383 0.862183004974083 0.662850335501189 0.465101063799991 0.253832450093375 -0.0321163889325910 0.0196147382615682 0.0315117409166952 -0.0783649110194694 0.233676109491918 -0.165704737948315 -0.276695047616687 -0.0503088475859882 0.159017398241689 0.774822568696547 1.63033542173908 1.96838543280211 1.78792906416767 1.13295614618529 0.807083189320715 0.542620751782781 0.487896272058663 -0.00418587643191634 -0.144295513271167 0.183873423191098 0.113533725207394 -0.00430357220947427 -0.196791317313870 -0.643489823492006 -0.951364421237257 -0.383361081478214 0.426211243875390 1.13334866991336 1.27654664494661 0.742748215803317 0.273748243034661 -0.0202656354243274 0.106200919981608 -0.0916810713096844 -0.184773494785167 0.345836159551591 0.378069148554025 -0.106302503639941 -0.678181507182131 -0.378431726956584 -0.0465689524969581 0.0700301240621313 0.413028957779804 1.13116222671878 1.21226247864782 0.963424288062250 0.351751964306848 0.0788086243226716 0.296354131830850 0.159612903347104 -0.0612765052608151 -0.135787574724828 0.000814395527494810 0.0168806776690738 -0.311891165068794 -0.278675668483064 0.00753515744635787 0.135343330694322 0.0280662030524211 0.0595791272469946 -0.252306230696664 -0.588670120243735 -0.634102873468700 -0.232647761703011 0.0517640016372520 0.192936288397654 0.199136689455075 -0.514612856119197 -0.177998975401088 0.144590675561822 -0.0229188957843282 -0.128466737771051 -0.0474331907200261 0.156260656563529 0.558399012388735 0.862981103714190 1.17242711442847 0.744839900638128 0.233199325540570 -0.434334973997602 -0.490085597200587 -0.402577374203381 0.0198723789840384 0.216008528886140 -0.153188926184130 0.0673573786883735 0.487663020673144 0.823850286313647 1.16294695947181 0.948514383294815 0.380337141536444 -0.210720418596695 -0.394244050556542 -0.334141497118032 -0.0795506855064582 0.152861140581226 0.403287746810583 0.126481956417593 -0.108866581219803 -0.206337064585274 0.473057912851193 -0.224741145734541 -0.622433405012376 -0.893040090399582 -0.719194071466464 0.0587807370031474 0.675532690894235 0.981569882283263 0.501648786405245 -0.340750486834334 -1.00302428896732 -1.31187571878483 -0.742195541090809 -0.377781672865874 -0.0280225451392606 0.274264649464704 0.283584937354784 -0.0731474524135590 -0.490698906647292 -0.302573312222626 0.169071932483100 0.295244780718635 -0.00362078349316385 -0.379120810663201 -0.501961543947379 -0.246842022011707 -0.272864519628719 -0.234391733447854 0.0633256095408698 0.353791189510313 0.0911936917798627 -0.271051028413234 0.0225884492332092 0.0108052266881251 0.0382593201666643 0.123282127801682 0.545365640522478 0.756198929543784 1.05092258341412 1.34567714114993 1.55525356844634 1.30396631038941 0.985535529263796 0.878095221851050 1.02480699518592 0.466575891400046 -0.183830651227942 -0.213031465771310]
有没有人比我现在做的更好的建议呢?
感谢。
答案 0 :(得分:2)
至于am304,有了这样的数据集,我强烈建议最初在Y-X
参考中拟合数据,然后只计算X-Y
参考中的等价物,如果你真的需要多项式系数这个方式。
curvefit
工具箱中的一个非常有用的功能(我在中广泛使用)是函数smooth
。在旧版本的Matlab中,它曾经可以直接从cftool
访问,但是我忽略了一些原因,它不再那么明显了,但它仍然是工具箱的一部分。
如果你只提供一个参数(一个简单的向量),它只会做一个移动平均线(仍然有用但可以通过其他几种方式实现)。但是,它在平滑分散数据方面变得非常强大,特别是当您将数据分散在一个维度(在您的情况下为y
),而在另一维度(x
)中过于密集时。 / p>
它通常会产生更好的贴合度,并且在视觉上它使操作员更容易判断合身的质量。足够的谈话,图形示例:
首先,我在Y-X
域中进行计算(只需将x
替换为y
,反之亦然):
%% // calculations in the Y-X referential
%// this will do the calculations to obtain x = f(y) = pinv(1).y+pinv(2)
x2 = smooth( y , x , 0.2 ) ;
pinv = polyfit( y , x2 ,1 ) ;
yp = [min(y) max(y)] ;
xp = polyval( pinv , yp ) ;
请注意,我对平滑数据(x2
)进行了拟合。另请注意,我将两个变量都发送到函数smooth
(最后一个参数0.2
是用于平滑的数据集的范围)。这些平滑的数据是下图中的红点。了解数据趋势已经更容易直观了。
绘制所有:
%% // plot in the Y-X referential
figure ; hold on
plot( y ,x ,'.')
plot( y ,x2 ,'or')
plot( yp,xp ,'k','LineWidth',2 )
给出以下结果:
然后,您可以在X-Y
域中重新绘制该批次:
%% // plot in the X-Y referential
figure ; hold on
plot( x , y ,'.')
plot( x2 ,y ,'or')
plot( xp,yp ,'k','LineWidth',2 )
获取:
现在这给了你一个表达x=f(y)=pinv(1).y+pinv(2)
的多项式系数。如果你对这种关系感到满意,那么你就完成了。如果你真的需要系数来表达y=f(x)= p(1).x+p(2)
,那么反转系数很容易:
%% // recalculate the polynomial coefficients in X-Y referential
%// to have y = f(x) = p(1).x+p(2)
p = [1 -pinv(2)]./pinv(1) ;
现在多项式p
包含正确的系数,如果你用它构建拟合曲线:
yp2 = polyval( p , xp ) ;
plot( xp, yp2,'m')
你会看到洋红色的这条线与上图中的黑线完全匹配。
答案 1 :(得分:0)
要稍微扩展我在评论中所说的内容,我的建议是删除异常值,使x
适合y
而不是y
适合x
。我只有Octave,而不是MATLAB,但以下是等效的,在MATLAB中应该和Octave一样好用:
p = polyfit(y(x>=0.0056 & x<=0.00575),x(x>=0.0056 & x<=0.00575),1)
yi = linspace(min(y),max(y),50);
xi = polyval(p,yi);
plot(x,y,'bo',xi,yi,'r-')
得出以下结果: