当前位置:文档之家› 数学建模学习总结

数学建模学习总结

个人在参加数学建模时做到总结,用自己的语言写的,未必准确,但比较好懂吧。还包含一些方法的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)

10 trace控Filename:被积函数名,a,b分别是积分上限和积分下限,tol是积分精度,缺省时取6

制是否展现积分过程,非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相同

https://www.doczj.com/doc/281393878.html,/link?url=zcJ-sxrj0QDqzz8xCnHTnB7gxjoNRyOZzS4_4ZA22c8Bs9inYn6v VkqTVr_w-riLA_FOkWU47c9u03BlD56wA0BOLRAFPnDA98UAEr1uMI_

求导数

y=diff(fun),

其中fun为被求导的函数

例如

>> y1=diff(1/(exp(x)+x^2))

-(2*x + exp(x))/(exp(x) + x^2)^2 求n 阶偏导 y=diff(fun,x,n)

使表达式变漂亮,可用pretty(y)变成易于数学习惯的形式

微分方程

dsolve(‘微分方程’,’自变量’) 如0'3''=++x e y y

dsolve(‘D2y+3*Dy+exp(x)=0’,’x ’) 求微分方程的特解

dsolve(‘微分方程’,’初始条件’,’自变量’)

如0cos 2)1(2=-+-x xy dx

dy

x 在1|0==x y 条件下

dsolve(‘(x^2-1)*Dy+2*x*y-cos(x)=0’,’y(0)=1’,’x ’) 求微分方程组解

通解dsolve(‘微分方程1,微分方程2’,’自变量’)

特解dsolve(‘微分方程1,微分方程2’,’初始值’,’自变量’)

求没有解析解的微分方程(方程组)的数值解

这个解法有点难理解,主要是待解函数的写法有点奇怪

1.在解n 个未知函数的方程时,0x 和x 均为n 维向量,m 文件的待解方程可以x 的分量形式写成,m 文件中的函数式一个函数组,每个函数的左边都以该函数因变量数组中的一项来表示。

2 高阶微分方程组要等价的变成一阶微分方程组,

https://www.doczj.com/doc/281393878.html,/view/6367a003de80d4d8d15a4f3d.html

https://www.doczj.com/doc/281393878.html,/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的网格。

统计

1111p n np x x X x x ??

?

=

? ???

总体 ,即有n 个样本,每个样本有p 个元素组成。这是多元统计的基本模型,在接下来的各种方法中都会用到这种模型[1]。

数据标准化

就是将各种数据转化为均值为0,方差为 1 的数据,能消除量纲和数量级的影响。就是进行z=i x u σ

-的变换。实际应用中多是用样本标准差和样本的均值代替总体的标准差和均值。变化

后的数据的协方差矩阵等于原来的相关系数矩阵。但是,标准化不是必须的,在聚类中有时标准化后的指标反而没有标准化前的好,主成分分析中标准化也会使一部分信息丧失,还有神经网络中的标准化也不是必须的。所以不妨两种方法都试试。

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 :H 0成立时该事件及更极端样本发生的概率。 ci :为样本均值95%的置信区间

stats :返回t 值,自由度df 和样本的标准差。

配对样本t 检验

h=ttest(x,y); 可以进行想x ,y 的配对样本t 检验。

如果要进行两独立样本t 检验,要用到ttest2函数

方差分析

单因素方差分析

在多个均值的比较过程中,就会用到方差分析。基本思想就是将总变异分解,然后将各部分的变异和随机变异比较,如果相差不大,就说明这部分的变异不明显(没有该部分变异)。而相差大不大就是用F 统计量来计算的。假设共有N 个数据,分成K 组,第i 组有n i 个数据,下面这条式子中..y 表示全部数据的均 值,.y i 表示第i 组的均值。

总变异 = 各因素导致的变异 + 随机变异

总变异 = 组间变异 + 组内变异

2

2

2

(11)

1

11

(y )

(y )

(y )i

i

n n k

k

k

ij i i ij i i j i i j T B W

y n y y SS SS SS =====-=-+-=

+

∑∑∑∑∑

假如各个因素水平下的个体是没有差异的,那么组间变异和组内变异就不应该相差太多,

用于比较这种差距大小的统计量就是F 统计量。

1,/(K 1)

/(N K)B B k N k W W MS SS F MS SS ---==

- 其中MS B 为组间均方,MS w 组内均方,K-1和N-K 分别为组间均方和组内均方的自由度。算出F 后查F 分布表就可以得知F 在该情况和更极端情况下的概率,从而在相应的显著性水平

下检验各组是否有显著性差异。

单因素方差分析还有一种写法就是。

ij i i ij y μαε=++ 第i 组第j 个元素的值 = 第i 组的均值 + 第i 组与总体均值的差异 + 该元素在该组内的随机误差

所以,要检验的就是αi =0。

多因素方差分析

多因素方差分析的基本思想和单因素差不多。就是有时候还要考虑各个因素之间的交互作用。以双因素方差分析为例。则

()ijk i j ij ij y μαβαβε=++++ 其中()ij αβ表示两个因素的交互作用。要检验的就是α,β,αβ,是不是全都为0。

spss 实现

在spss 中这些简单的统计分析是非常容易实现的。 在》均值》单因素方差分析 但是更多的是在

》一般线性模型》单变量中,这里单因素和多因素。

如想两两比较,在》两两比较里一般选LSD 或者S-N-K 就行 更高级的其他详见[3]

但是方差分析是有适用条件的,要求

1样本是独立的(最重要也一般会满足) 2残差是正态的

3各组的方差是齐次的。也很重要,所以要在选项》方差齐次性检验

如果以上条件很不满足,只能非参数方法可能会更好。至于多元方差分析等更复杂的情况,水平有限,感觉我也用不到。

回归分析与曲线拟合

多元线性回归

一般我们用的都是多元线性回归,本来有着专业的统计学理论。但我只做基础的应用,就简单点吧。

?n n n n n n y x x x βββε=++ 估计一般用的是最小二乘法来估计参数β的值,但是在估计出β的值后要进行假设检验,

检验β是否为0,因为要是β本来是0,而是因为抽样误差才使估计出来的β不为0,那这样这个模型就错了,β为0 时模型是没有统计学意义的。在MATLAB 中给出的统计量是F 统计量,就是方差分析中的那个F ,H 0为β全为0,所以要拒绝原假设才行。不过MATLAB 不能给出每一个β是否为0的检验,这个需要t 检验,在SPSS 中给出来比较方便。还有决定系数R 2,这个和相关系数有点关系,约接近1越好。 MATLAB 语句

[b,bint,r,rint,stats] = regress(y,X,alpha)

y : 是对应的列向量

X : 是每一列对应一个变量的矩阵, alpha :可以自定义置信度,默认0.05. b : 返回的是β的估计值, bint : 是β的置信区间,

r : 残差y-?y

。 rint : r 的置信区间,可用rcoplot(r,rint);画出残差图。

stats :返回四个统计量,R 2,F 值,F 对应的P 值,还有s 2剩余平方差(残差的方差)。

非线性回归(非线性函数拟合)

回归分析一般是线性的,多元的时候用,当函数关系时非线性时,而且最好是一元的(这样拟合结果可以画出来,方便观察,当然nlinfit 也可以多元非线性回归,只是这时不能用nlintool 给出交互式画面了),这时候用到非线性回归。MATLAB 中可以联合以下几个函数一起实现。 nlinfit (非线性回归),

inline (可以在不另写M 文件情况下定义想要拟合的函数式), nlparci (给出参数的置信区间), nlintool (给出交互式画面) 例子如下

另外还有曲线拟合工具箱中lsqnonlin 函数和lsqcurvefit 函数可以曲线拟合,只是和nlinfit 不同,但应该效果和nlinfit (牛顿法)差不多,重要的是nlinfit 可以给出置信区间等更多的统计量和更多的配套函数(交互式画面),所以我还是都用nlinfit 好了。

Logistic 回归

这里我还只学了当因变量为二分类变量时的Logistic 回归,当因变量为多分类变量时的Logistic 回归参看[3]。因为当因变量为二分类时,实际上是拟合在各种自变量条件下因变量为1发生的概率,若用普通线性模型拟合会出现概率大于1或小于0的情况,而且一般概率和因变量都不是线性关系,而是S 型比较多,所以进行了logist 变换(变换后使最后的结果保持在0~1之间,且使回归的系数有了一点实际意义,有点像估计在不同自变量下的概率密度函数)。还有一点使Logistic 回归与普通线性回归不同的是,普通线性回归采用最小二乘法估计回归系数,Logistic 回归多采用极大似然法估计回归系数(这也使得它们对回归系数的检验有所不同)。记结果发生的概率为P ,则logist 变换如下:

logit(p)ln()1p

p

=- 这就将曲线曲线直线化,然后以logit(p)为因变量,建立Logistic 回归模型如下: 011logit(p)n n x x βββ=+++ 然后逆推可以得到:

011011011exp()1

11exp()1exp()

n n n n n n x x P P x x x x βββββββββ+++=-=

++++++++ 当样本量很大,各个自变量水平分好组,各水平概率可以算出来时,可以直接将logit(p)和各个x 进行普通的最小二乘回归,但是因为每组的样本数量不同,这样会造成异方差性。所以用

(1)i i i i w n p p =- 当做权重做加权最小二乘[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如下

模糊聚类

[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)看平均轮廓值的大小。下图就是一个聚类很好的轮廓图。

判别分析

这里只能先写一点我的体会,可能有点混乱和错误,但是好用。 判别分析主要分四种方法。

Silhouette Value

C l u s t e r

距离判别:

最简单好理解的判别,已知多个不同总体的数据,可计算各总体的重心坐标(均值),对待判的个体,分别计算该个体到原来各总体重心的马氏距离(也不一定是马氏距离,但这种距离最常用最合理),离哪个总体的距离近该个体就属于那个总体。因为马氏距离的计算要用到各总体的协方差矩阵,协方差矩阵相同还是不同的计算方法不一样,前者简单后者难。所以判别前要先检验协方差矩阵是否相同。

Fisher 判别:

思想是投影,将R 维空间的自变量组合投影 到维度较低的D 维空间去,在D 维空间进行分类,投影的原则是使每一类内的离差尽量小,不同类的离差尽量大。这和主成分分析和典型相关性分析有点关系,所以Fisher 判别又叫典则判别。一般转化到2~3维就可以了,剩下的能提供的信息非常少,这也是为什么SPSS 可以将多维变量的判别结果画在一张二维的图上。(有时转化到一维就行了,这时spss 不画图,过不知道三维它画不画图)

而且用它建立好的判别函数形式简洁,且对分布方差没有什么限制,应用十分广泛。(SPSS 默认就是用这种方式输出结果的)。 Bayes 判别:

对原来各种总体有一定的了解,认为P 个类别是空间中互斥的子集,满足一定的先验概率,然后按一定准则计算待判的个体i 分别属于这P 个类别的概率,则i 属于概率最大的那个类别。当总体协方差相同时,判别函数是一次函数,当总体协方差不相等时判别函数是二次的,(虽然不知道SPSS 中为什么当协方差不同时,判别函数也是一次的)。

强项是可以进行很多类的判别,缺点是对总体要求满足多元正态分布。(往往不满足,但是近似或是结果挺好也可用)。

逐步判别:

当自变量很多,又不知道哪个自变量对判别结果有作用时可用(一个一个变量加)。用SPSS 很好实现。

判别函数效果的检验:

1.回判,

2.外部数据验证,

3.交互验证(又叫cross validation,leave one data out ,是常用的方法),

4.bootstrap 法

图 1将二维的X 坐标转化为一维的Y 坐标

SPSS 实现[4]

分析》分类》判别 注意:

如果要输出Bayes 判别结果,在》统计量中勾选》Fisher ,(因为Bayes 判别是Fisher 提出来的),勾选后只是多一个“Fisher 的线性判别式函数的表格”,从中算出判别函数,值越大数模落入该组概率越大。当采用整体协方差相同的Bayes 判别时,bayes 判别函数和MATLAB 中的linear 给出的相同(只不过一个SPSS 是相互比,matlab 是和0比,相加减后系数是一样的)。但是当采用整体协方差不同时的Bayes 判别时,SPSS 不能交互验证,而且判别式居然还是一次函数,感觉还是MATLAB 的整体协方差不同时的Bayes 判别靠谱点。

另外一般要勾选》统计量》未标准化,这样可以输出未标准化的系数,用这个系数算出来的是Fisher 判别降维后的坐标,再算坐标与各另一个表格给出的重心的距离就知道属于哪一类了。SPSS 还是Fisher 判别最方便可靠

如果要逐步判别,勾选》使用进步方法

如果要交互检验》分类中勾选》不考虑该个案的分类 具体看[4]

Matlab 实现

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 ,如果K>0则说明s 属于第i 类而不属于第j 类。判别函数的具体计算方法见[5],已验证过MATLAB 给出的系数和该方法得出的一致。

主成分分析

作用:

当每一个样本对应很多元素(p 很大)时,并且各个元素间可能有相关性,这样数据的维数太高不利于后续的计算。通过对原元素进行线性组合来构造新变量。

11112121212122121121Y=X p p p p pp p p p pp p Y u X u X u X Y u X u X u X Y U Y u X u X u X

=+++??

=+++?=???

?=+++? 即 ,

得到的新元素i Y 之间互不相关,且往往取前几个Y 就能提取原来总体的大部分信息。计算过程为计算X 的协方差矩阵∑或相关系数矩阵R 的所有特征值1

p λλ和其对应的特征向量1p

γγ(特征向量本来是有无穷多个的,这里求的是单位正交特征向量,即每个向量的模为1,且两两之间线性无关),并将它们按λ从大到小排列,则排序后的[1

p γγ]就是pp U ,提取前i

个主成分对原始信息的保留量为1

1

/p

i j j j j λλ==∑∑ 一般信息保留量在85%以上就行,看情况。实质

上主成分分析就是向量空间的转变。将原来的向量空间转化到另一个坐标空间。其实1p γγ就

是新的向量空间的基的方向上的单位向量。要记得一个向量j 乘一个单位向量i 就等于j 在i 方向的投影。所以Y=X pp U ?得到的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 : 就是那个U pp 转化矩阵 score : 最后得出的主成分的值,每一列表示一个主成分(按第一主成分到第n 主成分个排列)。 latant :是各主成分对应的特征向量。

tsquare :是Hotelling's T-squared 统计量,我这个水平可以不理他。

explained :是只每一个主成分解释了百分之多少的方差,是一个列向量。

注意: 当用的是原始数据时,默认情况下score ≠X*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 ,

意义是什么。/i ρ就是coeff 系数矩阵中的系数。将SPSS 输出的

就是主成分得分。而将MATLAB 得出的各主成分得分标准化,或是

SPSS 给出的因子得分。这些都是拿相关阵分析时才成立的,用协方差阵时两者之间的关系比较复杂。

因子分析

其实因子分析就是主成分分析的拓展,为了解决主成分分析中主成分的意义不明确而发展的一种统计方法。他可以通过正交旋转,从而使每个因子更具实际的意义。有很多种方法可以来因子分析,但最主要的还是主成分法。用主成分法做因子分析原理如下

11111221221122121121p p p p

p p p pp p Y X X X Y X X X Y Y X X X

γγγγγγγγγ=+++??

=+++?=?

?

?=+++? 这是主成分与原始变量之间的关系

因为特征向量彼此正交,故能反过来由Y 表示X ,

X=score*coeff ’。其实就是将数据从主成分空间恢复到原来的向量空间。

111121************

1121m m m m p p p mp m p X Y Y Y X Y Y Y X Y Y Y γγγεγγγεγγγε=++++??=++++??

?

?=++++?

只提取前m 个主成分,其余的归入ε算作随机误差。 又为了将Y i 的方差变为1

,故令,i i ij ji F Y a ==,则上式变为:

11112121212122121121p p

p p p p p pp p X Y Y Y X Y Y Y X Y Y Y γγγγγγγγγ=+++??

=+++????=+++?

111121************

1121m m m m p p p mp m p X a F a F a F X a F a F a F X a F a F a F εεε=++++??=++++??

?

?=++++?

这样,就把X 用几个主要的F (因子)表示,且可以证明a 就是相应的F 与相应的X 之间的相关系数。相关系数越大,说明,这个因子就能越好的表示该个变量的信息。

为了使各个因子具有意义,所以当各个因子的意义不明显时还要进行因子的旋转。当采用正交旋转后,旋转后的各因子还是线型无关,但会使个相关系数向0和1靠拢,从而使各个因子的意义更明显。当正交旋转后的因子还是没有明显的意义时,可考虑斜交旋转,这样可能能让各因子具有更好的意义,但会使因子间具有一定相关性。最后可以通过各个F 值和F 的总综合评分来看看每个各干在哪一方面得分高就在那一方面有优势,还可以用总得分判断总优势。用SPSS 实现因子分析是非常方便的。但个人认为综合评分还是主成分方便,而因子分析的主要优势是能表现出各因子有什么意义。

典型相关性分析

主要是用来研究两组变量之间的相关性,是多对多的相关性研究。通过线性变换,将两组第一典型变量间相关性最大,且每组内的各典型相关变量无相关性。用SPSS 比较方便,且结果直观。

SPSS 实现

INCLUDE 'E:\Downloads\spss20.0\Samples\Simplified Chinese\Canonical 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, 4]

MATLAB 实现

[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 :各种检验统计量,不再说明了。

时间序列预测

一般单列的时间序列预测可归结为已知123

t y y y y 求1?t y

+。 时间序列分析是一个非常麻烦的事情,理论特别的复杂,但是解决的问题看起来又不是那

么厉害,有一点看趋势瞎猜的感觉。本来不打算看的,但是为了知识的完整性还是简略地看了一下。时间序列是一种现在的因变量受到前几个时刻的因变脸和自变量影响的序列 。在虽然看起来不厉害,但在现实生活中应用还是很多的,而且用SPSS 实现很容易。主要介绍下面四种方法。

移动平均法

移动平均就是用前N 个数的平均值表示当前变量的预测值。

()()11111

?t t t t t N y M y y y N

+--+==+++ 但是如果序列不是平稳的(有变化的趋势),那么可以用2次移动平均法(在一次移动平均的基础上再做一次移动平均),或是先对原来的数列取差分达到消除趋势的目的。然后对差分移动平均预测,最后将预测的差分加上原来的最后一个数据,就还原为预测值。

方法简单,但效果不好N 的选择有主观性,往往多试几个看哪个效果好看标准误大小。但是越早的序列对当前序列的影响应该是越小的,采用取平均值的方法太粗糙,效果不好。改进方法:加权移动平均/指数平滑法。

指数平滑法

基于越近的数列对当前要预测的数列的影响应该越大,所以将移动平均的权值按数列的先后顺序指数递减。该法一般要确定指数α和初值,不过在SPSS 中这些就都交给软件来确定吧,它会通过迭代找出相对较好的初值。如下为一次指数平滑。

()()1??11j

t t t t j j

y

y y y αααα∞

+-=+-=-∑ 显然()1j

j

α∞-∑=1;但是序列是没有无穷项的,所以还要确定初值。指数平滑也是适用于平稳的时间序列,对于有趋势的序列要做二次指数平滑,甚至更高次,也可以先取差分再平滑。

ARIMA 模型

ARIMA 法的分类和含义如下

AR (Auto Regressive Model) 自回归模型

AR(p)表示p 阶自回归模型,就是用过去p 个时刻的y 值做线性回归,预测下一个值t y 。(该模型假设t y 是均值为0,且是平稳的序列,简单理解就是趋势平稳)

1122t t t n t p t y y y y ???ε---=++++

其中重要的是t ε 要是均值为0,方差为2σ 的白噪声,不能有自相关的现象。不然的话这个模型需要改进。如果引进后移算子 1,k

t t t t

k

B y y B y

y --≡≡ 多项式算子 ()2121p p B B B B ????=---

-

则以上模型可以写作 ()t t B y ?ε=

MA (Moving Average Model) 滑动平均模型

MA(q) 表示q 阶滑动平均模型,就是用过去q 个时刻的误差ε做线性回归,预测下一个值t y 。(该模型假设t y 是均值为0,且是平稳的序列,简单理解就是趋势平稳)

1122t t t t q t q

y εθεθεθε---=----

这里用减号是为了能用上面的算子统一表示。t ε 是均值为0,方差为2σ 的白噪声,该模型用在误差的线性叠加上比较好。用和上面相似的算子,该模型可以表示为

()t t y B θε=

ARMA (Auto Regressive Moving Average Model )自回归滑动平均模型

ARMA(p,q) 表示p 阶自回归,q 阶滑动平均模型,就是上面两个模型的组合。特别是当MA 模型中的残差项不是白噪声时,就将两个模型结合起来,用MA 去表示AR 中有自相关的残差项。即

1111t t n t p t t q t q y y y ??εθεθε-------=--- 用上述的算子表示就是 ()()t t B y B ?θε=

假如序列的均值不为0,为μ,那么该模型就要改写为()()()t t B y B ?μθε-=

但当序列不是平稳的,而又趋势,那么就要先对序列取差分再运用该模型,就有了下面的模型ARIMA 。

ARIMA (Auto Regressive Integrated Moving Average Model )综合自回归-滑动平均模型

ARIMA(p,d,q) 表示p 阶自回归,d 阶差分,q 阶滑动平均模型。原理和上面的一样,就是该序列有趋势,不平稳,于是先取d 阶差分,再用上面的模型。用完了再用差分求回原来的值。 1阶差分 ()11t t t t y y y B y -?=-=- 2阶差分 ()2

211221t t t t t t t y y y y y y B y ---?=?-?=-+=-

记d 阶差分算子 ()1d

d B ?=-

且记 d t t y W ?= 若有t W 是满足()()t t B W B ?θε=的ARMA(p,q)序列,则称t y 是满足()()d t t B y B ?θε?=的ARIMA(p,d,q)序列。

ARIMA(p,d,q)(P ,D,Q) 表示 p 阶自回归,d 阶差分,q 阶滑动平均,加上季节的P 阶自回归,D 阶差分,Q 解滑动平均模型。当时间序列不仅有趋势变化,而且有季节性的波动时,那么就要加上季节性的差分以滤去季节性(周期性)的波动。 对于周期为s 的序列,一次“季节差分”(这样叫不准确,但方便起见就这样叫)如下:

相关主题
文本预览
相关文档 最新文档