声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 5576|回复: 2

[经典算法] 样本熵计算程序请教

[复制链接]
发表于 2011-8-15 10:59 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
样本熵是时间序列复杂度的一种度量,在上个世纪末期由几位非线性动力学研究者提出。
    文献中给出的样本熵算法步骤如下:(见图SampEn1.jpg和SampEn 2.jpg)
然后我再网上下载了下面一个程序代码:
function SampEnVal = SampEn(data, m, r)
%SAMPEN  计算时间序列data的样本熵
%        data为输入数据序列
%        m为初始分段,每段的数据长度
%        r为阈值
% $Author: lskyp
% $Date:   2010.6.20
% Orig Version: V1.0--------分开计算长度为m的序列和长度为m+1的序列
%                           这一版的计算有些问题,需要注意两个序列总数都要为N-m
% Modi Version: V1.1--------综合计算,计算距离时通过矩阵减法完成,避免重循环
% V1.1 Modified date: 2010.6.23
data=['Input tne data']
m=2;
r=0.2*std(data);
N = length(data);
Nkx1 = 0;
Nkx2 = 0;
% 分段计算距离,x1为长度为m的序列,x2为长度为m+1的序列
for k = N - m:-1:1
    x1(k, :) = data(k:k + m - 1);
    x2(k, :) = data(k:k + m);
end
for k = N - m:-1:1
    % x1序列计算
    % 统计距离,由于每行都要与其他行做减法,因此可以先将该行复制为N-m的矩阵,然后
    % 与原始x1矩阵做减法,可以避免两重循环,增加效率
    x1temprow = x1(k, :);
    x1temp    = ones(N - m, 1)*x1temprow;
    % 可以使用repmat函数完成上面的语句,即
    % x1temp = repmat(x1temprow, N - m, 1);
    % 但是效率不如上面的矩阵乘法
    % 计算距离,每一行元素相减的最大值为距离
    dx1(k, :) = max(abs(x1temp - x1), [], 2)';
    % 模板匹配数
    Nkx1 = Nkx1 + (sum(dx1(k, :) < r) - 1)/(N - m - 1);
   
    % x2序列计算,和x1同样方法
    x2temprow = x2(k, :);
    x2temp    = ones(N - m, 1)*x2temprow;
    dx2(k, :) = max(abs(x2temp - x2), [], 2)';
    Nkx2      = Nkx2 + (sum(dx2(k, :) < r) - 1)/(N - m - 1);
end
% 平均值
Bmx1 = Nkx1/(N - m);
Bmx2 = Nkx2/(N - m);
% 样本熵
SampEnVal = -log(Bmx2/Bmx1);

在这段程序中,红色文字部分为自己设置的,我的疑问就是如何设置m和r的值,因为不同的m和r取值,会得到不同的最后结果,所以小弟想请教一下大家,如何根据我的数据来确定m和r的值,谢谢大家了!
sampen1.JPG
sampen2.JPG

评分

1

查看全部评分

回复
分享到:

使用道具 举报

发表于 2012-6-26 20:40 | 显示全部楼层
谢谢了。
发表于 2017-9-4 17:49 | 显示全部楼层
这个取值没有特别明确的标准性,经验性居多,还是要根据你分析的数据来。恐怕有时候也只能具体情况,具体分析了
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-12-26 04:41 , Processed in 0.116631 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表