Matlab中的日期和时间

1. Matlab中的三种日期/时间格式

1.1 字符串式(Date String)。

如“14-Apr-2015 10:54:00”,“2015-04-14 10:54”,“2015-04-14 10:54 AM”等等。

具体的格式可以自由定义,但是需要遵从Matlab中的相关规则。

规则1,日期/时间的各组成部分的符号标识(Symbolic Identifier)。

Symbolic Identifier Description Example
yyyy Year in full 1990, 2002
yy Year in two digits 90, 02
QQ Quarter year using letter Q and one digit Q1
mmmm Month using full name March, December
mmm Month using first three letters Mar, Dec
mm Month in two digits 03, 12
m Month using capitalized first letter M, D
dddd Day using full name Monday, Tuesday
ddd Day using first three letters Mon, Tue
dd Day in two digits 05, 20
d Day using capitalized first letter M, T
HH Hour in two digits
(no leading zeros when symbolic identifier AM or PM is used)
05, 5 AM
MM Minute in two digits 12, 02
SS Second in two digits 07, 59
FFF Millisecond in three digits 057
AM or PM AM or PM inserted in date string 3:45:02 PM

可以使用以上标识符自由定义显示出来的字符串式的日期。

规则2,Matlab中预定义的字符串式日期/时间格式,即Matlab中有现成的预定义的(predefined)显示格式,共33种,每一种以一个数字标识(Numeric Identifier)指示,如下表。

Numeric Identifier Date String Format Example
-1 (default) 'dd-mmm-yyyy HH:MM:SS' or 'dd-mmm-yyyy' if'HH:MM:SS'= 00:00:00 01-Mar-2000 15:45:17 or 01-Mar-2000
0 'dd-mmm-yyyy HH:MM:SS' 01-Mar-2000 15:45:17
1 'dd-mmm-yyyy' 01-Mar-2000
2 'mm/dd/yy' 03/01/00
3 'mmm' Mar
4 'm' M
5 'mm' 03
6 'mm/dd' 03/01
7 'dd' 01
8 'ddd' Wed
9 'd' W
10 'yyyy' 2000
11 'yy' 00
12 'mmmyy' Mar00
13 'HH:MM:SS' 15:45:17
14 'HH:MM:SS PM' 3:45:17 PM
15 'HH:MM' 15:45
16 'HH:MM PM' 3:45 PM
17 'QQ-YY' Q1-01
18 'QQ' Q1
19 'dd/mm' 01/03
20 'dd/mm/yy' 01/03/00
21 'mmm.dd,yyyy HH:MM:SS' Mar.01,2000 15:45:17
22 'mmm.dd,yyyy' Mar.01,2000
23 'mm/dd/yyyy' 03/01/2000
24 'dd/mm/yyyy' 01/03/2000
25 'yy/mm/dd' 00/03/01
26 'yyyy/mm/dd' 2000/03/01
27 'QQ-YYYY' Q1-2001
28 'mmmyyyy' Mar2000
29 'yyyy-mm-dd'
(ISO 8601)
2000-03-01
30 'yyyymmddTHHMMSS'
(ISO 8601)
20000301T154517
31 'yyyy-mm-dd HH:MM:SS' 2000-03-01 15:45:17

1.2 向量式(Date Vector)。

日期时间向量是由1*6个双精度型(double-precision)数值组成的一个行向量。其中除“秒”对应的元素可为分数外,其余值均为整型。时间表示为24小时制,无AM/PM表示信息。

日期时间向量中的各元素按如下顺序表示:

year month day hour minute second

如,10:45:07 AM on October 24, 2012 按向量式则为:

[2012 10 24 10 45 07]

1.3 连续日期数(Serial Date Number)。

连续日期数的意义是,一个代表了相对January 0, 0000的天数的数值。注意,该数值不可表示公元前,其负值并不表示公元前而表示相对公元10000-Jan-00前的天数。

比如,数值0表示公元0000年01月00日,数值1表示0000年01月01日,数值1.5表示0000年01月01日12:00:00,2015-04-14 12:00用连续日期数表示为:736068.5000。

当然使用这个数值还有一个问题,就是时区,该数值以ISO 8601下0时区为标准,如果需要转换为当地时间则要加上或减去响应的时区差对应的天数,比如,中国处于东八区,即UTC +08:00时区,那么在此数值上需要加上8/24=0.3333这样一个值,因为提前的八个小时相当于0.3333天。

2. Matlab中各种日期时间格式之间的转换

2.1 转换为连续日期数(to serial date number):datenum

datenum这个函数可以将其他两种形式的日期时间格式转换为连续日期数的形式,语法规则如下:

DateNumber = datenum(DateString)

这个函数将字符串式转换为连续日期数式

DateNumber = datenum(DateString,formatIn)

这个函数将字符串式转换为连续日期数式,同时通过”formatIn“这个变量明确了字符串式的具体形式,”formatIn“变量本身也是一个字符串,须对应1.1中的相关规则

DateNumber = datenum(DateVector)

这个函数将向量式转换为连续日期数式

DateNumber = datenum(Y,M,D)/datenum(Y,M,D,H,MN,S)

这个函数将向量式转换为连续日期数式。同时指定信息完整度,可见最少要完整到天

2.2 转换为向量式(to vector of components):datevec

datevec这个函数可以将其他两种形式的日期时间格式转换为向量式的形式,语法规则如下:

DateVector = datevec(DateNumber)

这个函数将连续日期数式转换为向量式

DateVector = datevec(DateString)

这个函数将字符串式转换为向量式

DateVector = datevec(DateString,formatIn)

这个函数将字符串式转换为向量式,同时通过”formatIn“这个变量明确了字符串式的具体形式

2.3 转换为字符串式(to string format):datestr

datestr这个函数可以将其他两种形式的日期时间格式转换为字符串式的形式,语法规则如下:

DateString = datestr(DateVector)

这个函数将向量式转换为字符串式

DateString = datestr(DateNumber)

这个函数将连续日期数式转换为字符串式

DateString = datestr(___,formatOut)

这个函数将其他形式转换为字符串式,同时通过”formatOut“变量指定转化后的字符串的具体形式,”formatIn“变量本身也是一个字符串,须对应1.1中的相关规则

DateString = datestr(DateStringIn)

这个函数将通过”DateStringIn“变量表示的一种字符串式转换为以”day-month-year hour:minute:second“形式表示的字符串式

DateString = datestr(___,’local’)

这个函数将其他形式转换为字符串式,同时以当前使用的系统日期时间显示标准来显示,如:

 >>datestr(now,'local')

ans =

14-4月-2015 12:39:38

 


本文结束。

主成分分析(PCA)及其在MATLAB中的实现

主成分分析 Principal Component Analysis(PCA)

 1. 什么是主成分分析? What is PCA?

以下是Wikipedia英文Principal component analysis词条的叙述:

Principal component analysis (PCA) is a statistical procedure that uses an orthogonal transformation to convert a set of observations of possibly correlated variables into a set of values of linearly uncorrelated variables called principal components. The number of principal components is less than or equal to the number of original variables.

意为:

主成分分析(PCA)是一种统计过程,通过一种正交变换将一组可能相关联的参数的观测值转换成一组线性互不关联的参数值,转换后的参数即被称为主成分。主成分的个数小于等于原参数的数目。

This transformation is defined in such a way that the first principal component has the largest possible variance (that is, accounts for as much of the variability in the data as possible), and each succeeding component in turn has the highest variance possible under the constraint that it is orthogonal to (i.e., uncorrelated with) the preceding components.

意为:

还定义这种变换具有如下特点:第一个主成分具有可能的最大方差值(也就是,它尽可能地包含数据中的变化性),随后的主成分依次具有可能的最大方差,且满足与之前的成分正交这一限制。

The principal components are orthogonal because they are the eigenvectors of the covariance matrix, which is symmetric. PCA is sensitive to the relative scaling of the original variables.

意为:

主成分是正交的,因为它们是协方差矩阵的特征向量,而协方差矩阵是一个对称矩阵。主成分分析对原参数的相关度比较敏感。

2. 主成分分析能做什么?What can PCA do?

以下是Wikipedia中文 主成分分析 词条的叙述:

在多元统计分析中,主成分分析(英语:Principal components analysis,PCA)是一种分析、简化数据集的技术。主成分分析经常用于减少数据集的维数,同时保持数据集中的对方差贡献最大的特征。这是通过保留低阶主成分,忽略高阶主成分做到的。这样低阶成分往往能够保留住数据的最重要方面。但是,这也不是一定的,要视具体应用而定。由于主成分分析依赖所给数据,所以数据的准确性对分析结果影响很大。

关键词:简化数据,减少数据集的维数

PCA是最简单的以特征量分析多元统计分布的方法。通常情况下,这种运算可以被看作是揭露数据的内部结构,从而更好的解释数据的变量的方法。如果一个多元数据集能够在一个高维数据空间坐标系中被显现出来,那么PCA就能够提供一幅比较低维度的图像,这幅图像即为在讯息最多的点上原对象的一个‘投影’。这样就可以利用少量的主成分使得数据的维度降低了。

关键词:数据的内部结构,解释数据

3.怎么做主成分分析?How to conduct/perform PCA?

这里需要说明:在Matlab和Wikipedia的Principal component analysis词条中,都将原数据矩阵的行定义为不同的实验/观测,将列定义为不同的参数/变量,这与其他一些文献中的定义方法刚好相反,所以会产生误解,比如,Wikipedia中covariance matrix词条中将行定义为参数/变量,本文中以Matlab和Wikipedia的Principal component analysis词条中的定义为准。

在维基百科英文词条下有具体的推导过程,本文不作详述,只介绍具体的计算方法,但所用的符号和数据的设定与英文词条下一致。

Consider a data matrix, X, with column-wise zero empirical mean (the sample mean of each column has been shifted to zero), where each of the n rows represents a different repetition of the experiment, and each of the p columns gives a particular kind of datum (say, the results from a particular sensor).

首先,假设有一个矩阵X,列向经验均值为零(即每列的样本均值移动到零),其n行表示被重复的n次实验,共p列的每一列表示一种特别种类的数据(比如说一种传感器的输出)。

The full principal components decomposition of X can therefore be given as

T=XW

where W is a p-by-p matrix whose columns are the eigenvectors of XTX。

于是,X的完整的主成分分解可由 T=XW 得出,其中W是一个pxp的矩阵它的列是矩阵XTX的特征向量。注意,这里的XTX与其他情况下协方差矩阵算式中的XXT其实是同一个矩阵,只不过两种情况下X的行列定义刚好相反。

具体的,先定义源数据矩阵如下:

PCA-orignal-matrix-definition

注意,此处Xi为行向量。

此后,计算过程如下:

PCA-calculation-procedure

具体的:

  • 第一步,计算Rx,即XTX,或XT的协方差矩阵(无1/(n-1)的系数)。
  • 第二步,求解Rx的特征值和特征向量。
  • 第三步,将特征值按从大到小顺序排列,同时将特征矩阵中的各列按对应特征值的顺序重新排列得到矩阵W
  • 第四步,计算排序完成后的特征值的累积贡献率accumulative contribution rate(ACR),设定阈值,如0.9,得到满足阈值的主成分数目。
  • 第五部,以L个主成分代替了p个变量,实现降维,且计算出源数据转换后的主成分的值。

主成分分析在Matlab中的实现 Perform PCA in Matlab

1. PCA算法的检验

首先我们根据PCA的定义算法进行计算,所用的源数据13*4的double表,13个观测4个变量,该数据通过matlab的hald数据获得,为ingredients矩阵。

load hald;
ingredients =
     7    26     6    60
     1    29    15    52
    11    56     8    20
    11    31     8    47
     7    52     6    33
    11    55     9    22
     3    71    17     6
     1    31    22    44
     2    54    18    22
    21    47     4    26
     1    40    23    34
    11    66     9    12
    10    68     8    12

在开始PCA前,首先需要将此矩阵列中心归零化,得到X

X = ingredients - repmat(mean(ingredients),13,1);
X =
   -0.4615  -22.1538   -5.7692   30.0000
   -6.4615  -19.1538    3.2308   22.0000
    3.5385    7.8462   -3.7692  -10.0000
    3.5385  -17.1538   -3.7692   17.0000
   -0.4615    3.8462   -5.7692    3.0000
    3.5385    6.8462   -2.7692   -8.0000
   -4.4615   22.8462    5.2308  -24.0000
   -6.4615  -17.1538   10.2308   14.0000
   -5.4615    5.8462    6.2308   -8.0000
   13.5385   -1.1538   -7.7692   -4.0000
   -6.4615   -8.1538   11.2308    4.0000
    3.5385   17.8462   -2.7692  -18.0000
    2.5385   19.8462   -3.7692  -18.0000

第一步,计算Rx

Rx = X'* X;
Rx =
   1.0e+03 *
    0.4152    0.2511   -0.3726   -0.2900
    0.2511    2.9057   -0.1665   -3.0410
   -0.3726   -0.1665    0.4923    0.0380
   -0.2900   -3.0410    0.0380    3.3620

第二步,求解特征值和特征向量:

[V,Lambda] = eig(Rx);
V =
    0.5062    0.5673    0.6460   -0.0678
    0.4933   -0.5440    0.0200   -0.6785
    0.5156    0.4036   -0.7553    0.0290
    0.4844   -0.4684    0.1085    0.7309
Lambda =
   1.0e+03 *
    0.0028         0         0         0
         0    0.1489         0         0
         0         0    0.8100         0
         0         0         0    6.2136

第三步,按特征值由大到小调整特征向量的列的顺序:

Lambda(4) > Lambda(3) > Lambda(2) > Lambda(1)
Lam(1) = Lambda(4,4);
Lam(2) = Lambda(3,3);
Lam(3) = Lambda(2,2);
Lam(4) = Lambda(1,1);
Lam =
 1.0e+03 *
 6.2136 0.8100 0.1489 0.0028
W(:,1) = V(:,4);
W(:,2) = V(:,3);
W(:,3) = V(:,2);
W(:,4) = V(:,1);
W =
   -0.0678    0.6460    0.5673    0.5062
   -0.6785    0.0200   -0.5440    0.4933
    0.0290   -0.7553    0.4036    0.5156
    0.7309    0.1085   -0.4684    0.4844

第四步,设定阈值为0.9,根据ACR值确定主成分数目:

ACR = cumsum(Lam)./sum(Lam);
ACR =
    0.8660    0.9789    0.9996    1.0000

由ACR的值可知,当主成分数目L=2时,ACR值>0.9的阈值,所以主成分数目为2即可。

第五步,计算源数据在主成分上的值:

T = X*W(:,1:2);
T =
   36.8218    6.8709
   29.6073   -4.6109
  -12.9818    4.2049
   23.7147    6.6341
   -0.5532    4.4617
  -10.8125    3.6466
  -32.5882   -8.9798
   22.6064  -10.7259
   -9.2626   -8.9854
   -3.2840   14.1573
    9.2200  -12.3861
  -25.5849    2.7817
  -26.9032    2.9310

至此,PCA计算过程结束。

2. Matlab函数的实现

在Matlab中进行PCA可通过princomp这一函数实现。

语法如下:

[COEFF,SCORE] = princomp(X)
[COEFF,SCORE,latent] = princomp(X)
[COEFF,SCORE,latent,tsquare] = princomp(X)
[...] = princomp(X,'econ')

其中COEFF表示变换系数,即W矩阵,SCORE表示源数据在主成分上的数值,即T矩阵,latent表示X的协方差矩阵的特征值,与之前的PCA定义中稍有不同,即相差1/(n-1)的倍数。

此外,princomp函数会自动对源数据矩阵进行列中心归零化,所以直接执行命令即可:

[pc,score,latent,tsquare] = princomp(ingredients);
pc =
   -0.0678   -0.6460    0.5673    0.5062
   -0.6785   -0.0200   -0.5440    0.4933
    0.0290    0.7553    0.4036    0.5156
    0.7309   -0.1085   -0.4684    0.4844
score =
   36.8218   -6.8709   -4.5909    0.3967
   29.6073    4.6109   -2.2476   -0.3958
  -12.9818   -4.2049    0.9022   -1.1261
   23.7147   -6.6341    1.8547   -0.3786
   -0.5532   -4.4617   -6.0874    0.1424
  -10.8125   -3.6466    0.9130   -0.1350
  -32.5882    8.9798   -1.6063    0.0818
   22.6064   10.7259    3.2365    0.3243
   -9.2626    8.9854   -0.0169   -0.5437
   -3.2840  -14.1573    7.0465    0.3405
    9.2200   12.3861    3.4283    0.4352
  -25.5849   -2.7817   -0.3867    0.4468
  -26.9032   -2.9310   -2.4455    0.4116
latent =
  517.7969
   67.4964
   12.4054
    0.2372
cumsum(latent)./sum(latent)
ans =
      0.86597
      0.97886
       0.9996
            1

可见,该结果与之前的五步法结果一致。

Matlab的使用方法之总体介绍

Matlab从使用的角度来说,更像是把一般的编程软件和办公软件结合了起来。我们可以像很多的编程软件一样,通过指令、代码编写算法程序,可以通过代码显示出结果,也可以像使用excel这样的办公软件一样,通过导入数据,进行可视化的编辑,进而绘制图形。

从数据的获得、导入到分析、处理再到结果的显示、输出整个流程都可以用Matlab实现,而实现的方法可以是基于程序代码的,也可以是基于可视化操作的。

所以,主要将Matlab的用法分成两个部分,一种为代码的方法,一种为可视化的方法。

1.1 代码的方法

Matlab程序界面中有command window窗体,可以直接在其中输入代码实现所有可能的操作,每一行的代码都会自动保存在边上的command history窗体内,双击其中的一行,相当于再次执行该行代码一次。

为了系统地管理我们的代码,我们可以建立Matlab中被称为script的以“.m”为扩展名的文件,这个文件就是一个代码的合集,文件中的所有代码按行依序执行,和C语言类似,以分号分隔各行。

1.2 可视化的方法

如果遇到大量重复性的工作,并且各自需要不同的认为干预时,可视化的操作是非常必要的。

在Matlab中,可以通过Graphical User Interface(GUI)非常直观地来编辑程序界面,GUI类似于VC中的对话框,内置了常用的“控件”,如按钮/编辑框/列表框等等,可以直接拖拽到fig上。

非常有趣的一点是,GUI也是一个fig,和Matlab中显示图形结果的fig没有本质不同,所以理解Matlab的fig对学习好Matlab至关重要。