互近似熵
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
原创——互近似熵,衡量两序列模式相似的不一致
性探讨
互近似熵(Cross-ApEn)是由近似熵的概念引申而来的,互近似熵在计算时需要两个序列,其一为模板序列template,其二为目标序列target,其计算步骤与近似熵类似,只不过距离的计算从近似熵中同一个序列之间的差值,变换为目标序列与模板序列之间的差值,因此不存在自身匹配的问题,但是会大量出现无定义的情况(匹配数为0,出现ln(0)结果),因此计算时需要引入修正项。一般,将目标匹配数为0时,强制赋值为1,模板匹配数为0时,强制赋值为1/(N-m+1)。
互近似熵表征两个序列之间模式的相似性。
理论上,如果序列t1与s之间模式较为一致,而t2与s之间的模式差距较大,那么,Cross-ApEn(t1||s) 使用MIX(P)随机过程产生三个序列MIX(0.1),MIX(0.3)和MIX(0. 6),那么,Cross-ApEn(MIX(0.1)||MIX(0.3)) 此主题相关图片如下:mix.jpg 从图中可以明显的看出,MIX(0.6)明显要比MIX(0.1)复杂,因此它与MIX(0.3)在模式上相似性更差,它们之间的互近似熵要更大一些。计算不同r值时的互近似熵结果如图所示 此主题相关图片如下:lackofconsistency.jpg 从图中可以看出,互近似熵与近似熵一样,存在有不一致的情况,当r的取值不同时,会获得两个完全不一致的结果。计算互近似熵的程序crapen与apen编写类似(参考【混沌】近似熵及其在MATLAB中的高效实现),相关讨论可以至21世纪电子论坛MATLAB讨论组进行。 原创——关于近似熵缺乏一致性的一个试验近似熵可以用于衡量时间序列的有序性(或者说无序性:复杂性),但是近似熵的计算取决于两个参数:维数m和相似性容限r,那么,序 列a比序列b无序的前提是:在任何m和r的取值下,序列a的近似熵比序列b的近似熵大。这就引出了近似熵一致性的探讨。 使用MIX(P)随机过程进行验证。MIX(P)可以使用下式表示: MIX(P) = (1 - Z)*X + Z*Y 其中,X为正弦信号序列,Y为均布随机数。Z为0和1序列,Z取1的概率为P,P越大,则该序列理论上越复杂。构造2000点MI X(0.1)和MIX(0.9)过程进行试验。 %% MIX stochastic processes % using to test the lack of consistency of apen N = 2000; fs = 50; t = 0:1/fs:(N-1)/fs; x = sqrt(2)*sin(2*pi*t/12); y = unifrnd(-sqrt(3), sqrt(3), [1, N]); p1 = unifrnd(0, 1, [1, N]); p9 = p1; p1(p1 >= 0.9) = 1; p1(p1 ~= 1) = 0; p9(p9 >= 0.1) = 1; p9(p9 ~= 1) = 0; MIX1 = (1-p1).*x + p1.*y; MIX9 = (1-p9).*x + p9.*y; m = 2; r = logspace(log10(0.01), 0, 20); ApEn1 = zeros(size(r)); ApEn9 = zeros(size(r)); for k = 1:length(r) ApEn1(k) = apen(MIX1, m, r(k)); ApEn9(k) = apen(MIX9, m, r(k)); end semilogx(r, ApEn1, 'o') hold on semilogx(r, ApEn9, 'p') ylim([0 4]) set(gca, 'XTickLabel', [0.01 0.1 1]); 结果如下图所示: 此主题相关图片如下:aa.jpg 上图中“o”序列为MIX(0.1)过程,另外为MIX(0.9)过程。可以明 显看出,这两个序列的近似熵值随阈值r的选择出现交叉现象:当r取值较小时,获得的结果是过程MIX(0.1)复杂度较高,随着r的取值增大,过程MIX(0.9)的复杂度高于MIX(0.1)。这种不一致性影响了我们的判断。 原创——MATLAB近似熵计算函数 熵是系统无序的度量,近似熵可以仅仅依靠少量的数据,便可以对一个序列的无序性进行有效评估(Pincus SM 1991)。近似熵的计算方法如图所示(徐安2005): 此主题相关图片如下:snap1.jpg 此主题相关图片如下:snap2.jpg 此主题相关图片如下:snap4.jpg 根据上述步骤,在MATLAB中可以很方便的编程实现,但是问题在于,如果没有一定的编程技巧,上述步骤编写出的程序运行速度将会非常之慢,以下为一组数据: (1)直接按照上述算法编写,利用嵌套循环形式,计算长度为2000点的序列ApEn,其计算时间为:259.920109秒; (2)对循环使用一定的技巧进行优化,尽量减少嵌套循环,并对循环中出现的变量预开辟空间,仍然计算上述长度为2000的序列的近似熵,其计算时间缩短到3.891304秒! (3)使用matlab中提供的一些特殊函数,再次优化循环,仍然计算上述数据序列的近似熵,其计算时间为:1.578624秒! 时间的节省效果是非常显著的,如果试验中计算100个数据序列,每个数据序列长度为2000点,那么,使用(1)的方法,所需时间大约为7小时;如果采用优化循环后的方法(2),需要的时间大概为7分钟;使用再次优化后的(3),使用时间大概不超过2分钟。 因此,在当前计算机硬件迅猛发展的前提下,即使不使用快速算法,这些程序的计算时间仍然可以接受的,只是需要在编程时增加一些优化,多一些技巧。 最后,给出一个试验,计算均匀独立同分布时间序列的近似熵,每一个序列长度为5000(使用最优化版程序计算速度大概为8秒一个序列),绘制近似熵结果与阈值r的选取之间的关系,r值取从0.01到1直接按照对数间隔取20个点,因此共需要计算20次,总共时间大约3分钟左右。试验程序如下: