排列熵算法简介及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 ...
随机推荐
- [USACO17JAN]Subsequence Reversal序列反转
题目描述 Farmer John is arranging his NN cows in a line to take a photo (1 \leq N \leq 501≤N≤50). The he ...
- 初遇 Asp.net MVC 数据库依赖缓存那些事儿
问题背景: 最近做一个非常简单的功能,就是使用ajax请求的方式从服务端请求一段下拉表的数据. 以前也有做过这个功能,只不过这次做这个功能的时候冒出了一个想法: 我请求的这段数据它是一段相对比较固定的 ...
- Python作业之工资管理
作业之工资管理 工资管理实现要求: 工资管理系统 Alex 100000 Rain 80000 Egon 50000 Yuan 30000 -----以上是info.txt文件----- 实现效果: ...
- 数据结构 栈&队列
2-4 依次在初始为空的队列中插入元素a,b,c,d以后,紧接着做了两次删除操作,此时的队头元素是( ) 删除,移动头指针: 增加,移动尾指针: 删除a,b ,队头c 2-3 在一个链队列中,fron ...
- Map value类型不同的写法
Map value类型不同的写法 Map<String, Object> accountMap=new HashMap<String, Object>(); int userI ...
- 剖析Vue原理&实现双向绑定MVVM
转自:http://www.w3cmark.com/2016/496.html 本文能帮你做什么? 1.了解vue的双向数据绑定原理以及核心代码模块 2.缓解好奇心的同时了解如何实现双向绑定 为了便于 ...
- 项目中BigDecimal与Double使用场景
金额要用BigDecimal 金额计算不能用doube!!!! 金额计算必须用BigDecimal,下面对比一下用double 跟BigDecimal的区别.先看一个小例子: 请看题: 示例1 问, ...
- day07 Cookie 和 Session(非常重要)
day07 Cookie 和 Session 1. 会话技术 2. cookie 的方法和 cookie 案例-显示用户上次访问网站的时间 3. cookie 的细节 - 删除 cookie 4. S ...
- python笔记三(list、tuple)
一.list list的增删改查 #增, classmates.append("nadech") #在末尾追加一个元素 classmates.insert(1,"agui ...
- Bootstrap3 表格-鼠标悬停
通过添加 .table-hover 类可以让 <tbody> 中的每一行对鼠标悬停状态作出响应. <table class="table table-hover" ...