Press "Enter" to skip to content

使用熵进行时间序列复杂性分析

这是一种用几行代码来了解您的时间序列有多复杂的方法

作者生成的图片,使用Midjourney

每个数据科学家都知道:解决机器学习问题的第一步是对数据进行探索。

这不仅仅是了解哪些特征可以帮助您解决问题。这实际上需要领域知识、大量的努力、大量的询问和尝试来找出。这是必要的一步,但在我看来,是第二步。

第一步在某种程度上是基于对数据的复杂性分析。它们是否要求您在几乎相同的东西中找到细微的细节和模式,还是输出彼此完全不同?它们是否希望您找到0.0001和0.0002之间的距离,还是希望您找到0和10之间的距离?

让我更好地解释一下。

例如,我是一个信号处理专家。我研究了傅里叶变换、Chirplet变换、小波变换、希尔伯特变换、时间序列预测、时间序列聚类、1D CNN、RNN和许多其他令人生畏的名称。

时间序列领域中一个非常常见的问题是从输入(可能确实是另一个时间序列)到时间序列输出的转换。例如:

  • 您有一个实验装置的属性,并希望使用机器学习来模拟您的实验:这实际上是我的博士论文,被称为代理建模
  • 您拥有截至第300天的股市价值,并希望预测第301天:这是非常著名的,被称为时间序列预测
  • 您拥有一个非常嘈杂或有噪声的信号,并希望清除它:这被称为编码器-解码器信号去噪,也是非常著名的。

在这些问题中,我看的第一件事,令人惊讶的是输出(而不是输入)时间序列

假设我在我的数据集中随机选择一个时间序列。这个时间序列是正弦和余弦的轻柔组合吗?它是一个多项式函数吗?它是一个对数函数吗?它是一个我甚至不能命名的函数吗?

如果我再选择另一个随机时间序列,它如何变化?任务是基于从明显的基线上观察到的小变化,还是任务是识别整个数据集中完全不同的行为?

简而言之,我们试图了解我们的任务有多复杂:我们正在估计我们的时间序列的复杂性。现在,“复杂”这个词对于每个人可能意味着不同的东西。

当我妻子给我看她的解剖学课程时,我觉得它们非常复杂,但对她来说,这只是另一个星期二 🙂

好消息是,有一种更科学和独特地描述复杂性的方法:熵的概念

1. 1/0时间序列的熵(理论)

让我们从一个非常简单的例子开始定义熵:一个只能取值为1和0的时间序列。我知道这不是我们习惯处理的时间序列类型,但您可以想象一下,每分钟您进入房间时都会掷硬币:如果正面,您测量到1,如果反面,您测量到0(或相反,老实说,我对1是正面没有特别的偏好…)

作者制作的图片

现在,如果你考虑一下,当你不完全理解它或者它并没有提供大量信息时,一些东西就更加“复杂”了。

我不再戏弄你,我将给你这个该死的的方程:

方程1

我们来拆解一下:

  • X是我们时间序列的定义域,在我们的例子中X = {0,1}
  • p(x)是验证X中的值x的概率

为什么方程中有一个对数?它代表什么意思?为什么有那个负号?

我们通过例子来学习。

假设X为0(尾巴)的概率为0,X为1(头)的概率为1。这实际上甚至不是一个真正的时间序列,因为它始终为1。熵的值是多少?

使用熵进行时间序列复杂性分析 四海 第4张

现在,p(x=0)=0,所以第一项为0。p(x=1)=1,但是1的对数是0。这意味着第二项也为0,因此熵的值确实是0。

熵为0意味着什么?时间序列一点复杂性都没有,这是有道理的,因为它看起来像这样:

作者提供的图片

这个时间序列中没有“复杂性”,对吧?这就是为什么它的熵为0。

让我们以相同的例子来看看,如果我们知道p(x=0)=p(x=1)=0.5,也就是说出现1和0(头或尾)的概率完全相同

作者提供的图片

这明显更加复杂,不是吗?现在熵变成了:

使用熵进行时间序列复杂性分析 四海 第7张

这个值本身没有意义,但它是最大值。这意味着如果你改变p(x=0)与0.5不同,熵会变小*。

作者提供的图片

* 注意当你改变p(x=0)时,你也会改变p(x=1),因为p(x=1)=1-p(x=0)

现在让我们思考一下我们的发现。

  • 当概率为0时,这意味着没有复杂性,因为我们已经了解一切:你只有一个值。
  • 当概率为0.0001时,这意味着复杂性非常小,因为x可能为0,但大部分时间x等于1
  • 当概率为0.5时,现在复杂性达到最大值,因为你真的不知道接下来会发生什么:它可能是1,也可能是0,概率相同

这就是对我们来说“复杂”的概念。以简单的1/0方式,你可以根据出现的次数追溯地找到概率,并获取熵。

2. 1/0时间序列的熵(实践)

在我们的代码中,我们将使用Python,我们还将使用非常基本的库:

让我们写代码找到相同的解决方案,但是使用“回溯地”计算概率,或者如果你愿意,使用它们的频率定义:

使用熵进行时间序列复杂性分析 四海 第9张

其中:

  • x是域中的一个值:在我们的情况下,我们只有0和1,所以x要么是0要么是1
  • n(x)是我们的时间序列中x出现的次数
  • N是我们时间序列的长度

我们将找到p(x=0)和p(x=1),然后使用上述方程1……好的,我会重新贴给你看:

方程1

Python中,你可以使用以下非常简单的代码完成:

它有效吗?我们来测试一下!

让我们生成一个长度为100的时间序列,其中0的概率为0.5:

很好。所以我们有一个平衡的时间序列。将0.5设置为概率并不意味着恰好是50和50,正如你所看到的,这会在估计概率时给我们一些误差。这就是我们生活在的不完美世界 🙂

计算理论熵的方程如下:

让我们看看理论熵和实际熵是否匹配:

太棒了!它们匹配!

现在让我们改变p_0,看看它们是否仍然匹配:

它们以非常小的误差匹配,对吧?有趣的是,如果我们三次增加时间序列的大小,误差会越来越小:

在大小为10k之后,实际和预测的熵基本上没有差异 ❤

3. 任意时间序列的熵

现在,如果我们仍然假设我们的时间序列具有离散值(0,1,2,…),我们可以将熵的定义扩展到不仅仅是时间序列的2个值。

例如,让我们选择一个三值情况。所以我们的时间序列可以是0,1或2。

让我们创建一个新的概率向量p_0,p_1和p_2。为此,我们将生成3个介于0和100之间的随机数,并将它们存储在一个向量中,然后除以总和:

我们可以应用与之前相同的方程(和相同的代码)来找到实际和预测的熵。

让我们扩展实际熵的定义:

这也适用于仅为0/1的情况:

正如我们所看到的,理论和预测的熵即使对于三值情况也是匹配的:

为了向你展示我没有作弊,我们可以看到它适用于各种情况。如果我们迭代地更改p_vector(和时间序列),我们仍然可以看到实际和预测的熵匹配:

4. 结果

在这篇博客文章中,我们:

  • 在应用任何机器学习之前,反思了对时间序列复杂性的分析
  • 思考了时间序列的无序性
  • 定义了的数学方程,并通过示例进行了解释
  • 在实践中应用了它,既对于0/1时间序列,也对于0,1,2时间序列,展示了理论定义与我们的计算近似的匹配

现在,这种方法的问题(限制)是有时时间序列可能对这种方法过于连续而无法工作。但不要惊慌!有一种连续熵的定义可以修复时间序列的熵。

我将在下一篇博文中讨论这个问题!

5. 结论

如果你喜欢这篇文章并且想了解更多关于机器学习的知识,或者你只是想问我一些问题,你可以:

A. 在Linkedin上关注我,我会在那里发布所有我的故事B. 订阅我的新闻简报。它会让你了解新故事,并给你机会发信息给我以获得所有的更正或疑问。C. 成为一个推荐的会员,这样你就不会有“每月最多故事数量”的限制,你可以阅读我(以及成千上万的其他机器学习和数据科学顶级作者)关于最新技术的所有写作。

Leave a Reply

Your email address will not be published. Required fields are marked *