数学建模学习总结.docx

上传人:wux****ua 文档编号:10037053 上传时间:2020-04-09 格式:DOCX 页数:33 大小:1.07MB
返回 下载 相关 举报
数学建模学习总结.docx_第1页
第1页 / 共33页
数学建模学习总结.docx_第2页
第2页 / 共33页
数学建模学习总结.docx_第3页
第3页 / 共33页
点击查看更多>>
资源描述
个人在参加数学建模时做到总结,用自己的语言写的,未必准确,但比较好懂吧。还包含一些方法的MATLAB实现。在浏览时推荐按Ctrl+F键,然后在导航窗口中浏览标题,快速转跳。数值和符号计算符号积分R=int(s,v):对符号表达式s中指定的符号变量v计算不定积分.表达式R只是表达式函数s的一个原函数,后面没有带任意常数C.int(s): 对符号表达式s中确定的符号变量计算计算不定积分.int(s,a,b):符号表达式s的定积分,a,b分别为积分的上、下限int(s,x,a,b):符号表达式s关于变量x的定积分,a,b分别为积分的上、下限数值积分1变步长辛普生法数值积分的matlab实现I,n=quad(filename,a,b,tol,trace)Filename:被积函数名,a,b分别是积分上限和积分下限,tol是积分精度,缺省时取trace控制是否展现积分过程,非0时展现,缺省是为0。I为结果,n为函数调用次数。2被积函数由一个表格定义时求定积分用trapz(x,y):梯形积分法,x时表示积分区间的离散化向量,y是与x同维数的向量,表示被积函数,z返回积分值。3,二重定积分的数值求解,I=dblquad(f(x,y),a,b,c,d,tol,trace)表示f(x,y)在a,b*c,d上的二重积分,其他用法与quad相同http:/wenku.baidu.com/link?url=zcJ-sxrj0QDqzz8xCnHTnB7gxjoNRyOZzS4_4ZA22c8Bs9inYn6vVkqTVr_w-riLA_FOkWU47c9u03BlD56wA0BOLRAFPnDA98UAEr1uMI_求导数y=diff(fun),其中fun为被求导的函数例如 y1=diff(1/(exp(x)+x2)-(2*x + exp(x)/(exp(x) + x2)2求n阶偏导y=diff(fun,x,n)使表达式变漂亮,可用pretty(y)变成易于数学习惯的形式微分方程dsolve(微分方程,自变量)如dsolve(D2y+3*Dy+exp(x)=0,x)求微分方程的特解dsolve(微分方程,初始条件,自变量)如 在条件下dsolve(x2-1)*Dy+2*x*y-cos(x)=0,y(0)=1,x)求微分方程组解通解dsolve(微分方程1,微分方程2,自变量)特解dsolve(微分方程1,微分方程2,初始值,自变量)求没有解析解的微分方程(方程组)的数值解这个解法有点难理解,主要是待解函数的写法有点奇怪1.在解n个未知函数的方程时,和x均为n维向量,m文件的待解方程可以x的分量形式写成,m文件中的函数式一个函数组,每个函数的左边都以该函数因变量数组中的一项来表示。2 高阶微分方程组要等价的变成一阶微分方程组,http:/wenku.baidu.com/view/6367a003de80d4d8d15a4f3d.htmlHTTP:/wenku.baidu.com/view/2a3f2aea998fcc22bcd10d18.html符号计算技巧一般在符号计算过程syms x y; 定义符号int diff 符号计算eval 赋值的时候如果有表达式的话,eval可以将表达式当成语句运算,以达到赋值的目的subs 是赋值函数,用数值替代符号变量替换函数,例如: subs(a+b,a,4) 意思就是把a用4替换掉,返回 4+b。也可以替换多个变量。例如:subs(cos(a)+sin(b),a,b,sym(alpha),2)分别用字符alpha替换a和2替换b,返回 cos(alpha)+sin(2)用法很灵活,仔细看帮助,会得到想要的形式的。插值与拟合插值就是要过已知点,拟合不一定要过已知点。一维插值:分段线性插值就是分段,在相邻的两个已知点之间用直线连接,虽然粗糙,但是很实用,工程现场用的很多。拉格朗日插值(Lagrange插值)就是在a,b已知n+1个已知点,过这n+1个点用至多n次的多项式去拟合原函数这就是Lagrange插值。又n次多项式有n+1个未知参数,刚好可以用这n+1个点唯一确定一个n次多项式。(不过个人感觉这是个不好的插值办法,第一计算量太大,第二n的次数一高,震荡太明显了,不符合原来的函数)Newton插值也是用n次多项式去拟合n+1个点,但是原理是用差商的累加来近似原函数的方法,Lagrange插值计算量太大,增加一个节点计算必须重新开始,牛顿法却只用在等式后面加一项就行了。埃尔米特插值(Hermite 插值)当知道已知点的导数,又要求插值函数和原函数在已知点的一阶甚至高阶导数相等时,可以采用埃米尔特插值,往往分段埃米尔特插值的效果会更好。样条线插值工程中以前常用有弹性的金属条(样条)将两点之间连起来,用金属条的位置代替原函数的值。样条线插值就是从这衍生而来的,具有良好的光滑度等优点,现在用k次多项式函数来表示样条函数,当多项式为一次时就是分段线性插值。是这种插值方法分段的,要求整段插值函数要有k-1阶连续导数。但是正因如此,这个函数是不等唯一确定的,要有相应的定解条件(边界处的导数什么的,定解条件MATLAB有默认的还有自己设置的)。yi=interp1(x0,y0,xi,method)x0,y0 原始数据,行向量或者列向量都可以,xi为待拟合的点method可为以下选项nearest 最近项插值linear 分段线性插值spline三次样条线插值(spline会比pchip更光滑一点,同时也会多一点震荡)pchip分段三次埃米尔特插值(也不知道他这里的导数是怎么默认的,好像是两临近点间的斜率)cubic和pchip一样我更喜欢以下的用法pp=interp1(x0,y0,method,pp) (pp为分段多项式插值法)或pp=interp1(x0,y0,method,extrap)(extrap表示外插法)这样返回的是一个结构体,里面储存了插值函数的系数,原值等信息。再通过y=ppval(pp,xi)就能算出任意一点的值。二维插值当已知平面上的一些点,和高程之类的数据时,就可以使用二维插值,这里的方法也很多,matlab中的好想不是很好,分样本是网格型数据的插值和样本是散乱数据的插值。散乱数据插值Matlab中当数据量太大时很容易卡机,样本量多时最好插好后的不要大于2000*2000的网格。统计 ,即有n个样本,每个样本有p个元素组成。这是多元统计的基本模型,在接下来的各种方法中都会用到这种模型1。数据标准化就是将各种数据转化为均值为0,方差为1 的数据,能消除量纲和数量级的影响。就是进行z=的变换。实际应用中多是用样本标准差和样本的均值代替总体的标准差和均值。变化后的数据的协方差矩阵等于原来的相关系数矩阵。但是,标准化不是必须的,在聚类中有时标准化后的指标反而没有标准化前的好,主成分分析中标准化也会使一部分信息丧失,还有神经网络中的标准化也不是必须的。所以不妨两种方法都试试。MATLAB实现:Z,mu,sigma = zscore(X,flag,dim)Z: 变换后的矩阵。mu: 为样本均值,sigma为样本标准差。flag: 为0时用n-1估计标准差(默认),为1时用n估计标准差。dim: (维数dimension)=1时对各一列标准化(默认),为2时对各行标准化。假设检验假设检验个人感觉主要是关于均值是否相等的检验,如果利用数据的统计量,那就是参数检验,否则是非参数检验。主要的东西是要搞清楚什么时候用什么检验方法,以及检验结果的判断。真要用到时可以翻看2。MATLAB实现单样本t检验h,p,ci,stats = ttest(x,mu,alpha,tail,dim); (原假设为x的均值=mu) x 最好写成列向量 alpha:显著性水平 tail可为both left right表示双尾检验还是单侧的默认为both。 dim 一般用不到,都写成列向量h=0时接受原假设,h=1时拒绝原假设。p:H0成立时该事件及更极端样本发生的概率。ci:为样本均值95%的置信区间stats:返回t值,自由度df和样本的标准差。配对样本t检验h=ttest(x,y); 可以进行想x,y的配对样本t检验。如果要进行两独立样本t检验,要用到ttest2函数方差分析单因素方差分析在多个均值的比较过程中,就会用到方差分析。基本思想就是将总变异分解,然后将各部分的变异和随机变异比较,如果相差不大,就说明这部分的变异不明显(没有该部分变异)。而相差大不大就是用F统计量来计算的。假设共有N个数据,分成K组,第i组有ni个数据,下面这条式子中表示全部数据的均值,表示第i组的均值。总变异 = 各因素导致的变异 + 随机变异 总变异 = 组间变异 + 组内变异假如各个因素水平下的个体是没有差异的,那么组间变异和组内变异就不应该相差太多,用于比较这种差距大小的统计量就是F统计量。其中MSB为组间均方,MSw组内均方,K-1和N-K分别为组间均方和组内均方的自由度。算出F后查F分布表就可以得知F在该情况和更极端情况下的概率,从而在相应的显著性水平下检验各组是否有显著性差异。单因素方差分析还有一种写法就是。第i组第j个元素的值 = 第i组的均值 + 第i组与总体均值的差异 + 该元素在该组内的随机误差所以,要检验的就是i=0。多因素方差分析多因素方差分析的基本思想和单因素差不多。就是有时候还要考虑各个因素之间的交互作用。以双因素方差分析为例。则其中表示两个因素的交互作用。要检验的就是,是不是全都为0。spss实现在spss中这些简单的统计分析是非常容易实现的。在均值单因素方差分析但是更多的是在一般线性模型单变量中,这里单因素和多因素。如想两两比较,在两两比较里一般选LSD或者S-N-K就行更高级的其他详见3但是方差分析是有适用条件的,要求1样本是独立的(最重要也一般会满足)2残差是正态的3各组的方差是齐次的。也很重要,所以要在选项方差齐次性检验如果以上条件很不满足,只能非参数方法可能会更好。至于多元方差分析等更复杂的情况,水平有限,感觉我也用不到。回归分析与曲线拟合多元线性回归一般我们用的都是多元线性回归,本来有着专业的统计学理论。但我只做基础的应用,就简单点吧。 估计一般用的是最小二乘法来估计参数的值,但是在估计出的值后要进行假设检验,检验是否为0,因为要是本来是0,而是因为抽样误差才使估计出来的不为0,那这样这个模型就错了,为0 时模型是没有统计学意义的。在MATLAB中给出的统计量是F统计量,就是方差分析中的那个F,H0为全为0,所以要拒绝原假设才行。不过MATLAB不能给出每一个是否为0的检验,这个需要t检验,在SPSS中给出来比较方便。还有决定系数R2,这个和相关系数有点关系,约接近1越好。MATLAB语句b,bint,r,rint,stats = regress(y,X,alpha)y: 是对应的列向量X: 是每一列对应一个变量的矩阵,alpha:可以自定义置信度,默认0.05. b: 返回的是的估计值,bint: 是的置信区间,r: 残差y-。rint: r的置信区间,可用rcoplot(r,rint);画出残差图。stats:返回四个统计量,R2,F值,F对应的P值,还有s2剩余平方差(残差的方差)。非线性回归(非线性函数拟合)回归分析一般是线性的,多元的时候用,当函数关系时非线性时,而且最好是一元的(这样拟合结果可以画出来,方便观察,当然nlinfit也可以多元非线性回归,只是这时不能用nlintool给出交互式画面了),这时候用到非线性回归。MATLAB中可以联合以下几个函数一起实现。nlinfit (非线性回归),inline (可以在不另写M文件情况下定义想要拟合的函数式),nlparci (给出参数的置信区间),nlintool (给出交互式画面)例子如下%数学模型那本书的酶促反应那题的指数型拟合。clear clcy=76,47,97,107,123,139,159,152,191,201,207,200;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;plot(x,y,o);hold on%定义非线性函数fun=inline(b(1)-b(2)*exp(-b(3)*x),b,x); %b为参数,x为自变量b=190,190,12; %给出参数的初值。%非线性回归beta,r,J=nlinfit(x,y,fun,b);%给出beta的置信区间betaci=nlparci(beta,r,J,0.05);beta,betaci%将拟合值与原始值比较yy=beta(1)-beta(2)*exp(-beta(3)*x);plot(x,yy,*)%给出交互式画面,其中可以输出剩余标准差,置信区间等nlintool(x,y,fun,beta)另外还有曲线拟合工具箱中lsqnonlin函数和lsqcurvefit函数可以曲线拟合,只是和nlinfit不同,但应该效果和nlinfit(牛顿法)差不多,重要的是nlinfit可以给出置信区间等更多的统计量和更多的配套函数(交互式画面),所以我还是都用nlinfit好了。Logistic回归这里我还只学了当因变量为二分类变量时的Logistic回归,当因变量为多分类变量时的Logistic回归参看3。因为当因变量为二分类时,实际上是拟合在各种自变量条件下因变量为1发生的概率,若用普通线性模型拟合会出现概率大于1或小于0的情况,而且一般概率和因变量都不是线性关系,而是S型比较多,所以进行了logist变换(变换后使最后的结果保持在01之间,且使回归的系数有了一点实际意义,有点像估计在不同自变量下的概率密度函数)。还有一点使Logistic回归与普通线性回归不同的是,普通线性回归采用最小二乘法估计回归系数,Logistic回归多采用极大似然法估计回归系数(这也使得它们对回归系数的检验有所不同)。记结果发生的概率为P,则logist变换如下:这就将曲线曲线直线化,然后以logit(p)为因变量,建立Logistic回归模型如下: 然后逆推可以得到: 当样本量很大,各个自变量水平分好组,各水平概率可以算出来时,可以直接将和各个x进行普通的最小二乘回归,但是因为每组的样本数量不同,这样会造成异方差性。所以用 当做权重做加权最小二乘1。当样本量不大时,就用极大似然法来估计,但一般情况下两种都可以用极大似然法估计。注意事项:当采用极大似然法用估计参数时,就不能用传统的t检验f检验和R来判断一个回归的好坏。因为原来的P是未知的,就无从来R之类的检验。可以根据似然值L的大小来判断拟合的好坏,完全拟合时L=1;SPSS会根据L的值算出一个伪相关系数(往往没有线性回归那么大)。检验各个系数是否有统计意义用的是Wald统计量,越大越好。用加权最小二乘估计的好处是可以直观的看出拟合的好不好,但样本量需要较大,达到可以算出p值的程度,极大似然法的优点是样本量不需要很大,缺点是拟合的好不好的检验不如前者直观。聚类分析通过计算样本间数字指标上的距离推测各样本间的类别关系。按对象分为Q型和R型聚类,前者对样本聚类(所以计算的是各个样本间变量之间的距离),可以发现那些样本更接近。后者对指标聚类(所以距离的计算和指标间的相关系数有关),可以发现那些指标反应的信息是类似的,可以考虑合并指标什么的。一般都用欧式距离就行,但是为了消除单位和数量级的影响,一般先对数据标准化(Z得分)。但据说因为聚类时因为总体分布未知,所以用样本的方差和均值计算马氏距离效果不好,所以大部分还是用标准化后的欧式距离1。组间的距离一般有:最小距离:容易让类与类间聚合,事空间浓缩,形成一个比较大的类。最大距离:易让类与类分离,有时使支流淹没主流。重心距离:物理上看合理,但有人说信息利用率不高。类平均法:分以下两种,一般认为该法比较好。1组内平均 2组间平均离差平方和法:本来挺好,但计算量太大,一般只能得到局部最优。按方法分为以下种类:1系统聚类:可清晰地反映类间关系,画出聚类图,但样本很大时聚类图根本画不出,故转向K均值聚类。2. K均值聚类:可以指定分类的种数,适合大样本的聚类,但不能反映种内种间关系。3. 模糊聚类:算出该样本属于每一类的隶属度,样本最有可能属于隶属度最大的那一类。4. 有序样本的聚类:最优分割。原理易懂,用spss很容易实现。但是很多时候聚类的结果要是能直接用在MATLAB的下一步变成中调用会更方便,所以还要学会用MATLAB聚类详见。要想比较自由的选择聚类的各种方法,要联合使用以下几个函数。聚类分析时每一行是一个个案,每一列是一个变量。系统聚类x=zscore(X); 防止量纲差距太大先数据标准化Y=pdist(x,metric); 计算metric中指定的方法计算出的距离矩阵,默认为eudlidean欧氏距离。euclidean 欧氏距离(缺省)seuclidean 标准欧氏距离mahalanobis 马氏距离(Mahalanobis距离)cityblock 绝对值距离minkowski 闵氏距离(Minkowski距离)Z=linkage(Y,method);使用method指定的方法创建有层次结构的聚类树,默认为single最短距离还有average 无权平均距离centroid 重心距离complete 最大距离single 最短距离(默认) T=cluster(Z,cutoff,c,depth,d)返回所属于的类,cutoff大于等于2时表示分几类,其他的看不懂。H=dendrogram(Z,P);画出聚类谱系图,P表示最大节点数,默认为30。H为返回的图形句柄。K均值聚类主要用法如下IDX,C=kmeans(X,k)将x分为k类,返回的idx为每个点的类标号。C为每个类的中心。. = kmeans(.,param1,val1,param2,val2,.)用更多参数去调整k均值聚类,param和value如下 ParamValue含义distancesqEuclidean标准欧氏距离(默认)citybolck绝对值距离correlation相关系数options中的displayoff不展示过程iter展示迭代过程final展示最终结果replicates一个数字n或一组初值矩阵能尝试不同的初值,并返回最好的聚类startk*p的矩阵初始聚类中心如idx4,cent4,sumdist = kmeans(X,4,dist,city,display,final,replicates,5);模糊聚类center,U,obj_fcn=fcm(data,cluster_n)cluster_n表示分几类聚类结果的判定在层次聚类中cophenet(Z,Y) 度量这种分类的失真程度,即由分类所确定的结构与数据间的拟合程度。 越接近1越好。任何聚类(尤其k均值聚类)中s,h=silhouette(X,clust)s轮廓值,在-1,1之间,越大越好,小于0时聚类可能有错。X为原始的数据,clust为他所属于的类,画出轮廓图,判断该聚类的好坏。可通过轮廓图判断,还能用mean(s)看平均轮廓值的大小。下图就是一个聚类很好的轮廓图。判别分析 这里只能先写一点我的体会,可能有点混乱和错误,但是好用。判别分析主要分四种方法。距离判别:最简单好理解的判别,已知多个不同总体的数据,可计算各总体的重心坐标(均值),对待判的个体,分别计算该个体到原来各总体重心的马氏距离(也不一定是马氏距离,但这种距离最常用最合理),离哪个总体的距离近该个体就属于那个总体。因为马氏距离的计算要用到各总体的协方差矩阵,协方差矩阵相同还是不同的计算方法不一样,前者简单后者难。所以判别前要先检验协方差矩阵是否相同。Fisher判别:思想是投影,将R维空间的自变量组合投影到维度较低的D维空间去,在D维空间进行分类,投影的原则是使每一类内的离差尽量小,不同类的离差尽量大。这和主成分分析和典型相关性分析有点关系,所以Fisher判别又叫典则判别。一般转化到23维就可以了,剩下的能提供的信息非常少,这也是为什么SPSS可以将多维变量的判别结果画在一张二维的图上。(有时转化到一维就行了,这时spss不画图,过不知道三维它画不画图)图 1将二维的X坐标转化为一维的Y坐标而且用它建立好的判别函数形式简洁,且对分布方差没有什么限制,应用十分广泛。(SPSS默认就是用这种方式输出结果的)。Bayes判别:对原来各种总体有一定的了解,认为P个类别是空间中互斥的子集,满足一定的先验概率,然后按一定准则计算待判的个体i分别属于这P个类别的概率,则i属于概率最大的那个类别。当总体协方差相同时,判别函数是一次函数,当总体协方差不相等时判别函数是二次的,(虽然不知道SPSS中为什么当协方差不同时,判别函数也是一次的)。强项是可以进行很多类的判别,缺点是对总体要求满足多元正态分布。(往往不满足,但是近似或是结果挺好也可用)。逐步判别:当自变量很多,又不知道哪个自变量对判别结果有作用时可用(一个一个变量加)。用SPSS很好实现。判别函数效果的检验:1.回判,2.外部数据验证,3.交互验证(又叫cross validation,leave one data out,是常用的方法),4.bootstrap法SPSS实现4分析分类判别注意:如果要输出Bayes判别结果,在统计量中勾选Fisher,(因为Bayes判别是Fisher提出来的),勾选后只是多一个“Fisher 的线性判别式函数的表格”,从中算出判别函数,值越大数模落入该组概率越大。当采用整体协方差相同的Bayes判别时,bayes判别函数和MATLAB中的linear给出的相同(只不过一个SPSS是相互比,matlab是和0比,相加减后系数是一样的)。但是当采用整体协方差不同时的Bayes判别时,SPSS不能交互验证,而且判别式居然还是一次函数,感觉还是MATLAB的整体协方差不同时的Bayes判别靠谱点。另外一般要勾选统计量未标准化,这样可以输出未标准化的系数,用这个系数算出来的是Fisher判别降维后的坐标,再算坐标与各另一个表格给出的重心的距离就知道属于哪一类了。SPSS还是Fisher判别最方便可靠如果要逐步判别,勾选使用进步方法如果要交互检验分类中勾选不考虑该个案的分类具体看4Matlab实现Matlab里的classify判别函数用来Bayes判别最方便,虽然还有NaiveBayes.fit来创建更高级的Bayes判别(太复杂,暂时看不懂),但我用classify足够了。语法: class,err,POSTERIOR,logp,coeff = classify(sample,training,group,type,prior) sample: 要判别的样本每一行是一个个案,每一列是一个变量。training:用来训练的样本每一行是一个个案,每一列是一个变量。group: 每个样本对应的组别,可以是数字,字符串组成的元胞等。type: 指定分类方法,我认为我的探索比一般资料都有说服力,以下除mahalanobis外用的都是bayes判别方法,我已经从多方面验证过,除了前面带diag的还是不太理解什么意思。linear: 采用总体服从多元正态分布,组间的协方差相同的Bayes判别(默认)。 diaglinear:和linear类似,但用对角协方差阵估计。quadratic :总体服从多元正态分布,组间的协方差不相同的Bayes判别,所以是判别函数是二次的。diagquadratic:和quadratic类似,但用对角协方差阵估计。mahalanobis:组间协方差不同的马氏距离判别。(matlab没有组间协方差阵相同的距离判别),而且用该方法时不计算POSTERIOR,logp和coeff。prior:用来给出先验概率,缺省时认为先验概率相等,用输入empirical表示用各组的比值确定先验概率,其他的用法不常见就不说了。class:给出对sample的分类结果。POSTERIOR:给出后验概率Logp:看不懂,反正我用不到。coeff:返回一个结构体,里面包含了判别函数的系数信息,包括一次项的系数,二次项的系数(如果选quadratic的话)。对与第i行第j列的函数K,将所判别的对象s带入K,如果K0则说明s属于第i类而不属于第j类。判别函数的具体计算方法见5,已验证过MATLAB给出的系数和该方法得出的一致。主成分分析作用:当每一个样本对应很多元素(p很大)时,并且各个元素间可能有相关性,这样数据的维数太高不利于后续的计算。通过对原元素进行线性组合来构造新变量。 ,得到的新元素之间互不相关,且往往取前几个Y就能提取原来总体的大部分信息。计算过程为计算X的协方差矩阵或相关系数矩阵 的所有特征值和其对应的特征向量(特征向量本来是有无穷多个的,这里求的是单位正交特征向量,即每个向量的模为1,且两两之间线性无关),并将它们按从大到小排列,则排序后的就是,提取前i个主成分对原始信息的保留量为 一般信息保留量在85%以上就行,看情况。实质上主成分分析就是向量空间的转变。将原来的向量空间转化到另一个坐标空间。其实就是新的向量空间的基的方向上的单位向量。要记得一个向量乘一个单位向量就等于在方向的投影。所以得到的Y就是X在主成分坐标轴上的坐标值。注意:1当原始数据的量纲或数量级相差很大时,一定要对原始数据先标准化。但相差不大时还是不标准化好点,因为标准化本来就会损失一部分信息。2主成分分析不要求数据来自正态总体。3主成分分析容易让人认为可以去掉重叠的信息(重叠与相关有点联系又有区别),其实不然,它只是将本来相关的变量以不相关且维数更少的的形式表达出来,如果原来存在重复的信息,那么在主成分的结果中对重复部分有更大的比重。造成结果有偏差,所以在选择初始变量要谨慎,选合适且真实反映事物本来面目的变量。1特点:1.每一主成分的方差就是他对应的特征向量的值。2.每一主成分的均值是0。(在MATLAB的精度下是10的负12次方,理论上应为0。)MATLAB实现:MATLAB直接用样本实现主成分分析用有多种方式,但是mathwork公司推荐(1)式,因为princomp在使用时调用的是pca,两者的计算结果一样,而且pca多一项explain,更强大。coeff,score,latent,tsquared,explained = pca(X) (1)COEFF,SCORE,latent,tsquare = princomp(X) (2)解释:X: 就是原始数据,每列是一个变量,每行是一个个案,很方便的。coeff: 就是那个Upp转化矩阵score: 最后得出的主成分的值,每一列表示一个主成分(按第一主成分到第n主成分个排列)。latant:是各主成分对应的特征向量。tsquare:是Hotellings T-squared统计量,我这个水平可以不理他。explained:是只每一个主成分解释了百分之多少的方差,是一个列向量。注意: 当用的是原始数据时,默认情况下scoreX*coeff,而是score=(X-mean(X)*coeff,因为以上两个函数都默认将数据中心化(就是将X-mean(X)后再主成分,相当于将得到的主成分空间的坐标原点平移到样本数据的中心点,如果不想这么做,可以直接用X*coeff,就得到以原始数据原点为原点的主成分)。而用标准化后的数据就不会出现这样的情况,因为此时均值为0。总结:刚学主成分分析时总是觉得要用原始数据做主成分,而且认为最重要的项为score,想拿主成分做判别分析,聚类,回归什么的,最后还要回到原始数据。但当我后来看了6之后,才恍然大悟认识到主成分分析的基变换实质,回想起线性代数中的知识来,顿感数学的美好。后来我觉得,主成分应该用来分析事物之间的关系挺好的,不一定用来判别什么的。还有MATLAB中有个biplot函数用在主成分分析之后挺好的,从蓝线(代表原始特征)的长度和在角度可以看出其对各个主成分的贡献,还可以看出各个样本(重构后)在各个主成分上的重要程度什么的。SPSS实现:分析降维因子分析抽取里面可以选择用协方差矩阵还是相关系数矩阵,输出碎石图,选择几个主成分等。唯一的缺点是SPSS既不能输出主成分的值,也不能输出MATLAB中的coeff也不能输出score,要自己算。所以我基本拿SPSS分析结果,但输出还是MATLAB方便。SPSS结果中的成分矩阵中会给出一些系数,这其实表示各主成分和相应的X的相关系数,可以反映该主成分主要表现了哪几个X,意义是什么。 就是coeff系数矩阵中的系数。将SPSS输出的因子得分乘就是主成分得分。而将MATLAB得出的各主成分得分标准化,或是除就是SPSS给出的因子得分。这些都是拿相关阵分析时才成立的,用协方差阵时两者之间的关系比较复杂。因子分析其实因子分析就是主成分分析的拓展,为了解决主成分分析中主成分的意义不明确而发展的一种统计方法。他可以通过正交旋转,从而使每个因子更具实际的意义。有很多种方法可以来因子分析,但最主要的还是主成分法。用主成分法做因子分析原理如下 这是主成分与原始变量之间的关系 因为特征向量彼此正交,故能反过来由Y表示X,X=score*coeff。其实就是将数据从主成分空间恢复到原来的向量空间。 只提取前m个主成分,其余的归入算作随机误差。又为了将Yi的方差变为1,故令,则上式变为:这样,就把X用几个主要的F(因子)表示,且可以证明 就是相应的F与相应的X之间的相关系数。相关系数越大,说明,这个因子就能越好的表示该个变量的信息。为了使各个因子具有意义,所以当各个因子的意义不明显时还要进行因子的旋转。当采用正交旋转后,旋转后的各因子还是线型无关,但会使个相关系数向0和1靠拢,从而使各个因子的意义更明显。当正交旋转后的因子还是没有明显的意义时,可考虑斜交旋转,这样可能能让各因子具有更好的意义,但会使因子间具有一定相关性。最后可以通过各个F值和F的总综合评分来看看每个各干在哪一方面得分高就在那一方面有优势,还可以用总得分判断总优势。用SPSS实现因子分析是非常方便的。但个人认为综合评分还是主成分方便,而因子分析的主要优势是能表现出各因子有什么意义。 典型相关性分析主要是用来研究两组变量之间的相关性,是多对多的相关性研究。通过线性变换,将两组第一典型变量间相关性最大,且每组内的各典型相关变量无相关性。用SPSS比较方便,且结果直观。SPSS实现INCLUDE E:Downloadsspss20.0SamplesSimplified ChineseCanonical correlation.sps.Cancorr SET1= x1 x2 x3 x4 x5 x6 /SET2= y1 y2 y3 y4 . SET1改成要所要的第一组变量, SET2改成所要的第二组变量注意空格和句号还有目录.SPSS会输出标准化和未标准化后的系数矩阵,分析典型变量的关系时主要看标准化后的,这样关系更明显。如果事先对数据标准化,那么输出时的标准化和未标准化的系数矩阵是一样的。一般输出主要看标准化后的。(Standardized Canonical Coefficients)。还有要注意看前几个典型变量有统计意义(Test that remaining correlations are zero),还有典型变量之间的相关系数(Canonical Correlations),具体见3, 4MATLAB实现A,B,r,U,V,stats = canoncorr(X,Y)X,Y: 分别为要进行分析的两组变量,每一列是一个变量,每一行是一个个案,且X,Y的行数要相等,列数不一定。A: 将X转化为典型变量的系数矩阵(未标准化)。如果要得到标准化的系数,可以先将X标准化,标准化后X,Y后U,V和未标准化是是一样的(因为MATLAB在用未标准化的系数算出U,V后还是会先标准化再输出的)B: 将Y转化为典型变量的系数矩阵(未标准化)。r: 各级典型变量间的相关系数。U,V: 各级典型变量。stats:各种检验统计量,不再说明了。时间序列预测一般单列的时间序列预测可归结为已知求。 时间序列分析是一个非常麻烦的事情,理论特别的复杂,但是解决的问题看起来又不是那么厉害,有一点看趋势瞎猜的感觉。本来不打算看的,但是为了知识的完整性还是简略地看了一下。时间序列是一种现在的因变量受到前几个时刻的因变脸和自变量影响的序列 。在虽然看起来不厉害,但在现实生活中应用还是很多的,而且用SPSS实现很容易。主要介绍下面四种方法。移动平均法移动平均就是用前N个数的平均值表示当前变量的预测值。 但是如果序列不是平稳的(有变化的趋势),那么可以用2次移动平均法(在一次移动平均的基础上再做一次移动平均),或是先对原来的数列取差分达到消除趋势的目的。然后对差分移动平均预测,最后将预测的差分加上原来的最后一个数据,就还原为预测值。方法简单,但效果不好N的选择有主观性,往往多试几个看哪个效果好看标准误大小。但是越早的序列对当前序列的影响应该是越小的,采用取平均值的方法太粗糙,效果不好。改进方法:加权移动平均/指数平滑法。指数平滑法基于越近的数列对当前要预测的数列的影响应该越大,所以将移动平均的权值按数列的先后顺序指数递减。该法一般要确定指数和初值,不过在SPSS中这些就都交给软件来确定吧,它会通过迭代找出相对较好的初值。如下为一次指数平滑。 显然=1;但是序列是没有无穷项的,所以还要确定初值。指数平滑也是适用于平稳的时间序列,对于有趋势的序列要做二次指数平滑,甚至更高次,也可以先取差分再平滑。ARIMA模型ARIMA法的分类和含义如下AR (Auto Regressive Model) 自回归模型AR(p)表示p阶自回归模型,就是用过去p个时刻的y值做线性回归,预测下一个值。(该模型假设是均值为0,且是平稳的序列,简单理解就是趋势平稳) 其中重要的是 要是均值为0,方差为 的白噪声,不能有自相关的现象。不然的话这个模型需要改进。如果引进后移算子 多项式算子 则以上模型可以写作 MA (Moving Average Model) 滑动平均模型MA(q) 表示q阶滑动平均模型,就是用过去q个时刻的误差做线性回归,预测下一个值。(该模型假设是均值为0,且是平稳的序列,简单理解就是趋势平稳) 这里用减号是为了能用上面的算子统一表示。 是均值为0,方差为 的白噪声,该模型用在误差的线性叠加上比较好。用和上面相似的算子,该模型可以表示为 ARMA (Auto Regressive Moving Average Model)自回归滑动平均模型ARMA(p,q) 表示p阶自回归,q阶滑动平均模型,就是上面两个模型的组合。特别是当MA模型中的残差项不是白噪声时,就将两个模型结合起来,用MA去表示AR中有自相关的残差项。即用上述的算子表示就是 假如序列的均值不为0,为,那么该模型就要改写为但当序列不是平稳的,而又趋势,那么就要先对序列取差分再运用该模型,就有了下面的模型ARIMA。ARIMA (Auto Regressive Integrated Moving Average Model)综合自回归-滑动平均模型ARIMA(p,d,q) 表示p阶自回归,d阶差分,q阶滑动平均模型。原理和上面的一样,就是该序列有趋势,不平稳,于是先取d阶差分,再用上面的模型。用完了再用差分求回原来的值。1阶差分 2阶差分 记d阶差分算子 且记 若有 是满足的ARMA(p,q)序列,则称是满足的ARIMA(p,d,q)序列。ARIMA(p,d,q)(P,D,Q) 表示 p阶自回归,d阶差分,q阶滑动平均,加上季节的P阶自回归,D阶差分,Q解滑动平均模型。当时间序列不仅有趋势变化,而且有季节性的波动时,那么就要加上季节性的差分以滤去季节性(周期性)的波动。对于周期为s的序列,一次“季节差分”(这样叫不准确,但方便起见就这样叫)如下:D次季节差分为 有季节性的ARIMA模型可描述为 (1)其中 不必是白噪声,可设它是另一个ARIMA(p,d,q)序列 (2)将(2)式带入(1)式可得令,得这就是乘积型季节模型,阶数常用 表示。模型的定阶和检验等在确定d的阶数时,可以对yt或Wt计算自相关系数和偏相关系数,如果没有出现截尾或者拖尾(随着相关系数阶数的升高,相关系数下降很快)。则可以说明还目前还不是ARMA序列,要继续取差分。但每差分一次就会减少一个数据,损失一些信息,一般不能差分太高。在取差分时,先取季节性差分和先取普通差分的最后得出的结果是一样的。所以不用纠结先后。先画出时序图,如果波动情况不是平稳的,而是越来越大或是越来越小(方差不齐次),要先采用对数变化或平方差变化时方差齐次,预测后再恢复。确定p,q这两个参数时,有一种方法是根据自相关和偏相关的图的截尾和拖尾的一个表格4资料。还有一一种方法是计算AIC,BIC准则,用于表示模型的拟合优度。AIC和BIC这两个值越小,表示对模型拟合地越好。在MATLAB中是计算一定范围内的所有p,q值,然后选出AIC,BIC值最小的。但这要自己编程。AIC=-2 ln(L) + 2 k 中文名字:赤池信息量 akaike information criterionBIC=-2 ln(L) +ln(n)*k 中文名字:贝叶斯信息量 bayesian information criterionK是未知参数的数量,L是似然函数,n为观察数还有结果残差是否还存在自相关这是需要检验的。这时需要统计模型的LjungBox Q统计量,这是一种 检验,Q表示的是滞后数。原假设H0是对于所有,都有 ,即残差不存在Q阶以下的自相关。sig0.05表示原假设成立,残差不存在自相关。对于D的选择,一般就是1阶,可是P和Q的选择实在是不知道该怎么办。一切都交给SPSS中的专家建模器吧。它会自动选择最佳的阶数的。还直接给出参数估计和预测值还有各种统计量。值得注意的是SPSS专家建模器还能处理有自变量输入的时间序列预测。但是预测期内的自变量不能有缺省值。有自变量的模型是怎么写的我就不太清楚了。还有专家建模器的自回归甚至能只回归2阶不回归1阶来选出最佳的组合,这是人工完全无法比的。最后的模型好不好主要看,1. 拟合优度:BIC小不小,R2是否接近1,残差小不小,曲线图接不接近。2. 残差是否存在自相关:LjungBox Q通不通过,自相关和偏相关图是否在置信区间内。神经网络预测以上都适合于线性系统的预测,对于非线性系统,就可以用神经网络预测(当然,首先用SPSS预测一下,如果效果不好才用非线性系统)。不过,本来MATLAB自带的GUI就可以做神经网络预测,但是我发现那个的具体设置太麻烦,很多模棱两可的参数,还有我到现在还搞不清楚他到底是怎么多步预测的,一怒之下就自己编写神经网络预测吧,神经网络通用函数与BP网络Matlab 自带的神经网络gui工具效果是挺好的,虽然对于特定的一些问题还是特定的函数效果好。如非线性函数拟合,特别是高维的还是RBF网络厉害,而且运用相对简单,是在编不出代码来可以用nntool建好网络再保存网络。虽然这样没用代码,但是这样可以用网络。用时y=sim(net,x)Newff现在有新用法net,tr = train(net,simplefitInputs,simplefitTargets);不过好像newff过时了。plotperform(tr);可以画误差plotconfusion(targets,outputs)画混淆矩阵特别好用。patternnet函数式模式识别的比较好的工具,他默认采用trainlm训练函数(Levenberg-Marquardt训练法)以下是他的默认设置,如果想改,只要比如net.trainParam.max_fail=10;就行了,不过一般不用改,因为都挺好的,特别是max_fail默认是连续下将6次就结束,后来我发现其实该多到甚至50次,模型结果并没有明显的变化。% show 25 Epochs between displays% showCommandLine 0 generate command line output% showWindow 1 show training GUI% epochs 100 Maximum number of epochs to train% goal 0 Performance goal% max_fail 5 Maximum validation failures% min_grad 1e-10 Minimum performance gradient% mu 0.001 Initial Mu% mu_dec 0.1 Mu decrease factor% mu_inc 10 Mu increase factor% mu_max 1e10 Maximum Mu% time inf Maximum time to train in seconds这些是trainlm训练方法中的默认值,还有一般能用gui解决的问题如果效果不好,一般这种方法的效果往往就不好。除非在大方面改进,小方面的改进效果不明显。查看网络参数方法:设有n1个输入层(一般我用的bp什么的网络就只有一个输入层),n2个其他层(中间层输入+输出层)。输入net.iw或net.lw 或net.bnet.lw是一个n2*n2的元胞,包含其他层的权重,第i行第j列的元胞就包括了第j层到第i层的权重。net.iw是一个n2*n1的元胞,包含输入层的权重,第i行第j列就包含了第j个输入层到第i个隐藏层的权重。 net.b是一个n2*1的元胞,包含网络的常数项,第i个元胞就包含了第j层的阈值(常数项)。只要记住这里的是列优先,和其他有点两样就行了。具体可以输入net来查看。RBF网络RBF网络的训练格式:net = newrb(P,T,goal,spread,MN,DF)p 自变量T 目标变量goa 训练的误差目标默认为0,达不到目标每训练一次就会增加一个神经元。spread 网络的平滑度,默认为1,越大越平滑。MN 最大允许的神经个数,默认为样本数Q。DF 每个多少次显示一次误差,默认每隔25次显示一次net = newrbe(P,T,spread)产生一个严格的径向基网络,径向基函数的个数=输入样本数,少了增加函数的过程,所以他很快。自组织竞争网络一种无导师的学习网络,只让输出函数中值最大的神经元激活(为1,其他为0),只调整和激活神经元相连接的权重,并通过一定学习法(内心)则让调整后的权重在遇到相似输入时更有利于该神经元的激活,并且通过学习会使通向该神经元的权值接近这一类的聚类中心。通过反复的循环,最后当一类相似的数据输入时就只有一个神经元激活,被激活的神经元就代表该输入所属于的类。使用也很简单,老版用newc(现在帮助文档里也找不到了),新版
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 管理文书 > 工作总结


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!