高中高中数学知识点总结:怎样去求两个变量x和y之间的相关系数r?

以下试题来自:
多项选择题有关相关系数的说法,正确的有()。
A.度量两个变量之间的相关性程度的指标
B.相关系数的大小范围和概率的大小范围一样,均为0到1
C.如果p=1,则X和Y有完全的正线性相关关系
D.如果p=0,则称X和Y不相关
E.相关系数越接近1越好
为您推荐的考试题库
您可能感兴趣的试卷
你可能感兴趣的试题
A.如果证券X的价格通常随着证券Y的价格一起升,则协方差是正的
B.如果证券X的价格通常随着证券Y的价格下降而下降,但下降的速度减慢了,则协方差就是负的
C.如果两个证券独立运动,互不影响,则协方差为0
D.如果两个证券独立运动,互不影响,则二者的&系数均为0
E.如果证券X的价格通常随证券Y的价格上升而下降,则协方差是负的
A.平均价格为41.5
B.中位数为53
C.中位数为65和41
D.众数为45
E.众数为41
A.算术平均数
C.样本方差
D.加权平均数
A.日K线是根据股价(或者指数)一天的走势中形成的四个价位,即开盘价、收盘价、最高价、最低价绘制而成
B.收盘价高于开盘价时,则开盘价在下收盘价在上,二者之间的长方柱用红色或空心绘出,称之为阳线
C.收盘价低于开盘价时,则开盘价在上收盘价在下,二者之间的长方柱用绿色或实心绘出,称之为阴线
D.无论是阳线还是阴线,其上影线的最高点均为最高价
E.无论是阳线还是阴线,其下影线的最低点均为最低价
A.直方图的纵坐标通常为数据的大小
B.直方图的纵坐标也可以是百分比
C.饼状图通常用来描绘总体中各个部分的比例
D.盒形图在投资实践中被演变成著名的K线图
E.散点图经常用来描述时间序列的数据[matlab 曲线拟合]matlab曲线拟合 - 非常好非常全面的介绍M拟合的参考资料_matlab 曲线拟合-牛宝宝文章网
[matlab 曲线拟合]matlab曲线拟合 - 非常好非常全面的介绍M拟合的参考资料 matlab 曲线拟合
曲线拟合向导
Genial @ USTC
Mathworks Tech-Note 1508
曲线拟合向导1. 介绍2. Mathworks 产品的曲线拟合特色a. 曲线拟合工具箱(Curve Fitting Toolbox)b. Matlab 内建函数与其他的带有曲线拟合能力的附加产品(工具箱)c. 线性曲线拟合d. 非线性曲线拟合3. 加权曲线拟合方法a. 曲线拟合工具箱b. 统计工具箱c. 优化工具箱4. 利用曲线拟合工具箱提高曲线拟合结果5. 其他的相关资料第1节: 简介MATLAB即有内建的解决很多通常遇到的曲线拟合问题的能力,又具有附加这方面的产品。本技术手册描述了几种拟合给定数据集的曲线的方法,另外,本手册还解释了加权曲线拟合、针对复数集的曲线拟合以及其他一些相关问题的拟合技巧。在介绍各种曲线拟合方法中,采用了典型例子的结合介绍。第2节: MathWorks产品的曲线拟合特色MATLAB有可以用于曲线拟合的内建函数。MathWorks公式也提供了很多工具箱可以用于曲线拟合。这些方法可以用来做线性或者非线性曲线拟合。MATLAB也有一个开放的工具箱DD曲线拟合工具箱(Curve Fitting Toolbox),她可以用于参数拟合,也可以用于非参数拟合。本节将介绍曲线拟合工具箱与其他工具箱、以及各种MATLAB可以用于曲线拟合的内建函数的详细特征。a. 曲线拟合工具箱曲线拟合工具箱是专门为数据集合进行曲线拟合而设计的。这个工具箱集成了用MATLAB建立的图形用户界面(GUIs)和M文件函数。曲线拟合向导
Genial @ USTC
利用工具箱的库方程(例如线性,二次,高阶多项式等)或者是用户自定义方程(局限于用户的想象力)可以进行参数拟合。当你想找出回归系数以及他们背后的物理意义的时候就可以采用参数拟合。?
通过采用平滑样条或者其他各种插值方法,你就可以进行非参数拟合。当回归系数不具有物理意义并且不在意他们的时候,就采用非参数拟合方法。曲线拟合工具箱提供了如下功能:?
数据回归,譬如 截面(?sectioning)与平滑;?
标准线性最小二乘拟合,非线性最小二乘拟合,加权最小二乘拟合,约束二乘(constrained least squares)拟合 以及 稳健(robust)拟合;?
根据诸如 R2 以及 误差平方和(SSE)确定的拟合性能的统计特征。请查阅曲线拟合工具箱提供的demos。b. MATLAB内建函数与具有曲线拟合能力的其他工具箱除了曲线拟合工具箱,MATALB与其他工具箱也提供了些可以用于解决线性和非线性曲线拟合的功能。本节列举并解释了其中几个。c. 利用MATLAB内建函数进行线性曲线拟合函数
用多项式进行数据拟合。polyfit(X,Y,N)对数据X,Y拟合N阶多项式系数,P(X(I))~=Y(I), 在最小二乘意义上。\
反斜线或者矩阵阵左除。如果A是一个方阵,A\B 基本上与inv(A)*B一致的,是采用的不同计算方式而已。polyval
在给定点计算多项式的值corrcoef
计算两个向量的相关系数。它可以与polyfit和polyval函数一起用来在实际数据和拟合输出之间计算R2 相关系数下面给出一个利用corref计算R值的例子:load census[p,s]=polyfit(cdate,pop,2);Output=polyval(p,cdate);Corrolation=corroef(cate,Output);cdate 与它自身很好的相关,同样的 Output也与它自身很好相关。反对角线上元素是
2曲线拟合向导
Genial @ USTC
cdate与 Output之间的相关性。这个值非常接近于1,因此实际数据与拟合结果能否较好的吻合。因此,这个拟合是“好”的拟合。(应该是这样判断的么?我怎么觉得应该通过pop与Output的相关性来判断拟合的好坏的呢?)利用反斜线操作符与polyfit函数进行回归与曲线拟合的更多的例子请参照MATLAB文档中的Regression and Curve Fitting一节。附加例子:数据集:t = [0 .3 .8 1.1 1.6 2.3]';y = [0.5 0.82 1.14 1.25 1.35 1.40]';plot(t,y,'o'), grid on方法1:多项式回归基于图形,数据可能通过二次多项式建模如下:y = a0 +a1*t +a2*t其中未知系数a0,a1,a2可以通过最小二乘(通过最小化通过模型计算出来的数据的偏差的平方和)拟合计算。三个未知数6个方程如下:用6x3的矩阵表示:X = [ones(size(t))
t.^2];则结果通过反斜线操作符得到:a=X\ya =0.53180.9191-0.2387因此二阶多项式模型为: y = 0.1*t-0.2387*t2曲线拟合向导
Genial @ USTC
计算模型在均匀空间的值,并将原来的值画在同一个图形上:
T=(0:.1:2.5)';Y=[ones(size(T)
T.^2)]*a;plot(T,Y,'-'t,y,'o'),grid on方法2: 线性参数回归建立模型:X=[ones(size(t)) exp(-t) t.*exp(-t)];a = X\y;T=(0:.1:2.5)';Y=[ones(size(T)) exp(-T)
T.exp(-T)]*a;plot(T,Y,'-',t,y,'o'),grid on曲线拟合向导
Genial @ USTC
方法3: 多元回归如果y是一个包含多个独立变量的函数,表示变量间的相邻关系的矩阵方程可以通过附加数据进行扩展。假设我们测量参数x1、x2的少数几个值的输出y,观测值如下:x1 = [.2 .5 .6 .8 1.0 1.1]';x2 = [.1 .3 .4 .9 1.1 1.4]';y
= [.17 .26 .28 .23 .27 .24]';本数据的一个多元模型是:多元回归解决的是通过最小二乘拟合求未知系数a0,a1,a2。通过构造回归矩阵X构造和解决同步方程,依然采用反斜线操作符。X=[ones(size(x1)) x1 x2];a=X\y;为了评价模型,求取绝对误差的最大值:Y = X *a;MaxErr = max(abs(Y-y));实例分析:曲线拟合(本节来自matlab的在线帮助文档)本节提供了以实际数据分析形式的在MATLAB中的数据分析基本能力的概貌。下面的例子是以收集的人口普查数据为基础,采用MATLAB函数对数据进行实验拟合:? 多项式拟合? 残差分析? 指数拟合? 误差界限1. 导入数据load census
(census.mat包含了美国1790年到1990年的人口数据)其中包括两个变量:cdate与popcdate 是从1790以10递增到1990的一个列向量,是年份数;pop 是cdate中年份相应的人口数据向量曲线拟合向导
Genial @ USTC
2. 多项式拟合首先我们想通过简单的多项式对普查数据进行拟合。利用MATLAB中的两个函 数进行处理:polyfit 与 polyval 。polyfit函数是在给定阶次多项式上对数据进行最小二乘意思上的最优拟合。假设采用4阶多项式,拟合过程为:&& p=polyfit(cdate,pop,4)Warning: Polynomial is badly conditioned. Remove repeated data pointsor try centering and scaling as described in HELP POLYFIT.p = 1.0e+005 *0.0000
6.0020警告的产生是因为polyfit函数用很大的值cdate作为基本数据,用他来产生范德蒙矩阵(Vandermonde matrix),具体细节的可以在polyfit的m文件中看到。cdate的展开导致尺度标准问题,一个解决办法就是标准化cdate数据。预处理:标准化数据标准化处理是为了提高后期数值计算精度而进行的尺度变化处理。一个处理办法是:
sdate=(cdate-mean(cdate))./std(cdate);然后再以标准化后数据进行4阶多项式拟合:&& p=polyfit(sdate,pop,4)p = 0.7047
62.2285通过图形我们来观察其拟合的好坏:&& pop4=polyval(p,sdate);&& plot(cdate,pop4,'-',cdate,pop,'+'), grid on曲线拟合向导
Genial @ USTC
另外一个规范化数据的方法就是通过结果与单位的知识进行转换。如,对于本数据集,选择1790作为0年也可以得到较为满意的解。3. 残差分析一个评价拟合好坏的测度就是残差DD观测值与预测值的差异。对不同的拟合,利用残差进行比较。从拟合图形和残差上,我们显而易见,采用标准化数据比简单的多项式可能对数据有更好的拟合。利用如下命令,分别对数据进行1阶,2阶,4阶的拟合,作图,并比较其残差: && load census&& sdate=(cdate-mean(cdate))./std(cdate);&& p1=polyfit(sdate,pop,1);&& pop1=polyval(p1,sdate);&& plot(cdate,pop1,'b-',cdate,pop,'g+');&& res1=pop-pop1;&& figure,plot(cdate,res1,'g+');&& p=polyfit(sdate,pop,2);&& pop2=polyval(p,sdate);&& figure,plot(cdate,pop2,'b-',cdate,pop,'g+')&& res2=pop-pop2;&& figure,plot(cdate,res2,'g+');&& p=polyfit(sdate,pop,4);&& pop4=polyval(p,sdate);&& figure,plot(cdate,pop4,'b-',cdate,pop,'g+')&& res4=pop-pop4;&& figure,plot(cdate,res4,'g+');&& max(abs(res1))ans =
41.3987&& max(abs(res2))ans =
7.5361&& max(abs(res4))ans =
6.3455曲线拟合向导
Genial @ USTC4. 指数拟合看前面的人口图形,发现人口数据曲线有些与指数曲线相似。利用这一点,我们试着对人口数据值的对数进行拟合,依然采用前面的标准化方法。&& logp1=polyfit(sdate,log10(pop),1);&& logpred1=10.^polyval(logp1,sdate);&& semilogy(cdate,logpred1,'-',cdate,pop,'+');
grid on&& logp2=polyfit(sdate,log10(pop),2);&& logpred2=10.^polyval(logp2,sdate);&& figure,semilogy(cdate,logpred2,'-',cdate,pop,'+');grid on&& logres2=log10(pop)-polyval(logp2,sdate);&& figure,plot(cdate,logres2,'+');&& r=pop-10.^(polyval(logp2,sdate));&& figure ,plot(cdate,r,'+')可以看出,残差更加随机性强一些。或许,残差随着人口数的增加而在数量级方面增长很快,但是总体而言,对数模型提供了更精确的拟合。曲线拟合向导
Genial @ USTC
5. 误差界限误差界限对于判别你的拟合是否是个合理的模型很有用。你可以通过从polyfit选择任意两个输出参数作为polyfit的两个输入参数。本例子采用普查例子断乎机和前面讲的规范化方法,利用polyfit和polyval得到二阶多项式模型的误差界限。对年度值进行规范化,本例子采用+-2△间隔,相应的其置信度的95%。&& load census&& sdate=(cdate-mean(cdate))./std(cdate);&& [p2,S2]=polyfit(sdate,pop,2);&& [pop2,del2]=polyval(p2,sdate,S2);&& plot(cdate,pop,'+',cdate,pop2,'g-',cdate,pop2+2*del2,'r:',cdate,pop2-2*del2,'r:'),grid on优化工具箱的利用(接1)函 数
描 述LSQLIN
有约束线性最小二乘优化LSQNONNEG
非负约束线性最小二乘优化问题当有约束问题存在的时候,应该采用上面的方法代替Polyfit与反斜线(\)。具体例子请参曲线拟合向导
Genial @ USTC
阅优化工具箱文档中的相应利用这两个函数的例子。d.
非线性曲线拟合利用MATLAB的内建函数函数名
描 述FMINBND
只解决单变量固定区域的最小值问题FMINSEARCH 多变量无约束非线性最小化问题(Nelder-Mead 方法)。 下面给出一个小例子展示一下如何利用FMINSEARCH1. 首先生成数据&& t=0:.1:10;&& t=t(:);&& Data=40*exp(-.5*t)+rand(size(t));
% 将数据加上随机噪声2. 写一个m文件,以曲线参数作为输入,以拟合误差作为输出
function sse=myfit(params,Input,Actural_Output)A=params(1);lamda=params(2);Fitted_Curve=A.*exp(-lamda*Input);Error_Vector=Fitted_Curve-Actural_O% 当曲线拟合的时候,一个典型的质量评价标准就是误差平方和 sse=sum(Error_Vector.^2);%当然,也可以将sse写作:sse=Error_Vector(:)'*Error_Vector(:);3. 调用FMINSEARCH&& Strarting=rand(1,2);&& options=optimset('Display','iter');&& Estimates=fiminsearch(@myfit,Strarting,options,t,Data);&& plot(t,Data,'*');&& hold on&& plot(t,Estimates(1)*exp(-Estimates(2)*t),'r');Estimates将是一个包含了对原数据集进行估计的参数值的向量。附图见后面:曲线拟合向导
Genial @ USTCFMINSEARCH通常能够用来解决不连续情况,特别是如果他们不出现在解的附近的时候。它得到的通常也是局部解。FMINSEARCH只能够最小化实数值(也就是说,解的域必须只能包括实数,函数的输出只能够为实数值)。当感兴趣的是复数变量的域的时候,他们必须被分割为实部与虚部。MATLAB的FIGURE窗口:最基本的拟合界面与数据统计工具MATLAB通过基本的拟合界面也支持基本曲线拟合。利用这个界面,你可以快速地在简单易用的环境中实现许多基本的曲线拟合。这个界面可以实现以下功能:a. 通过比样条插值(spline interpolant)、hermite 插值、或者是高达10阶的多项式插值实现数据的拟合;b. 对给定数据同时实现多样插值的绘制;c. 绘制残差图;d. 检查拟合结果的残差的数值;e. 通过内插值或者外推插值评价一个拟合结果;f. 对拟合结果和残差的模进行图形绘制;g. 将拟合结果保存入MATLAB工作空间。开发你的拟合应用的时候,你可以通过基本拟合(Basic Fitting)界面,也可以通过命曲线拟合向导
Genial @ USTC
令行函数,也可以同时作用。你可以通过基本拟合界面只能够实现2-D数据的拟合。然而,如果你用subplot绘制多个数据集,只要有至少一个数据集是2D的,那么就可以用基本拟合界面。可以通过如下步骤激活基本拟合界面:1. 绘制数据;2. 从figure窗口的 Tools 菜单条下面选择Basic Fitting 菜单项;有关Basic Fitting界面的更多信息,请查阅MATLAB帮助文档的相应部分。注意:对于HP,IBM以及SGI平台,MATLAB6.0(R12.0)以及MATLAB6.1(R12.1)的基本拟合界面不受支持。数据统计界面可以用来对图形中的每个数据集进行统计量的计算。可以通过如下步骤将数据统计界面激活:1. 制数据;2. 从figure窗口的 Tools 菜单条下面选择Data Statistics 菜单项;优化工具箱函数LSQNONLIN 解决非线性最小二乘法问题,包括非线性数据拟合问题LSQCURVEFIT
解决非线性数据拟合问题下面给出利用这两个函数的例子:LSQNONLIN:利用这个函数最小化连续函数只能够找到句柄解。下面的例子说明利用LSQNONLIN函数用下面的函数进行拟合:f = A + B exp(C*x)+D*exp(E*x)对数据集x与y进行拟合,其中y是在给定x的情况下的期望输出。为了解决这个问题,先建立下面的名为 fit_simp.m的函数,它利用数据x与y,将他们作为优化输入参数传递给LSQNONLIN。利用给定的数据x计算f的值,再与原始数据y进行比较。经验值与实际计算出的值之间的差异作为输出值返回。LSQNOLIN函数就是最小化这些差的平方和。
diff = fit_simp(x,X,Y)% 此函数被LSQNONLIN调用% x 是包含等式系数的向量% X 与 Y 是作为操作数传递给lsnonlinA = x(1);B = x(2);C = x(3);曲线拟合向导
Genial @ USTC
D = x(4);E = x(5);diff = A + B.*exp(C.*X)+D.*exp(E.*X)-Y;下面的脚本是利用上面定义的fit_simp.m函数的一个例子:% 定义你打算拟合的数据集合&& X=0:.01:.5;&& Y=2.0.*exp(5.0.*X)+3.0.*exp(2.5.*X)+1.5.*rand(size(X));% 初始化方程系数&& X0=[1 1 1 1 1]';% 设置用中等模式(memdium-scale)算法&& options=optimset('Largescale','off');% 通过调用LSQNONLIN重现计算新的系数&& x=lsqnonlin(@fit_simp,X0,[],[],options,X,Y);% 调用LSQNONLIN结果输出表明拟合是成功的Optimization terminated successfully:Gradient in the search direction less than tolFunGradient less than 10*(tolFun+tolX)% 绘制原始数据与新的计算的数据&& Y_new=x(1)+x(2).*exp(x(3).*X)+x(4).*exp(x(5).*X);&& plot(X,Y,'+r',X,Y_new,'b');注意:LSQNONLIN 只可以处理实数变量。在处理包括复数变量的实例的拟合的时候,数据集应该被切分成实数与虚数部分。下面给出一个例子演示如何对复数参数进行最小二乘拟合。曲线拟合向导
Genial @ USTC
为了拟合复数变量,你需要将复数分解为实数部分与虚数部分,然后把他们传递到函数中去,这个函数被LEASTSQ作为单个输入调用。首先,将复数分解为实部与虚部两个向量。其次,将这两个向量理解成诸如第一部分是实部、第二部分是虚部。在MATLAB函数中,重新装配复数数据,并用你想拟合的复数方程计算。将输出向量分解实部与虚部,将这两部分连接为一个单一的输出向量传递回LEASTSQ。下面,给出一个例子演示如何根据两个复数指数拟合实数X与Y。建立方程:function zero = fit2(x,X,Y)% 根据输入x重建复数输入cmpx = x(1:4)+i.*x(5:8);% 利用复数计算函数zerocomp = cmpx(1).*exp(cmpx(2).*X) + cmpx(3).* exp(cmpx(4).*X)-Y;% 将结果转换成一个列向量% 其中第一部分是实部,第二部分是虚部numx = length(X); % 实部长度zero=real(zerocomp); %实部zero(numx+1:2*numx)=imag(zerocomp); % 虚部为了评价计算这个函数,需要X与Y数据集。LSQNONLIN将根据它拟合出下面方程中的参数a,b,c与d:Y = a*exp(b*X)+c*exp(d*X);其中,a,b,c与d是复数变量。&& X=0:.1:5;&& Y=sin(X);&& Y=Y+.1*rand(size(Y))-.05;&& cmpx0=[1 i 2 2*i];&& x0(1:4)=real(cmpx0);&& x0(5:8)=imag(cmpx0);&& x=leastsq(@fit2,x0,[],[],X,Y);&& cmpx=x(1:4)+i.*x(5:8);&& Y1=real(cmpx(1).*exp(cmpx(2).*X)+cmpx(3).*exp(cmpx(4).*X));曲线拟合向导
Genial @ USTC
&& plot(X,Y1,'r');&& hold on&& plot(X,Y,'+');LSQCURVEFIT:利用此函数可以在最小二乘意义上解决非线性曲线拟合(数据拟合)问题。也就是说,给定输入数据xdata,以及观测的输出数据ydata,找到系数x,使得函数F(x,xdata)能够最好的拟合向量值。LSQCURVEFIT利用与LSQNONLIN相同的算法。它的目的在于专门为数据拟合问题提供一个接口。在拟合的时候,2维、3维或者N维参数拟合是没有什么差别的。下面给出一个3维参数拟合的例子。待拟合函数是:z = a1*y.*x..^2+a2*sin(x)+a3*y.^3;建立的myfun.m的函数如下:function F = myfun(a, data);x = data(1,:);y = data(2,:);F= a(1)*y.*x.^2+a(2)*sin(x)+a(3)*y.^3;下面的脚本展示了这么利用上面的函数:曲线拟合向导
Genial @ USTC
&& xdata= [3.6 7.7 9.3 4.1 8.6 2.8 1.3 7.9 10.0 5.4];&& ydata= [16.5 150.6 263.1 24.7 208.5 9.9 2.7 163.9 325.0 54.3];&& zdata= [95.09 23.11 60.63 48.59 89.12 76.97 45.68 1.84 82.17 44.47]; && data=[ ydata];&& a0= [10, 10, 10]; % 初识揣测&& [a, resnorm] = lsqcurvefit(@myfun,a0,data,zdata)Maximum number of function increase options.MaxFunEvalsa = 0.0088
-0.0000resnorm = 2.&& format long&& aa =
0.93 -34.83
-0.99&& option=optimset('MaxFunEvals',800);&& [a, resnorm] = lsqcurvefit(@myfun,a0, data, zdata, [], [], option)Optimization terminated successfully:Relative function value changing by less than OPTIONS.TolFuna =
0.53 -20.38
-0.64resnorm = 2.428e+004统计工具箱函数函数名
描 述nlinfit(非线性回归)
采用Gauss-Newton法进行非线性最小二乘数据拟合 lscov(线性回归)
根据已知协方差矩阵进行最小二乘估计regressregstatsridgerstoolstepwise
多元线性回归
脊回归(?Ridge regress)
多维响应表面可视化(RSV)
交互式逐步回归具体例子请参阅相应文档曲线拟合向导
Genial @ USTC
第3节 加权曲线回归方法当拟合数据包含随机变量时,通常在针对误差有两个主要假设:● 误差只在响应数据中存在,而不在预测数据中存在;● 误差是满足零均值常数方差正态分布的数据变量。第二条假设方差为常数严重影响野点的出现。因为野点原来真实模式数据,他们可能引起真实拟合的潜在错误。为了改善拟合,你可以领用附加的尺度因子(也就是权值)来提高拟合的质量。将野点的权值设置得比较小,因此可以获得较好的拟合。你可以利用下面的三个工具箱来实施加权拟合。a. Curve Fitting Toolbox此工具箱对线性与非线性数据有通用的最小二乘拟合能力。权值是操作数设置中的一部分,你可以通过fitoptions进行设置。在曲线拟合工具箱中,权值可以是与数据相联系的一个权向量。b. Statistics Toolbox统计工具箱中的robustfit 函数具有加权自动回归的能力。robustfit采用robust回归对数据进行拟合,其输出为回归系数。它也可以进行线性加权回归。调用语法结构是: ROBUSTFIT(X,Y,'WFUN',TUNE,'CONST')c. Optimization Toolbox你也可以利用优化工具箱的最小二乘求解器-----LSQNONLIN和LSQCURVEFIT函数实施加权最小二乘拟合。为了利用LSQNONLIN和LSQCURVEFIT实现加权最小二乘拟合,你需要针对你的拟合数据建立起一个方程。你可以在Solution27840中找到相应的例子。附: Solution 27840如何利用优化工具箱的LSQNONLIN函数实现加权最小二乘拟合例子:1. 制造准备拟合的样本数据。在本例子中,数据是叠加了噪声的负指数模型:&& xdata=0:.01:1;&& ydata=exp(-3*xdata)+randn(size(xdata))*.05;2. 在图形中查看数据,即用plot画出xdata与ydata,用蓝色的点表示:&& plot(xdata,ydata,'b.');曲线拟合向导
Genial @ USTC
3. 建立一个函数作为LSQNONLIN的输入,该函数包含你打算拟合的数据的方程。建立名为Mycurve.m的m文件:function err_weithted = mycurv(parameter, real_x,real_y)% 想拟合的方程是: exp(parameter*xdata)% 其中,parameter是未知的% fit = exp(parameter*real_x);fit = exp(parameter*real_x);err = fit -real_y;% 对误差进行加权% 在本例子中,,我们只对最后一项进行加权,并设置其他的项为0(这将%使得例子根据清楚)weight = [zeros(1,length(real_x)-1) 1]; % 误差向量的权重err_weithted = err.*4. 调用优化程序,返回parameter_hat 参数&& parameter_hat = lsqnonlin(@mycurv,3,[],[],[],xdata,ydata)Optimization terminated successfully:First-order optimality less than OPTIONS.TolFun, and nonegative/zero curvature detectedparameter_hat = -11.36parameter_hat 返回利用m文件Mycurv的指定方程的产生值。5. 获取了拟合的方程式,将parameter_hat带入指数方程,并在同一张图上画出。&& fitted = exp(parameter_hat*xdata); hold on&&plot(xdata,fitted,'ro');&&parameter_hat2 = lsqnonlin(@mycurv,3,[],[],[],xdata,ydata) %不加权拟合&&fitted2 = exp(parameter_hat2*xdata);&&plot(xdata,fitted2,'y-');&&legend('待拟合数据','加权拟合结果','直接拟合结果');比较拟合结果可以看出不加权时,曲线从所有数据点的中间穿过去(如黄色的线所示)。加权的时候,拟合曲线只通过最后一个点(因为只有该点权值非0)。曲线拟合向导
Genial @ USTC
第4节:利用Curve Fitting Toolbox改善拟合结果很多因素对曲线拟合造成影响。下面列出各种提示有助于你提高拟合质量:● 模型的选择:或者从MATLAB的模型库、或者用户自定义的模型的选择,是最主要的一个因素,试着用各种不同的模型对你的数据进行拟合比较;● 数据预处理:在拟合前对数据进行预处理也很有用。这包括:▲ 对响应数据进行变换▲ 剔除Infs,NaNs,以及野点更多的细节请查阅Curve Fitting Toolbox的文档。● 合理的拟合应该具有处理出现奇异而使得预测趋于无穷大的时候的能力。
具体细节请查阅Curve Fitting Toolbox的文档● 如果你提供越多的系数的估计信息,你的拟合越容易收敛。下面的提示有利于你加快拟合的速度,提高拟合的精度:▲ 在开始拟合的时候进行一些智能的揣测。如果你认为系数可能是某些值,那么就用那些值作为起始值▲
如果缺少起始值的信息,试着用大量不同的起始值▲
尽量重复训练参数。例如,如果你知道参数必须是正的,那么设置它的下限是0使得循环拟合过程。▲ 调整各种拟合操作数,例如:a. 采用不同的算法b. 增加迭代与函数评价的次数c. 减小容许误差▲ 将数据分解为几个子集,对不同的子集采用不同的曲线拟合● 复杂的问题最好通过进化的方式解决,即一个问题的少量独立变量先解决。低阶问题的解通常通过近似映射作为高阶问题解的起始点。例如,如果你的模型最好被描述为:y = c + a * exp(b*x) +d * sin(f*x)那么它经常最好每次拟合一个项,通常从最重要的项开始。你可以先拟合:
y = c1 + a1 * exp(b1*x)然后利用拟合出的结果系数作为上式中的a,b,c的起始值进行完整的拟合。曲线拟合向导
Genial @ USTC
第5节 : 其他相近方法或许MATLAB 2002年2月的News
Notes 杂志中有关曲线拟合的:Atmospheric Carbon Di-Oxide Modeling and the Curve Fitting Toolbox 或许对你有用。附:一个用fminsearch进行园的拟合的例子:function [xc,yc,r,fval,exitflag,output] = tlscirc(x,y)% TLS circle fitoptions=optimset('TolFun',1e-10);[x0,y0]=circfit(x,y); % center estimate[z,fval,exitflag,output]=fminsearch(@circobj,[x0,y0],options,x,y);[f,r]=circobj(z,x,y); xc=z(1); yc=z(2);function [f,r] = circobj(z,x,y)% TLS circle fit objective f and radius rn=length(x);X=x-z(1); Y=y-z(2); X2=X'*X; Y2=Y'*Y;r=sum(sqrt(X.^2+Y.^2))/n; f=X2+Y2-n*r^2;The circfit function is used above as an initial estimator. Theobjective values of tlscirc and circfit differ by nearly 14% in theexample below.x=[1;2;3;5;7;9]; y=[7;6;7;8;7;5];plot(x,y,'bo'), hold on[xc,yc,r,f]=tlscirc(x,y)% [xc,yc,r,f]=[4.5, 4.6]rectangle('Position', [xc-r,yc-r,2*r,2*r], 'Curvature', [1,1],'EdgeColor','b')[xc,yc,r] = circfit(x,y)X=x- Y=y- f=sum((sqrt(X.^2+Y.^2)-r).^2)% [xc,yc,r,f]=[4.1, 4.3]rectangle('Position', [xc-r,yc-r,2*r,2*r], 'Curvature', [1,1],'EdgeColor','r')hold off, axis equalGenial @ USTCmatlab非线性曲线拟合最近在用matlab做非线性曲线拟合,发现matlab功能确实很强大,其方法有如下几种:一、Matlab非线性拟合工具箱单一变量的曲线逼近Matlab有一个功能强大的曲线拟合工具箱 cftool ,使用方便,能实现多种类型的线性、非线性曲线拟合。 假设我们要拟合的函数形式是y=a+(b-a)*c^2*(c^2-x^2)/((c^2-x^2)^2+(2*d*x)^2);其中a,b,c,d是待定系数。在命令行输入数据:x=8:0.01:12.4;y=real(epsilon);2、启动曲线拟合工具箱》cftool3、进入曲线拟合工具箱界面“Curve Fitting tool”(1)点击“Data”按钮,弹出“Data”窗口;(2)利用X data和Y data的下拉菜单读入数据x,y,可修改数据集名“Data set name”,然后点击“Create data set”按钮,退出“Data”窗口,返回工具箱界面,这时会自动画出数据集的曲线图;(3)点击“Fitting”按钮,弹出“Fitting”窗口;(4)点击“New fit”按钮,可修改拟合项目名称“Fit name”,通过“Data set”下拉菜单选择数据集,然后通过下拉菜单“Type of fit”选择拟合曲线的类型,工具箱提供的拟合类型有:Custom Equations:用户自定义的函数类型Exponential:指数逼近,有2种类型, a*exp(b*x) 、 a*exp(b*x) + c*exp(d*x)
Fourier:傅立叶逼近,有7种类型,基础型是 a0 + a1*cos(x*w) + b1*sin(x*w)
Gaussian:高斯逼近,有8种类型,基础型是 a1*exp(-((x-b1)/c1)^2)Interpolant:插值逼近,有4种类型,linear、nearest neighbor、cubic spline、shape-preserving
Polynomial:多形式逼近,有9种类型,linear ~、quadratic ~、cubic ~、4-9th degree ~
Power:幂逼近,有2种类型,a*x^b 、a*x^b + cRational:有理数逼近,分子、分母共有的类型是linear ~、quadratic ~、cubic ~、4-5th degree ~;此外,分子还包括constant型Smoothing Spline:平滑逼近Sum of Sin Functions:正弦曲线逼近,有8种类型,基础型是 a1*sin(b1*x + c1)
Weibull:只有一种,a*b*x^(b-1)*exp(-a*x^b)选择好所需的拟合曲线类型及其子类型,并进行相关设置:――如果是非自定义的类型,根据实际需要点击“Fit options”按钮,设置拟合算法、修改待估计参数的上下限等参数;――如果选Custom Equations,点击“New”按钮,弹出自定义函数等式窗口,有“Linear Equations线性等式”和“General Equations构造等式”两种标签。在本例中选Custom Equations,点击“New”按钮,选择“General Equations”标签,输入函数类型y=a+(b-a)*c^2*(c^2-x^2)/((c^2-x^2)^2+(2*d*x)^2),设置参数a、b、c、d的上下限,然后点击OK。5)类型设置完成后,点击“Apply”按钮,就可以在Results框中得到拟合结果,如下例:General model:f(x) = a+(b-a)*c^2*(c^2-x^2)/((c^2-x^2)^2+(2*d*x)^2)Coefficients (with 95% confidence bounds):a =
(3.129, 3.181)b =
(2.998, 3.051)c =
(9.572, 9.582)d =
(0.2)Goodness of fit:SSE: 32.94R-square: 0.924Adjusted R-square: 0.9235RMSE: 0.2746拟合曲线如下二、利用nlinfit函数实现,代码如下:x=8:0.01:12.4;x=x;y=real(epsilon);y=y';myfunc=inline('beta(1)+(beta(2)-beta(1))*beta(3)^2*(beta(3)^2-x.^2)./((beta(3)^2-x.^2).^2+(2*beta(4)*x).^2)','beta','x');my_opts = statset('MaxIter',300,'TolFun',1e-12,'TolX',1e-12);beta=nlinfit(x,y,myfunc,[1 1 10 1],my_opts); %调整初值可能导致不同结果,但貌似增加一个options对结果没起什么作用beta(1)beta(2)beta(3)beta(4)%test the modelxx=min(x):0.01:max(x);yy=beta(1)+(beta(2)-beta(1))*beta(3)^2*(beta(3)^2-x.^2)./((beta(3)^2-x.^2).^2+(2*beta(4)*x).^2);plot(x,y,'ro',xx,yy,'b');三、利用nlintool函数实现,代码如下:x=8:0.01:12.4;y=real(epsilon);y=y';myfunc=inline('beta(1)+(beta(2)-beta(1))*beta(3)^2*(beta(3)^2-x.^2)./((beta(3)^2-x.^2).^2+(2*beta(4)*x).^2)','beta','x');nlintool(x,y,myfunc,[1 1 10 1]);上述中y的取值是:y =2.73322.73182.73032.72872.72722.72562.72402.72242.72072.71902.71732.71562.71382.71202.71012.70832.70642.70442.70242.70042.69842.69632.69412.69202.68972.68752.68522.68282.68042.67802.67552.67302.67042.66782.66512.66242.65962.65672.65382.65082.64782.64472.64152.63832.63502.63162.62822.62472.62112.61742.61362.60982.60582.60182.59772.59352.58922.58482.58022.57562.57092.56602.56102.55592.55072.54532.53982.53422.52842.52242.51632.51002.50362.49692.49012.48312.47592.46842.46082.45292.44482.43642.42782.41882.40962.40012.39032.38022.36972.35882.34762.33592.32392.31132.29832.28482.27082.25622.24102.22512.20862.19132.17332.15442.13472.11392.0921
2.01961.99271.96421.93391.90171.86731.83051.79101.74841.70231.65211.59731.53691.46981.39461.30931.2109
1.02041.10231.18721.27511.36611.46031.55801.65931.76441.87361.98742.10592.22962.35912.49492.63762.78822.94743.11653.29693.49033.69893.92554.17384.44864.75665.10695.51225.98806.54167.10437.36137.11606.71306.3525
6.05825.81825.61945.45195.30845.1840
5.07484.97804.89154.81374.74324.67904.62024.56624.51644.47024.42734.38744.35004.31514.28234.25144.22234.19494.16894.14434.1209
4.00273.98603.97003.95463.93993.92583.91233.89933.88673.87473.86303.85183.84103.83063.82063.81083.80143.79243.78363.77513.76683.75893.75123.74373.73643.72943.72253.71593.70943.70323.69713.69123.68553.67993.67443.66913.66403.65903.65413.64943.64473.64023.63583.63163.62743.62333.61943.61553.61173.60803.60453.60103.59753.59423.59093.58783.58473.58163.57873.57583.57293.57023.56753.56483.56233.55973.55733.55493.55253.55023.54803.54583.54373.54163.53953.53753.53553.53363.53183.52993.52813.52643.52473.52303.52143.51983.51823.51673.51523.51373.51233.51093.50953.50823.50693.50563.50443.50323.50203.50083.49973.49863.49753.49643.49543.49443.49343.49253.49153.49063.48973.48893.48803.48723.48643.48563.48483.48413.48343.48273.48203.48133.48073.48003.47943.47883.47833.47773.47723.47663.47613.47563.47513.47473.47423.47383.47343.47303.47263.47223.47193.47153.47123.47093.47063.47033.47003.46973.46953.46923.46903.46883.46863.46843.46823.46803.46793.46773.46763.46743.46733.46723.46713.46703.46703.46693.46693.46683.46683.46683.46673.46673.46673.46683.46683.46683.46693.46693.46703.46703.46713.46723.46733.46743.46753.46763.46773.46793.46803.46823.46833.46853.46873.46893.46913.46933.46953.46973.46993.47013.47033.47063.47083.47113.47143.47163.47193.47223.47253.47283.47313.47343.47373.47403.47443.47473.47503.47543.47573.47613.47653.47683.47723.47763.47803.47843.47883.47923.47963.48003.48043.48093.4813PS:纵观上面三种拟合非线性函数的结果来看都并非理想,曲线变化比较剧烈的地方就表现比较明显了,还有待寻求更好的办法来求得理想曲线。参考:MATLAB在非线性曲线拟合中的应用小结摘要:归纳总结了非线性曲线拟合的方法、求解步骤和上机操作过程关键词:曲线拟合非线性MATLAB正文:1.曲线拟合的基本原理已知一组测定的数据(例如N个点(xi,yi)去求得自变量x和因变量y的一个近似解析表达式y=φ(x)。若记误差δi=φ(xi)-yi,i=1,2,…N,则要使误差的平方和最小,即要求:Q=∑δi=1N2i为最小,这就是常用的最小二乘法原理。2 .MATLAB曲线拟合的相关方法2.1.函数形式:(1)多项式拟合函数polyfit,调用格式为:p=polyfit(x,y,n)其中x,y为参与曲线拟合的实验数据,n为拟合多项式的次数,函数返回值为拟合多项式的系数(按降幂排列)。n=1时,就为线性拟合。例1:给出表1数据,试用最小二乘法求一次和二次拟合多项式。表1
数据 x -1.00 -0.75 -0.50 -0.25 0 0.25 0.50 0.75 1.00y -0.5 0.2 2.5 3.1 4.2836在MATLAB命令窗口中输入:x=-1:0.25:1;y=[-0.5,0.2,2.5,3.1,4.2836]p1=polyfit(x,y,1)p2=polyfit(x,y,2)y1=polyval(p1,x);y2=polyval(p2,x);plot(x,y,'+',x,y1,'r:',x,y2,'k-.')运行结果:1拟合多项式为:y*=2.1和y*=0..01 (2)非线性数据拟合函数lsqcurvefit调用格式为: c=lsqcurvefi(t'fun',x0,xdata,ydata)其中'fun'为拟合函数的M-函数文件名,x0为初始向量,xdata,ydata为参与曲线拟合的实验数据。函数返回值c为非线性函数fun的拟合系数。例2:2004年全国大学生数学建模竞赛C题(酒后驾车)中给出某人在短时间内喝下两瓶啤酒后,间隔一定的时间测量他的血液中酒精含量y(毫克/百毫升),得到数据如表2。表2
酒精含量与饮酒时间的实验数据时间(小时) 0.25 0.5 0.75 1 酒精含量3068 7 3575 8 281.5 22.5 33.5 44.5 54182 82 91077 68 11 12 15 1268 58 13 14 10 751 50 15 16 74时间(小时) 6 酒精含量3825 18通过建立微分方程模型得到短时间内喝酒后血液中 酒精浓度与时间的关系为: y=c1(e?c2t?e?c3t)
(2)根据实验数据,利用非线性拟合函数lsqcurvefit,确定模型(2)式中的参数c1,c2,c3。求解过程为:先编写一个M-函数文件Example2_1: function f=Example2_1(c,tdata)f=c(1)*(exp(-c(2)*tdata)-exp(-c(3)*tdata)); 保存后,在命令窗口中输入: cleartdata=[0.25 0.5 0.75 1 1.5 2 2.5 3 3.5 4 4.5 5 6 7 8 9 10 11 12 13 14 15 16]; ydata=[30 68 75 82 82 77 68 68 58 51 50 41 38 35 28 25 8 15 12 10 7 7 4]; c0=[1 1 1];2for i=1:50;c=lsqcurvefit('Example2_1',c0,tdata,ydata);c0=c;end得到最优解为:c= 117.05,0.6从而得出拟合曲线:y=117.05(e0.1930t?e1.9546t)2.2.图形窗口形式(1)利用多项式拟合的交互图命令(GUI)polytool,调用格式为:polytoo(lx,y)其中x,y分别为实验数据构成的向量,例如利用polytool求解例1的MATLAB命令如下: x=-1:0.25:1y=[-0.5,0.2,2.5,3.1,4.2836];polytool(x,y)打开多项式拟合的交互式界面,由于要拟合的函数为线性函数,因此在多项式拟合交互式界面中的Degree中输入1,点击导出数据Export,出现保存对话框ExporttoWorkspace,选中Parameters(参数),Residuals(残差)后点击OK,在MATLAB的Workspace窗口中可以看到参数为:2.1,即拟合函数为Y*=2.1。同样如果拟合的函数为二次函数,则只要在Degree中输入2,其它步骤相同,可得拟合函数为:Y*=0..1通过查看Residuals(残差)值,可以发现二次函数拟合的残差值比线性函数的要小一些,从拟合的效果看,可以选择二次函数作为拟合函数,但由于线性函数较简单,残差值也很小,从简单出发,也可选择线性函数作为拟合函数。(2)基本拟合界面MATLAB提供了一个方便简洁的拟合界面。具有拟合快速和操作简便的优势,只能拟合多项式。例如用基本拟合界面求解例1的过程如下:x=-1:0.25:1;y=[-0.5,0.2,2.5,3.1,4.2836];plot(x,y,'+');运行结果:3在散点图的图形窗口上分别点击菜单档中的ToolsBasic Fitting,在Plots Fits中分别选中linear、quadratic、Show equations、plot residuals、show norm of residuals,所得拟合直线方程为:y*=2.3x+2;拟合二次多项式为:Y*=0.031x2+2.3x+2(3)曲线拟合工具界面cftool曲线拟合工具界面cftool是一个可视化的图形界面,具有强大的图形拟合功能,下面通过一个具体例子来介绍cftool的用法。例3某生化系学生为研究嘌呤霉素在某项酶促反应中对反应速度与底物浓度之间关系的影响,设计了一个实验,所得的实验数据见表3。根据问题的背景和数据建立一个合适的数学模型,来反映这项酶促反应的速度与底物浓度之间的关系。表3
嘌呤霉素实验中的反应速度与底物浓度数据 底物浓度(ppm)x 0.02反应速度y 0.06 0.11 0.22 0.56 1.10 76 47 97 107 123 139 159 152 191 201 207 200酶促反应的速度y与底物浓度x之间的关系可用下面两个简单模型描述:Michaelis-Menten模型:4y=f(x,β)=β1x+β2
(4) β3+x指数增长模型:y=f(x,β)=β1(1-eβ,x)
(5)使用曲线拟合工具界面cftool来确定模型(4)和(5)中的参数,并比较模型(4)、(5)的拟合效果。在MATLAB命令窗口中输入以下语句:x=[0.02 0.02 0.06 0.06 0.11 0.11 0.22 0.22 0.56 0.56 1.10 1.10];y=[76 47 97 107 123 139 159 152 191 201 207 200];cftool(x,y);在″Curve Fitting Tool″对话框中单击″Fitting″,打开″Fitting″对话框,点击″New fit″,在″Fit Name:″中输入″有理函数″,在″Type of fit″中选中″Rational″,在″Numerator″中选中″linear polynomial″,在″Denominator″中选中″linear polynomial″,然后点击″Apply″,完成有理函数拟合。然后,再次点击″New fit″,在″Fit Name:″中输入″指数函数″,在″Type of fit″中选中″Custom Equation″,点击″New equation″,打开用户自定义方程对话框,点击″General Equation″,在″Equation″中输入″y=a*(1-exp(-b*x))″,点击″Ok″后回到拟合窗口,点击″Apply″,完成指数函数拟合,参数计算结果见表4。表4
模型(4)、(5)计算结果拟合图为:5通过表4可以看出,有理函数(Michaelis-Menten模型)ys=221.7x+3.318x+0.1047拟合剩余标准差较小,R-square较大(越接近1越好),故用有理函数ys=221.7x+3.318x+0.1047拟合数据比用指数函数ys=192.1(1-e-11.38x)拟合的效果好。3结束语利用MATLAB的绘图功能和曲线拟合功能,可以很方便地进行多项式拟合和其它非线性曲线拟合,并可以通过比较剩余标准差和可决系数R2的大小,来对比不同曲线的拟合效果。从而在不知数学模型情况下,也能根据数据的散点图找出较优的曲线来拟合数据。 参考文献:[1]徐萃薇,孙绳武,计算方法引论[M].北京:高等教育出版社,-85.[2]苏金明,张莲花,等.MATLAB工具箱应用[M].北京:电子工业出版社,9-512.[3]姜启源,谢金星,叶俊.数学模型[M].北京:高等教育出版社,8-316.6欢迎您转载分享:
更多精彩:

我要回帖

更多关于 分离变量法 高中数学 的文章

 

随机推荐