混乱度度量-近似熵样本熵模糊熵原理及其代码
原理
https://www.zhihu.com/question/266285555
代码
近似熵python实现
import numpy as np
import matplotlib.pyplot as plt
def Approximate_Entropy(x, m, r=0.15):
"""
近似熵
m 滑动时窗的长度
r 阈值系数 取值范围一般为:0.1~0.25
"""
# 将x转化为数组
x = np.array(x)
# 检查x是否为一维数据
if x.ndim != 1:
raise ValueError("x的维度不是一维")
# 计算x的行数是否小于m+1
if len(x) < m+1:
raise ValueError("len(x)小于m+1")
# 将x以m为窗口进行划分
entropy = 0 # 近似熵
for temp in range(2):
X = []
for i in range(len(x)-m+1-temp):
X.append(x[i:i+m+temp])
X = np.array(X)
# 计算X任意一行数据与所有行数据对应索引数据的差值绝对值的最大值
D_value = [] # 存储差值
for i in X:
sub = []
for j in X:
sub.append(max(np.abs(i-j)))
D_value.append(sub)
# 计算阈值
F = r*np.std(x, ddof=1)
# 判断D_value中的每一行中的值比阈值小的个数除以len(x)-m+1的比例
num = np.sum(D_value<F, axis=1)/(len(x)-m+1-temp)
# 计算num的对数平均值
Lm = np.average(np.log(num))
entropy = abs(entropy) - Lm
return entropy
样本熵python实现
# SampEn calculation
import numpy as np
def SampEn(U, m, r):
def _maxdist(x_i, x_j):
return max([abs(ua - va) for ua, va in zip(x_i, x_j)])
def _phi(m):
x = [[U[j] for j in range(i, i + m - 1 + 1)] for i in range(N - m + 1)]
B = [(len([1 for x_j in x if _maxdist(x_i, x_j) <= r]) - 1.0) / (N - m) for x_i in x]
return (N - m + 1.0)**(-1) * sum(B)
N = len(U)
return -np.log(_phi(m+1) / _phi(m))
# Usage example
U = np.array([85, 80, 89] *17)
print(SampEn(U,2,3)) # SampEn=0.0008507018803128114
样本熵Matlab实现
% notification: this is a modification work based on that of Kijoon Lee.
function saen = SampEntropy( dim, r, data, tau )
% SAMPEN Sample Entropy
% calculates the sample entropy of a given time series data
% SampEn is conceptually similar to approximate entropy (ApEn), but has
% following differences:
% 1) SampEn does not count self-matching. The possible trouble of
% having log(0) is avoided by taking logarithm at the latest step.
% 2) SampEn does not depend on the datasize as much as ApEn does. The
% comparison is shown in the graph that is uploaded.
% dim : embedded dimension
% r : tolerance (typically 0.2 * std)
% data : time-series data
% tau : delay time for downsampling (user can omit this, in which case
% the default value is 1)
%
if nargin < 4, tau = 1; end
if tau > 1, data = downsample(data, tau); end
N = length(data);
result = zeros(1,2);
for m = dim:dim+1
Bi = zeros(1,N-m+1);
dataMat = zeros(m,N-m+1);
% setting up data matrix
for i = 1:m
dataMat(i,:) = data(i:N-m+i);
end
% counting similar patterns using distance calculation
for j = 1:N-m+1
% calculate Chebyshev distance, excluding self-matching case
dist = max(abs(dataMat - repmat(dataMat(:,j),1,N-m+1)));
% calculate Heaviside function of the distance
% User can change it to any other function
% for modified sample entropy (mSampEn) calculation
D = (dist <= r);
% excluding self-matching case
Bi(j) = (sum(D)-1)/(N-m);
end
% summing over the counts
result(m-dim+1) = sum(Bi)/(N-m+1);
end
saen = -log(result(2)/result(1));
end
模糊熵python实现
import numpy as np
import matplotlib.pyplot as plt
def Fuzzy_Entropy(x, m, r=0.25, n=2):
"""
模糊熵
m 滑动时窗的长度
r 阈值系数 取值范围一般为:0.1~0.25
n 计算模糊隶属度时的维度
"""
# 将x转化为数组
x = np.array(x)
# 检查x是否为一维数据
if x.ndim != 1:
raise ValueError("x的维度不是一维")
# 计算x的行数是否小于m+1
if len(x) < m+1:
raise ValueError("len(x)小于m+1")
# 将x以m为窗口进行划分
entropy = 0 # 近似熵
for temp in range(2):
X = []
for i in range(len(x)-m+1-temp):
X.append(x[i:i+m+temp])
X = np.array(X)
# 计算X任意一行数据与其他行数据对应索引数据的差值绝对值的最大值
D_value = [] # 存储差值
for index1, i in enumerate(X):
sub = []
for index2, j in enumerate(X):
if index1 != index2:
sub.append(max(np.abs(i-j)))
D_value.append(sub)
# 计算模糊隶属度
D = np.exp(-np.power(D_value, n)/r)
# 计算所有隶属度的平均值
Lm = np.average(D.ravel())
entropy = abs(entropy) - Lm
return entropy
原文地址:http://www.cnblogs.com/gmjie/p/16851426.html
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,请务用于商业用途!
3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员!
8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载
声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性