Lempel-Ziv complexity 详解
这其实是一个相对独立的知识点,介绍一下 Lempel-Ziv complexity 。这个概念最开始是在 On the Complexity of Finite Sequences (IEEE Trans. On IT-22,1 1976) 提出的。Lempel-Ziv complexity 可以用于衡量 0-1 序列或者文本序列的自身重复程度。
理论
首先我们假设 \(S\) 是一个 0-1 序列(读取顺序为从左往右),其 Lempel-Ziv complexity 记为 \(C(S)\)。
想象我们有一个在读取过程中从左到右移动的分隔符。在初始状态下这个分隔符在第一个元素和第二个元素中间,且确定该位置为第一个分隔符位置,记录为起始位置。然后我们定义前缀序列为分隔符之前的序列舍去最后一个元素,注意此时前缀序列为空。接下来尝试将分隔符向右移动一个元素,定义起始位置和当前位置之间的序列为当前序列。如果当前序列为前缀序列的一个子串,则继续将分隔符向右移动一个元素,直到条件不满足。当条件不满足时,再次将此时的分隔符位置记录为起始位置,如此循环。复杂度即为起始位置设置的次数
例子
说起来真是拗口,其实我在翻资料的时候也着实理解了半天。比如我们现在有一串序列 BAABBBBABBAAAABA
,需要计算它的 Lempel-Ziv complexity。我们用 |
表示记录的起始位置,用 ,
正在移动的分隔符。
步骤 | 序列 | 前缀 | 当前序列 | 备注 | |
---|---|---|---|---|---|
0 | B|AABBBBABBAAAABA | B | - | 初始状态 | |
1 | B|A,ABBBBABBAAAABA | B | A | 分隔符右移 | |
2 | B|A|ABBBBABBAAAABA | BA | - | 记录为起始位置 | |
3 | B|A|A,BBBBABBAAAABA | BA | A | 分隔符右移 | |
4 | B|A|AB,BBBABBAAAABA | BAA | AB | 分隔符右移 | |
5 | B|A|AB|BBBABBAAAABA | BAAB | - | 记录为起始位置 | |
6 | B|A|AB|B,BBABBAAAABA | BAAB | B | 分隔符右移 | |
7 | B|A|AB|BB,BABBAAAABA | BAABB | BB | 分隔符右移 | |
8 | B|A|AB|BBB,ABBAAAABA | BAABBB | BBB | 分隔符右移 | |
9 | B|A|AB|BBBA,BBAAAABA | BAABBBB | BBBA | 分隔符右移 | |
10 | B|A|AB|BBBA|BBAAAABA | BAABBBB | - | 记录为起始位置 | |
11 | B|A|AB|BBBA|B,BAAAABA | BAABBBBA | B | 分隔符右移 | |
12 | B|A|AB|BBBA|BB,AAAABA | BAABBBBAB | BB | 分隔符右移 | |
13 | B|A|AB|BBBA|BBA,AAABA | BAABBBBABB | BBA | 分隔符右移 | |
14 | B|A|AB|BBBA|BBAA,AABA | BAABBBBABBA | BBBA | 分隔符右移 | |
15 | B|A|AB|BBBA|BBAA|AABA | BAABBBBABBAA | - | 记录为起始位置 | |
16 | B|A|AB|BBBA|BBAA|A,ABA | BAABBBBABBAA | A | 分隔符右移 | |
17 | B|A|AB|BBBA|BBAA|AA,BA | BAABBBBABBAAA | AA | 分隔符右移 | |
18 | B|A|AB|BBBA|BBAA|AAB,A | BAABBBBABBAAAA | AAB | 分隔符右移 | |
19 | B|A|AB|BBBA|BBAA|AABA | BAABBBBABBAAAAB | AABA | 分隔符右移 |
这里特别注意,第 3 步到第 4 步前缀的变化。随着分隔符的移动,我们的前缀也在增长。
在 EEG 上的应用
首先我们的脑电数据是一个非平稳信号,要应用 Lempel-Ziv complexity 则需要先对它进行二值化。二值化的方法其实特别简单粗暴。对于一段脑波序列 \(X={x[0], x[1], x[2], ... , x[n]}\),按以下公式二值化。
\[ y[i]=\begin{cases} 1, & \text{if $ x[i] < m$} \\ 0, & \text{otherwise} \end{cases} \]