样本熵
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
MATLAB下的动态样本熵计算
样本熵是时间序列复杂度的一种度量,在上个世纪末期由几位非线性动力学研究者提出。样本熵比近似熵更具有相对一致性,在分析生物信号序列的复杂度分析中已经获得成功应用。
文献中给出的样本熵算法步骤如下:
根据文献中提供的算法步骤,我们可以通过C语言或者MATLAB 编程实现。
这里有一个实现方法,这是在ying_327的提问帖(程序样本熵求助)中出现的,现摘抄如下:
复制内容到剪贴板
代码:
function [shang]=ybs(xdate)
% clc,clear,
% xdate = randn(10,1);
m=2;
n=length(xdate);
r=0.2*std(xdate);
cr=[];
gn=1;
gnmax=m;
% while gn<=gnmax
x2m=zeros(n-m+1,m);%存放变换后的向量
d=zeros(n-m+1,n-m);% 存放距离结果的矩阵
cr1=zeros(1,n-m+1);%存放
k=1;
for i=1:n-m+1
for j=1:m
x2m(i,j)=xdate(i+j-1);
end
end
x2m;
for i=1:n-m+1
for j=1:n-m+1
if i~=j
d(i,k)=max(abs(x2m(i,:)-x2m(j,:)));%计算各个元素和响应元素的距离
k=k+1;
end
end
k=1;
end
d;
for i=1:n-m+1
[k,l]=size(find(d(i,:) cr1(1,i)=l; end cr1; cr1=(1/(n-m))*cr1; sum1=0; for i=1:n-m+1 sum1=sum1+cr1(i); end end cr1=1/(n-m+1)*sum1; cr(1,gn)=cr1; gn=gn+1; m=m+1; end cr; shang=-log(cr(1,1)/cr(1,2)); 我们先不看程序完成的是否正确,仅从程序结构本身就可以看出,这个程序有着浓厚的C风格,在MATLAB强大的矩阵处理能力下,循环 操作显得异常刺眼,而且效率异常低。我在回复中给出另外一种解法:复制内容到剪贴板 代码: function SampEnVal = SampEn(data, m, r) %SAMPEN 计算时间序列data的样本熵 % data为输入数据序列 % m为初始分段,每段的数据长度 % r为阈值 % $Author: lskyp % $Date: 2010.6.20 data = data(:)'; N = length(data); % 分段计算距离 for k = N - m:-1:1 xm(k, :) = data(k:k + m - 1); end for k = N - m:-1:1 for p = N - m:-1:1 % 统计距离,k=p时距离为0,计算时舍去一个即可 d(k, p) = max(abs(xm(p, :) - xm(k, :))); end end % 模板匹配数以及平均值计算 Nk = 0; for k = N - m:-1:1 Nk = Nk + (sum(d(k, :) < r) - 1)/(N - m - 1); end Bm = Nk/(N - m); clear xm d Nk % m值增加1,重复上面的计算 m = m + 1; % 分段计算距离 for k = N - m:-1:1 xm(k, :) = data(k:k + m - 1); end for k = N - m:-1:1 for p = N - m:-1:1 % 统计距离,k=p时距离为0,计算时舍去一个即可 d(k, p) = max(abs(xm(p, :) - xm(k, :))); end end % 模板匹配数以及平均值计算 Nk = 0; for k = N - m:-1:1 Nk = Nk + (sum(d(k, :) < r) - 1)/(N - m - 1); end Bmadd1 = Nk/(N - m); % 熵值 SampEnVal = -log(Bmadd1/Bm); 刚又分析了这个程序,对比算法来说,这个程序有些问题,注意到两个序列(长度为m的以及长度为m+1)的数量应该都为N-m个,而上面的程序由于中间m进行了加1操作,因此第二次计算的序列数量比第一次少了一个。两个序列应该同时计算。 另外,上面的程序使用了两重循环,经过分析,可以将内层循环矩阵化,矩阵化之后的程序仅进行一次循环,效率增加了很多,但是程序看起来可能不如第一版程序好理解。 复制内容到剪贴板 代码: