排列熵算法简介及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 ...
随机推荐
- bzoj1853[Scoi2010]幸运数字 容斥
1853: [Scoi2010]幸运数字 Time Limit: 2 Sec Memory Limit: 64 MBSubmit: 3027 Solved: 1128[Submit][Status ...
- VB6工程在Win10系统打开提示MSCOMCTL.OCX无法加载
解决办法: 修改.vbp文件中的 00F8754DA1}#2.1#0; MSCOMCTL.OCX 改为 00F8754DA1}#2.0#0; MSCOMCTL.OCX 中间的2.1 改为 2.0
- (ubuntu)linux C编程之sleep()和usleep()的使用和区别
### 函数名: sleep 头文件: #include <windows.h> // 在VC中使用带上头文件 #include <unistd.h> // 在gcc编译器中, ...
- solr6.6初探之查询篇
关于搜索与查询,首先我们来看一张图: 这张图说明了solr查询原理: 1.当通过solr发起查询的时候,引擎会选择一个RequestHandler(从字面意思上来说就是请求处理器)来进行查询处理 2. ...
- 智能优化算法对TSP问题的求解研究
要求: TSP 算法(Traveling Salesman Problem)是指给定 n 个城市和各个城市之间的距离,要 求确定一条经过各个城市当且仅当一次的最短路径,它是一种典型的优化组合问题,其最 ...
- 笔记7 AOP练习<有疑问>
场景描述: 核心业务:举行一场古典音乐会. 周边功能:观众入场,关闭手机.落座,觉得音乐好听时鼓掌,觉都不好听则退票.(切面) 1.编写切点(切点用于准确定位应该在什么地方应用切面的通 知)----即 ...
- break 与 continue
1.break ①只有一层循环时,作用是跳出循环语句,执行后面的代码. ②break存在于循环嵌套的内层循环时,只能跳出内层循环,如果想要跳出外层循环,需要对外层循环添加标记. 2.continue ...
- 【.NET Core】docker Jenkins ASP.NET Core自动化部署
本文基于GitHub演示自动化部署,实际上你可以选择任意的Git托管环境. 使用的模式:DooD(Docker-outside-of-Docker). 本文所有内容均开源 链接 欢迎关注我的GitHu ...
- 分布式锁的几种使用方式(redis、zookeeper、数据库)
Q:一个业务服务器,一个数据库,操作:查询用户当前余额,扣除当前余额的3%作为手续费 synchronized lock db lock Q:两个业务服务器,一个数据库,操作:查询用户当前余额,扣除当 ...
- mysql常见的优化需要注意的点
1.explain分析explian引用索引基数show indexes from table_name;主键索引具有最好的基数 测试时 不走缓存SELECT SQL_NO_CACHE id from ...