排列熵算法简介及c#实现
一、 排列熵算法简介:
排列熵算法(Permutation Entroy)为度量时间序列复杂性的一种方法,算法描述如下:
设一维时间序列:
采用相空间重构延迟坐标法对X中任一元素x(i)进行相空间重构,对每个采样点取其连续的m个样点,得到点x(i)的m维空间的重构向量:
则序列X的相空间矩阵为:
其中m和l分别为重构维数和延迟时间;
对x(i)的重构向量Xi各元素进行升序排列,得到:
这样得到的排列方式为
其为全排列m!中的一种,对X序列各种排列情况出现次数进行统计,计算各种排列情况出现的相对频率作为其概率p1、p2、…pk,k<=m!,计算序列归一化后的排列熵:
相对来说,排列熵的计算过程较为简洁,计算量主要为k次序列长度为m的全排序,在满足功能的前提下,窗口可以尽量的小,同时,窗口大小和延迟l值的大小选取非常重要。排列熵H的大小表征时间序列的随机程度,值越小说明该时间序列越规则,反之,该时间序列越具有随机性。在排列熵算法的基础上也可以发展出诸多使用熵值的对时间序列进行异常检测的算法
二.排列熵算法的实现
已排列窗口长度为4为例(由于涉及对数组的重复排序,该窗口长度宜设置较小,已加快计算速度),计算一段序列值得排列熵
</pre><span style="white-space:pre"> </span>private double PermutationEntropyCalCulator(double[] dArrData)<span style="white-space:pre"> </span>{<span style="white-space:pre"> </span>/*<span style="white-space:pre"> </span> * 计算一段序列值的排列熵<span style="white-space:pre"> </span> */<span style="white-space:pre"> </span>int M = 4; //窗口长度值<span style="white-space:pre"> </span>int nMPer = 24;// 大小为窗口长度的集合全排列数<span style="white-space:pre"> </span>int L = 8; //延迟<span style="white-space:pre"> </span>double[] dArrSample = new double[M];<span style="white-space:pre"> </span>int[] nArrSampleSortIndex = new int[M];<span style="white-space:pre"> </span>int[] nPermCount = new int[nMPer];<span style="white-space:pre"> </span><span style="white-space:pre"> </span>Dictionary<string, int> permlist = new Dictionary<string, int>();<span style="white-space:pre"> </span>//构建字典索性<span style="white-space:pre"> </span>permlist.Add("4321", 0);<span style="white-space:pre"> </span>permlist.Add("4312", 1);<span style="white-space:pre"> </span>permlist.Add("4231", 2);<span style="white-space:pre"> </span>permlist.Add("4213", 3);<span style="white-space:pre"> </span>permlist.Add("4123", 4);<span style="white-space:pre"> </span>permlist.Add("4132", 5);<span style="white-space:pre"> </span><span style="white-space:pre"> </span>permlist.Add("3421", 6);<span style="white-space:pre"> </span>permlist.Add("3412", 7);<span style="white-space:pre"> </span>permlist.Add("3241", 8);<span style="white-space:pre"> </span>permlist.Add("3214", 9);<span style="white-space:pre"> </span>permlist.Add("3124", 10);<span style="white-space:pre"> </span>permlist.Add("3142", 11);<span style="white-space:pre"> </span><span style="white-space:pre"> </span>permlist.Add("2341", 12);<span style="white-space:pre"> </span>permlist.Add("2314", 13);<span style="white-space:pre"> </span>permlist.Add("2431", 14);<span style="white-space:pre"> </span>permlist.Add("2413", 15);<span style="white-space:pre"> </span>permlist.Add("2143", 16);<span style="white-space:pre"> </span>permlist.Add("2134", 17);<span style="white-space:pre"> </span><span style="white-space:pre"> </span>permlist.Add("1324", 18);<span style="white-space:pre"> </span>permlist.Add("1342", 19);<span style="white-space:pre"> </span>permlist.Add("1234", 20);<span style="white-space:pre"> </span>permlist.Add("1243", 21);<span style="white-space:pre"> </span>permlist.Add("1423", 22);<span style="white-space:pre"> </span>permlist.Add("1432", 23);<span style="white-space:pre"> </span><span style="white-space:pre"> </span><span style="white-space:pre"> </span>Array.Clear(nPermCount, 0, nPermCount.Length);<span style="white-space:pre"> </span><span style="white-space:pre"> </span>int j, k;<span style="white-space:pre"> </span><span style="white-space:pre"> </span>for (j=0; j < (dArrData.Length- M*L); j++)<span style="white-space:pre"> </span>{<span style="white-space:pre"> </span>for (k=0; k<M; k++)<span style="white-space:pre"> </span>{<span style="white-space:pre"> </span>dArrSample[k] = dArrData[j+k*L];<span style="white-space:pre"> </span>}<span style="white-space:pre"> </span><span style="white-space:pre"> </span>SortIdex(dArrSample, ref nArrSampleSortIndex);//排序<span style="white-space:pre"> </span><span style="white-space:pre"> </span>string strSampleSortIndex = "";<span style="white-space:pre"> </span>for (k=0; k<M; k++)<span style="white-space:pre"> </span>{<span style="white-space:pre"> </span>strSampleSortIndex += nArrSampleSortIndex[k];<span style="white-space:pre"> </span>}<span style="white-space:pre"> </span><span style="white-space:pre"> </span>if (permlist.TryGetValue(strSampleSortIndex, out k) == false)<span style="white-space:pre"> </span>{<span style="white-space:pre"> </span>k = 0;<span style="white-space:pre"> </span>}<span style="white-space:pre"> </span><span style="white-space:pre"> </span>nPermCount[k]++;<span style="white-space:pre"> </span>}<span style="white-space:pre"> </span><span style="white-space:pre"> </span>double dPermSum = 0;<span style="white-space:pre"> </span>nMPer = 24;<span style="white-space:pre"> </span>for (j=0; j<nMPer; j++)<span style="white-space:pre"> </span>{<span style="white-space:pre"> </span>dPermSum += nPermCount[j];<span style="white-space:pre"> </span>}<span style="white-space:pre"> </span><span style="white-space:pre"> </span>double dPermutationEntropy = 0;<span style="white-space:pre"> </span>for (j=0; j<nMPer; j++)<span style="white-space:pre"> </span>{<span style="white-space:pre"> </span>if(nPermCount[j]>0)<span style="white-space:pre"> </span>{<span style="white-space:pre"> </span> double dProb = nPermCount[j]/dPermSum;<span style="white-space:pre"> </span> dPermutationEntropy += -dProb*Math.Log(dProb);//计算熵值<span style="white-space:pre"> </span>}<span style="white-space:pre"> </span>}<span style="white-space:pre"> </span><span style="white-space:pre"> </span>dPermutationEntropy = dPermutationEntropy/Math.Log(nMPer);<span style="white-space:pre"> </span><span style="white-space:pre"> </span>double dWeight = (dPermSum-nPermCount[0])/dPermSum;<span style="white-space:pre"> </span>dPermutationEntropy = dPermutationEntropy*dWeight;<span style="white-space:pre"> </span><span style="white-space:pre"> </span>return dPermutationEntropy;<span style="white-space:pre"> </span>}</p><p style="color: rgb(54, 46, 43); font-family: Arial; font-size: 14px; line-height: 26px;"><pre name="code" class="html">private void SortIdex(double[] dArrSample, ref int[] nArrSampleSortIndex)
{
/*
* 由小至大,依次排序
*
*/
if (dArrSample.Length != nArrSampleSortIndex.Length)
{
return;
}
int i,j;
int nTempIndex = 0;
double dTempValue = 0;
for(i=0; i<nArrSampleSortIndex.Length; i++)
{
nArrSampleSortIndex[i] = i+1;
}
for(i=0; i<dArrSample.Length; i++)
{
for(j=(dArrSample.Length-1); j>i; j--)
{
if(dArrSample[j-1]>dArrSample[j])
{
dTempValue = dArrSample[j-1];
nTempIndex = nArrSampleSortIndex[j-1];
dArrSample[j-1] = dArrSample[j];
nArrSampleSortIndex[j-1] = nArrSampleSortIndex[j];
dArrSample[j] = dTempValue;
nArrSampleSortIndex[j] = nTempIndex;
}
}
}
}
窗口长度较大的时,在小型设备上实时运行需要耗费较多的资源,不知道能否做进一步的优化呢
排列熵算法简介及c#实现的更多相关文章
- <算法图解>读书笔记:第1章 算法简介
阅读书籍:[美]Aditya Bhargava◎著 袁国忠◎译.人民邮电出版社.<算法图解> 第1章 算法简介 1.2 二分查找 一般而言,对于包含n个元素的列表,用二分查找最多需要\(l ...
- STL所有算法简介 (转) http://www.cnblogs.com/yuehui/archive/2012/06/19/2554300.html
STL所有算法简介 STL中的所有算法(70个) 参考自:http://www.cppblog.com/mzty/archive/2007/03/14/19819.htmlhttp://hi.baid ...
- 排列组合算法(PHP)
用php实现的排列组合算法.使用递归算法,效率低,胜在简单易懂.可对付元素不多的情况. //从$input数组中取$m个数的组合算法 function comb($input, $m) { if($m ...
- C#语法灵活运用之排列组合算法
今天群里有朋友求一个排列组合算法,题目是给定长度,输出所有指定字母的组合. 如指定字母a.b.c.d.e.f,长度为2,则结果应为:aa.ab.ac ... ef.ff. 有朋友给出算法,很有特色: ...
- webrtc 的回声抵消(aec、aecm)算法简介(转)
webrtc 的回声抵消(aec.aecm)算法简介 webrtc 的回声抵消(aec.aecm)算法主要包括以下几个重要模块:1.回声时延估计 2.NLMS(归一化最小均方自适应算法) ...
- AES算法简介
AES算法简介 一. AES的结构 1.总体结构 明文分组的长度为128位即16字节,密钥长度可以为16,24或者32字节(128,192,256位).根据密钥的长度,算法被称为AES-128,AES ...
- LARS 最小角回归算法简介
最近开始看Elements of Statistical Learning, 今天的内容是线性模型(第三章..这本书东西非常多,不知道何年何月才能读完了),主要是在看变量选择.感觉变量选择这一块领域非 ...
- AI - 机器学习常见算法简介(Common Algorithms)
机器学习常见算法简介 - 原文链接:http://usblogs.pwc.com/emerging-technology/machine-learning-methods-infographic/ 应 ...
- C++11 STL算法简介
STL(Standard Template Library),即标准模板库,是一个具有工业强度的,高效的C++程序库.它被容纳于C++标准程序库(C++ Standard Library)中,是ANS ...
随机推荐
- [BZOJ]1076 奖励关(SCOI2008)
终于又一次迎来了一道期望DP题,按照约定,小C把它贴了出来. Description 你正在玩你最喜欢的电子游戏,并且刚刚进入一个奖励关.在这个奖励关里,系统将依次随机抛出k次宝物,每次你都可以选择吃 ...
- 浅谈MySQL中优化sql语句查询常用的30种方法
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索 ...
- 在Unix系统中,主存索引节点和辅存索引节点从内容上比较有什么不同,为什么要设置主存索引节点?
主存索引节点和辅存索引节点的不同主要体现在:主存索引节点状态:设备号.索引节点号:引用计数. 主存索引节点状态——反映主存索引节点的使用情况.它指示出: 1. 索引节点是否被锁上了: 2. 是否有 ...
- Spring 自带的定时任务Scheduled
1.注解@Scheduled 可以作为一个触发源添加到一个方法中,例如,以下的方法将以一个固定延迟时间5秒钟调用一次执行,这个周期是以上一个调用任务的完成时间为基准,在上一个任务完成之后,5s后再次执 ...
- 【vuejs深入三】vue源码解析之二 htmlParse解析器的实现
写在前面 一个好的架构需要经过血与火的历练,一个好的工程师需要经过无数项目的摧残. 昨天博主分析了一下在vue中,最为基础核心的api,parse函数,它的作用是将vue的模板字符串转换成ast,从而 ...
- oss web直传
签名信息 auth.php <?php function gmt_iso8601($time) { $dtStr = date("c", $time); $mydatetim ...
- ORACLE设置自启动记录
设置开机自启动1. 修改Oracle系统配置文件:/etc/oratab,只有这样,Oracle 自带的dbstart和dbshut才能够发挥作用.[root@hailiang ~]# vi /etc ...
- Linux 查看CPU温度
安装 lm-sensors sudo apt-get install lm-sensors # 安装yes | sudo sensors-detect # 侦测所有感测器 sensors # 查看温度 ...
- 使用ajax上传图片,支持图片即时浏览,支持js图片压缩后上传给服务器
使用ajax上传图片,支持图片即时浏览,支持js图片压缩后上传给服务器 ajax上传主要使用了 var reader = new FileReader() 此方法 js图片压缩主要是利用canvas进 ...
- Splay伸展树入门(单点操作,区间维护)附例题模板
Pps:终于学会了伸展树的区间操作,做一个完整的总结,总结一下自己的伸展树的单点操作和区间维护,顺便给未来的自己总结复习用. splay是一种平衡树,[平均]操作复杂度O(nlogn).首先平衡树先是 ...