这是一种用几行代码来了解您的时间序列有多复杂的方法
每个数据科学家都知道:解决机器学习问题的第一步是对数据进行探索。
这不仅仅是了解哪些特征可以帮助您解决问题。这实际上需要领域知识、大量的努力、大量的询问和尝试来找出。这是必要的一步,但在我看来,是第二步。
第一步在某种程度上是基于对数据的复杂性分析。它们是否要求您在几乎相同的东西中找到细微的细节和模式,还是输出彼此完全不同?它们是否希望您找到0.0001和0.0002之间的距离,还是希望您找到0和10之间的距离?
让我更好地解释一下。
例如,我是一个信号处理专家。我研究了傅里叶变换、Chirplet变换、小波变换、希尔伯特变换、时间序列预测、时间序列聚类、1D CNN、RNN和许多其他令人生畏的名称。
时间序列领域中一个非常常见的问题是从输入(可能确实是另一个时间序列)到时间序列输出的转换。例如:
- 您有一个实验装置的属性,并希望使用机器学习来模拟您的实验:这实际上是我的博士论文,被称为代理建模
- 您拥有截至第300天的股市价值,并希望预测第301天:这是非常著名的,被称为时间序列预测
- 您拥有一个非常嘈杂或有噪声的信号,并希望清除它:这被称为编码器-解码器信号去噪,也是非常著名的。
在这些问题中,我看的第一件事,令人惊讶的是输出(而不是输入)时间序列。
假设我在我的数据集中随机选择一个时间序列。这个时间序列是正弦和余弦的轻柔组合吗?它是一个多项式函数吗?它是一个对数函数吗?它是一个我甚至不能命名的函数吗?
如果我再选择另一个随机时间序列,它如何变化?任务是基于从明显的基线上观察到的小变化,还是任务是识别整个数据集中完全不同的行为?
简而言之,我们试图了解我们的任务有多复杂:我们正在估计我们的时间序列的复杂性。现在,“复杂”这个词对于每个人可能意味着不同的东西。
当我妻子给我看她的解剖学课程时,我觉得它们非常复杂,但对她来说,这只是另一个星期二 🙂
好消息是,有一种更科学和独特地描述复杂性的方法:熵的概念
1. 1/0时间序列的熵(理论)
让我们从一个非常简单的例子开始定义熵:一个只能取值为1和0的时间序列。我知道这不是我们习惯处理的时间序列类型,但您可以想象一下,每分钟您进入房间时都会掷硬币:如果正面,您测量到1,如果反面,您测量到0(或相反,老实说,我对1是正面没有特别的偏好…)
现在,如果你考虑一下,当你不完全理解它或者它并没有提供大量信息时,一些东西就更加“复杂”了。
我不再戏弄你,我将给你这个该死的熵的方程:
我们来拆解一下:
- X是我们时间序列的定义域,在我们的例子中X = {0,1}
- p(x)是验证X中的值x的概率
为什么方程中有一个对数?它代表什么意思?为什么有那个负号?
我们通过例子来学习。
假设X为0(尾巴)的概率为0,X为1(头)的概率为1。这实际上甚至不是一个真正的时间序列,因为它始终为1。熵的值是多少?
现在,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(头或尾)的概率完全相同
这明显更加复杂,不是吗?现在熵变成了:
这个值本身没有意义,但它是最大值。这意味着如果你改变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,我们还将使用非常基本的库:
让我们写代码找到相同的解决方案,但是使用“回溯地”计算概率,或者如果你愿意,使用它们的频率定义:
其中:
- x是域中的一个值:在我们的情况下,我们只有0和1,所以x要么是0要么是1
- n(x)是我们的时间序列中x出现的次数
- N是我们时间序列的长度
我们将找到p(x=0)和p(x=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. 成为一个推荐的会员,这样你就不会有“每月最多故事数量”的限制,你可以阅读我(以及成千上万的其他机器学习和数据科学顶级作者)关于最新技术的所有写作。