数据科学与SQL:如何计算排列熵?| 基于SQL实现

news2024/11/19 18:46:41

目录

0 引言

1 排列熵的计算原理

 2 数据准备

3 问题分析

4 小结


0 引言

把“熵”应用在系统论中的信息管理方法称为熵方法。熵越大,说明系统越混乱,携带的信息越少;熵越小,说明系统越有序,携带的信息越多。在传感器信息处理中,可以利用熵方法描述传感器信号的特征,进而对传感器信号进行有效分析。

排列熵(Permutation Entropy, PE)作为一种衡量一维时间序列复杂度的平均熵参数,它不仅能够度量一个非线性信号的不确定性,而且具有计算简单、抗噪声能力强等优点。因此,可以选择排列熵对IMF中包含的故障特征进行提取。通过集合经验模态分解后得到的每个IMF分量包含传感器信号在不同时间尺度下的特征。通过计算各个IMF分量的排列熵值并把它们组成特征向量,能够有效地突出在多尺度下的传感器故障特征。

1 排列熵的计算原理

对于某个长度为n的排列x,其元素分别为x1,x2,...,xn

①采用相空间重构延迟坐标法对一维时间序列x中任意一个元素x(i)进行相空间重构,得到如下矩阵:

其中,j=1, 2,…,K, K为重构分量的数目,m为嵌入维数,τ为延迟时间,x(j)为重构矩阵的第j行分量。 

②对x(i)的重构向量的各元素进行升序排列,得到j1, j2,…,jm。m维相空间映射下最多可以得到m!个不同的排列模式,P(l)表示其中一种排列的模式

 其中,l=1, 2,…,k,且k≤m!。

③对x序列各种排列情况下出现次数进行统计,计算各种排列情况出现的相对频率

 其概率为p1, p2,…,pk。

④信号排列模式的熵为:

⑤计算序列归一化后的排列熵为:
当P j = 1 / m ! ,也就是每种符号都有且它们的概率都相等,此时时间序列的复杂程度最高,所以排列熵最大,为 ln(m!)。另外,为了方便表示,通常会将H(m)除以一个 ln(m!)来归一化,这样


0=<H(m) / log_{_2{m!}}<=1

计算举例:

按照步骤举个例子,便于理解:

x={2,4,5,6,3,7,1},其长度n=7

1. 设嵌入维度m=3(3-neightborhood),时间延迟t=1(没有skip)

2. 得到k=n-(m-1)t=5个子序列,即:

(1) 2,4,5

(2) 4,5,6

(3) 5,6,3

(4) 6,3,7

(5) 3,7,1

3. 转换为大小关系的排列,分别为:

针对每个子序列K,对其值从小到大排序(如果值相同按照索引排序),返回对应的索引值。

注意此处有两种理解方式:

(1)该数排在第几个位置

例如【5,6,3】,该数排名后的位置为【2,3,1】

解释:5这个数排在第2个位置,6这个数排在第3个位置,3这个数排在第一个位置,所以返回【2,3,1】

(2)排在该位置【1,2,3】的是第几个数

例如【5,6,3】,其排序后的索引为【3,1,2】

解释:排在第一个位置的元素索引是3,排在第2个位置的元素索引是1,排在第三个位置的元素索引是2,所以返回【3,1,2】

这两种情况都不影响最终的结果.本文采取第一种类型计算结果如下:

(1) 1,2,3

(2) 1,2,3

(3) 2,3,1

(4) 2,1,3

(5) 2,3,1

4. 以上排列共有3种,分别为2次(1,2,3),2次(3,1,2)和1次(2,1,3),这些排列的概率分别为:

(1) P(1,2,3) = 2/5

(2) P(2,3,1) = 2/5

(3) P(2,1,3) = 1/5

5. 计算信息熵,得到H(3)= 0.4*log2(2.5)+0.4*log2(2.5)+0.2*log2(5)=1.5219

 2 数据准备

create table permutation_entropy as
    (select stack(
                    7,
                    1, '2',
                    2, '4',
                    3, '5',
                    4, '6',
                    5, '3',
                    6, '7',
                    7, '1'
            ) as (id, data));

3 问题分析

 第一步:计算m=3,t=1时分割的数据块

select id,
       data,
       data_block
from (select id,
             data,
             collect_list(data) over (order by id rows between current row and 2 following) data_block
      from permutation_entropy) t
where size(data_block) >= 3

第二步:计算 块中从小到大排序后的索引

select id,
       data_block,
       pos + 1  pos,
       tmp.data data,
       row_number() over (partition by data_block order by tmp.data) rn
from (select id,
             data,
             data_block
      from (select id,
                   data,
                   collect_list(data) over (order by id rows between current row and 2 following) data_block
            from permutation_entropy) t
      where size(data_block) >= 3) data_block
         lateral view posexplode(data_block) tmp as pos, data

 

其中POS字段即为返回的索引值。

返回索引数组SQL如下:

select id,
                    data_block,
                    collect_list(pos) pos_arr

             from (select id,
                          data_block,
                          pos + 1                                                       pos,
                          tmp.data                                                      data,
                          row_number() over (partition by data_block order by tmp.data) rn
                   from (select id,
                                data,
                                data_block
                         from (select id,
                                      data,
                                      collect_list(data)
                                                   over (order by id rows between current row and 2 following) data_block
                               from permutation_entropy) t
                         where size(data_block) >= 3) data_block
                            lateral view posexplode(data_block) tmp as pos, data) t
             group by id, data_block

 

 第三步:计算分块排列后的概率

with pos as (select id,
                    data_block,
                    collect_list(pos) pos_arr

             from (select id,
                          data_block,
                          pos + 1                                                       pos,
                          tmp.data                                                      data,
                          row_number() over (partition by data_block order by tmp.data) rn
                   from (
                   select id,
                                data,
                                data_block
                         from (select id,
                                      data,
                                      collect_list(data)
                                                   over (order by id rows between current row and 2 following) data_block
                               from permutation_entropy) t
                         where size(data_block) >= 3
                         ) data_block
                            lateral view posexplode(data_block) tmp as pos, data) t
             group by id, data_block
             )
select pos_arr
     , count(1) data_block_cnt
     , max(ttl_cnt) ttl_cnt
     , cast(count(1) / nullif(max(ttl_cnt),0) as decimal(18,4))  p
from
    (select id,
            data_block,
            pos_arr,
            count(1) over () ttl_cnt
     from pos
    ) t
group by  pos_arr

第四步:按照熵的公式计算最终结果

with pos as (select id,
                    data_block,
                    collect_list(pos) pos_arr

             from (select id,
                          data_block,
                          pos + 1                                                       pos,
                          tmp.data                                                      data,
                          row_number() over (partition by data_block order by tmp.data) rn
                   from (
                   select id,
                                data,
                                data_block
                         from (select id,
                                      data,
                                      collect_list(data)
                                                   over (order by id rows between current row and 2 following) data_block
                               from permutation_entropy) t
                         where size(data_block) >= 3
                         ) data_block
                            lateral view posexplode(data_block) tmp as pos, data) t
             group by id, data_block
             )
select
       cast(-sum(p*log2(p)) as decimal(18, 4)) permutation_entropy
from
    (select pos_arr
          , count(1)                                                   data_block_cnt
          , max(ttl_cnt)                                               ttl_cnt
          , cast(count(1) / nullif(max(ttl_cnt), 0) as decimal(18, 4)) p
     from (select id,
                  data_block,
                  pos_arr,
                  count(1) over () ttl_cnt
           from pos) t
     group by pos_arr) t

第六步:计算归一化结果.

为了将熵值的范围调整到 0 到 1 的范围内,进行数据归一化

with pos as (select id,
                    data_block,
                    collect_list(pos) pos_arr

             from (select id,
                          data_block,
                          pos + 1                                                       pos,
                          tmp.data                                                      data,
                          row_number() over (partition by data_block order by tmp.data) rn
                   from (
                   select id,
                                data,
                                data_block
                         from (select id,
                                      data,
                                      collect_list(data)
                                                   over (order by id rows between current row and 2 following) data_block
                               from permutation_entropy) t
                         where size(data_block) >= 3
                         ) data_block
                            lateral view posexplode(data_block) tmp as pos, data) t
             group by id, data_block
             )
select permutation_entropy
     , cast( permutation_entropy / log2(3*2*1) as  decimal(18, 4)) normal_permutation_entropy
from
    (select cast(-sum(p * log2(p)) as decimal(18, 4)) permutation_entropy
     from (select pos_arr
                , count(1)                                                   data_block_cnt
                , max(ttl_cnt)                                               ttl_cnt
                , cast(count(1) / nullif(max(ttl_cnt), 0) as decimal(18, 4)) p
           from (select id,
                        data_block,
                        pos_arr,
                        count(1) over () ttl_cnt
                 from pos) t
           group by pos_arr) t) t

 

4 小结

本文利用SQL语言实现了时间序列分析时常用的特征排列熵。排列熵只能反映当前一维时间序列的复杂度。考虑到外界温度、天气等因素的影响,信号也可能会突变,产生噪声,因此需要排除噪声的干扰。排列熵作为衡量时间序列复杂程度的指标,越规则的时间序列,它对应的排列熵越小;越复杂的时间序列,它对应的排列熵越大。但是这样的结果是建立在合适的 m 的选择的基础上的,如果 m 的选取很小,如1或者2的话,那么它的排列空间就会很小(1!、2!)。由排列熵的计算过程看出,排列熵的值与嵌入维数m、延迟时间t及数据长度N有关。文献研究表明,嵌入维数m为4~8时,对传感器不同状态下的信号区分度良好。实际上,当嵌入维数m<4时,排列熵无法准确地检测出传感器信号中的动态变化,而当m>8时,不仅会使排列熵的计算量增大,而且会使排列熵的变化范围变窄而难于准确地衡量信号复杂度。延迟时间t的取值对排列熵的影响不大。但是,当t>5时,排列熵不能准确地检测传感器信号中的微小变化。数据长度N也是影响排列熵计算结果的重要参数,N值过大时会把信号平滑,不能准确地衡量信号的动态变化。N值也不能太小,否则,计算结果将失去统计意义。 

参考文献:

刘永斌.基于非线性信号分析的滚动轴承状态监测诊断研究[D].合肥:中国科学技术大学,2011. 

Christoph B, Bernd P.Permutation entropy: a natural complexity measure for time series [J].Physical Review Letters, 2002, 88(17):174102. 

如果您觉得本文还不错,对你有帮助,那么不妨可以关注一下我的数字化建设实践之路专栏,这里的内容会更精彩。

专栏 原价99,现在活动价59.9,按照阶梯式增长,还差5个人上升到69.9,最终恢复到原价

专栏优势:
(1)一次收费持续更新。

(2)实战中总结的SQL技巧,帮助SQLBOY 在SQL语言上有质的飞越,无论你应对业务难题及面试都会游刃有余【全网唯一讲SQL实战技巧,方法独特】

SQL很简单,可你却写不好?每天一点点,收获不止一点点-CSDN博客

(3)实战中数仓建模技巧总结,让你认识不一样的数仓。【数据建模+业务建模,不一样的认知体系】(如果只懂数据建模而不懂业务建模,数仓体系认知是不全面的)

(4)数字化建设当中遇到难题解决思路及问题思考。

我的专栏具体链接如下:

 数字化建设通关指南_莫叫石榴姐的博客-CSDN博客 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2243561.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CSS(8):盒子阴影与文字阴影

一&#xff1a;盒子阴影text-shadow属性 1.box-shadow&#xff1a;h-shadow v-shadow blur spread color inset; 默认的是外部阴影outset&#xff0c;不能写在代码上 2.鼠标经过盒子后的阴影 rgba透明度 3.文字阴影 text-shadow:水平偏移 垂直偏移 模糊度 阴影颜色; 注意点…

《Python编程实训快速上手》第七天--文件与文件路径

该章节将使用Python在硬盘上创建、读取和保存文件 一、文件与文件路径 1、Windows中使用\以及macOS和Linux中使用/ 使用pathlib模块中的Path()函数进行文件名和目录的拼接,返回文件路径字符串 from pathlib import Path print(Path("spam","bacon",&qu…

Springboot如何打包部署服务器

文章目的&#xff1a;java项目打包成jar包或war包&#xff0c; 放在服务器上去运行 一、编写打包配置 1. pom.xml 在项目中的pom.xml文件里面修改<build>...</build>的代码 >> 简单打包成Jar形式&#xff0c;参考示例&#xff1a; <build><fina…

Video Duplicate Finder 快速识别并去除重复的视频和图像!

文章目录 下载 后续升级 Video Duplicate Finder&#xff08;视频重复查找器&#xff09;是一款开源的跨平台视频&#xff08;以及图像&#xff09;去重软件&#xff0c;通过对比文件内容和特征&#xff0c;快速识别出重复的视频和图像文件&#xff0c;即使是被压缩裁剪过、…

Python实现基础到高级:语音验证码技术详解

目录 一、语音验证码基础 1.1 语音验证码概述 1.2 Python语音验证码库 二、Python生成语音验证码 2.1 使用captcha库生成语音验证码 2.2 使用第三方语音合成服务API生成语音验证码 三、Python识别语音验证码 3.1 语音识别技术概述 3.2 使用百度语音识别API识别语音验证…

(附项目源码)Java开发语言,215 springboot 大学生爱心互助代购网站,计算机毕设程序开发+文案(LW+PPT)

摘 要 在网络信息的时代&#xff0c;众多的软件被开发出来&#xff0c;给用户带来了很大的选择余地&#xff0c;而且人们越来越追求更个性的需求。在这种时代背景下&#xff0c;企业只能以用户为导向&#xff0c;按品种分类规划&#xff0c;以产品的持续创新作为企业最重要的竞…

后端:Spring AOP原理--动态代理

文章目录 1. Spring AOP底层原理2. 代理模式3. 静态代理4. 动态代理4.1 jdk 实现动态代理4.2 cglib 实现动态代理4.3 jdk、cglib动态代理两者的区别 1. Spring AOP底层原理 创建容器 new applicationContext()&#xff1b;Spring把所有的Bean进行创建&#xff0c;进行依赖注入…

halcon3D gen_image_to_world_plane_map的图像高精度拼接技术

基于上一篇文章&#xff0c;对gen_image_to_world_plane_map有了深刻的理解 https://blog.csdn.net/Tianwen_running/article/details/143661157?fromshareblogdetail&sharetypeblogdetail&sharerId143661157&sharereferPC&sharesourceTianwen_running&s…

STM32 独立看门狗(IWDG)详解

目录 一、引言 二、独立看门狗的作用 三、独立看门狗的工作原理 1.时钟源 2.计数器 3.喂狗操作 4.超时时间计算 5.复位机制 四、独立看门狗相关寄存器 1.键寄存器&#xff08;IWDG_KR&#xff09; 2.预分频寄存器&#xff08;IWDG_PR&#xff09; 3.重载寄存器&…

《探索 Spring 核心容器:Bean 的奇妙世界》

一、Spring 核心容器与 Bean 的关系 Spring 核心容器是 Spring 框架的重要组成部分&#xff0c;负责管理和组织应用程序中的对象&#xff0c;而 Bean 则是构成应用程序主干并由 Spring IoC 容器管理的对象&#xff0c;二者紧密相连。 Spring 的核心容器由多个模块组成&#xf…

JFlash添加自定义MCU型号

1.打开安装路径 2.在Devices里创建你想添加的MCU的文件夹并把FLM文件放入 3.Jlink目录里找到JLinkDevices.xml文件 4.修改 <!-- --><!-- G32 --><!-- --><!-- --><!-- G32F103 --><!-- --><Device><ChipIn…

Linux中系统的延迟任务及定时任务

一、延时任务 at 命令&#xff0c;即用即消 如 at 11&#xff1a;30 rm -rf /mnt/* ctrld运行 &#xff08;过一秒即可执行&#xff09; -v 使用较明显的时间格式&#xff0c;列出at调度中的任务列表 -l 可列出目前系统上面的所有该用户的at调度 -c 可以列出后面接…

通过shell脚本分析部署nginx网络服务

通过shell脚本分析部署nginx网络服务 1.接收用户部署的服务名称 [rootlocalhost xzy]# vim 1.sh [rootlocalhost xzy]# chmod x 1.sh [rootlocalhost xzy]# ./1.sh2.判断服务是否安装 已安装&#xff1b;自定义网站配置路径为/www&#xff1b;并创建共享目录和网页文件&…

使用PSpice进行第一个电路的仿真

1、单击【开始】菜单&#xff0c;选择【OrCAD Capture CIS Lite】。 2、单击【File】>【New】>【Project】。 3、①填入Name下面的文本框&#xff08;提示&#xff1a;项目名称不要出现汉字&#xff09;&#xff1b; ②选择【Analog or Mixed A/D】&#xff1b; ③单击【…

CentOS网络配置

上一篇文章&#xff1a;VMware Workstation安装Centos系统 在CentOS系统中进行网络配置是确保系统能够顺畅接入网络的重要步骤。本文将详细介绍如何配置静态IP地址、网关、DNS等关键网络参数&#xff0c;以帮助需要的人快速掌握CentOS网络配置的基本方法和技巧。通过遵循本文的…

【unity小技巧】unity最全的性能优化方案分享以及如何进行性能测试(2024/11/11更新)

文章目录 前言一、性能分析软件1、Draw Call什么是Draw Call如何查看Draw Call数量 2、分析帧调试器3、Statistics统计面板 二、优化手段1、关于图集、材质、层级的处理&#xff0c;减少DrawCall2、批处理3、音乐处理4、减少沉余资源和重复资源5、渲染优化&#xff08;GPU&…

[STM32]从零开始的STM32 HAL库环境搭建

一、前言 之前在搭建STM32的标准库环境时就告诉过大家&#xff0c;开发STM32的方式主要有三种。一种是最原始但是效率最高的寄存器开发&#xff0c;另一种是效率仅次于寄存器难度相对较低的标准库开发&#xff0c;最后一种是最为简单但是程序效率最低的HAL库开发。如果对于初学…

阅读2020-2023年《国外军用无人机装备技术发展综述》笔记_技术趋势

目录 文献基本信息 序言 1 发展概况 2 重点技术发展 2.1 人工智能技术 2.1.1 应用深化 2.1.2 作战效能提升 2.2 航空技术 2.2.1螺旋桨设计创新 2.2.2 发射回收技术进步 2.3 其他相关技术 2.3.1 远程控制技术探 2.3.2 云地控制平台应用 3 装备系统进展 3.1 无人作…

python爬虫(二)爬取国家博物馆的信息

import requests from bs4 import BeautifulSoup# 起始网址 url https://www.chnmuseum.cn/zx/xingnew/index_1.shtml # 用于存储所有数据 all_data [] page 1 global_index 1 # 定义全局序号变量并初始化为1 while True:html_url requests.get(url).textif requests.get…

FPGA 第6讲 简单组合逻辑多路选择器

时间&#xff1a;2024.11.11-11.14 一、学习内容 1.组合逻辑 组合逻辑是VerilgHDL设计中一个重要组成部分。从电路本质上讲&#xff0c;组合逻辑电路的特点是输出信号只是当前时刻输入信号的函数&#xff0c;与其他时刻的输入状态无关&#xff0c;无存储电路&#xff0c;也没…