什么是波动度(Turbulence),它如何衡量状态的波动性与不规则性?Turbulence 的中文是气体或者液体的湍流,根据维基百科:
湍流,在流体动力学中,是一种流体运动,其特征是压力和流速的无序变化。它与层流相对。 湍流十分常见,例如海浪、湍急的河流、滚滚的暴风云或烟囱冒出的烟雾,自然界中发生或工程应用中产生的大多数流体流动都是湍流。
在社会序列分析中,因为还没有一个统一的翻译方式,我们姑且将其翻译为波动指数。
熵衡量的是“你都用了哪些状态、各自多少次”,但波动指数则是更进一步,因为它还考虑了状态的顺序、切换频率和稀有程度。
你可以把它理解为:“这个人的生活状态变来变去,波动大不大?”
Turbulence 考虑的因素包括:#
- 状态种类是否多(越多越复杂)
- 状态变化是否频繁(越频繁越不稳定)
- 顺序结构是否有规律(越乱越复杂)
- 是否包含罕见状态(越罕见越增加波动度)
Turbulence 是如何一步步计算出来的?#
Turbulence 的完整算法比信息熵要复杂,这个概念的原始定义来自 Gabadinho et al. (2010),TraMineR 的作者们:
Gabadinho, A., Ritschard, G., Müller, N. S., & Studer, M. (2010).
Mining sequence data in R with the TraMineR package: A user’s guide.
在该文中,第 46 页明确解释:
The turbulence of a sequence is defined as: Turb(s) = D(s) × T(s)
其中:
- :状态多样性(Diversity) = 使用状态的数量 + 状态分布的均匀性
- :转移惩罚权重(Transition Weight) = 这个序列的切换模式有多不常见(依赖距离矩阵)
虽然 TraMineR 的完整实现依赖状态间的距离矩阵,我们可以从简化角度理解 Turbulence 是怎么逐步构造的:
步骤 1:计算 Diversity(多样性)#
类似 Entropy,但更加重视“用了多少种状态”:
diversity = (number_of_distinct_states)^2 / sequence_length
示例:
[Work, Work, Work, Retired, Retired]→ 2 种状态,长度 5→ diversity = (2^2) / 5 = 0.8
步骤 2:计算 Transition Weight(结构复杂度)#
这里就涉及“状态切换是否频繁”、“顺序是否稀有”:
- 创建该序列的状态转移向量,例如:
[Work → Work → Work → Retired → Retired] → [Work, Retired]
- 这个“转移路径”如果在全体样本中很常见,那结构复杂度低;
- 如果这条路径很少人出现过 → 给更高权重;
也就是说:稀有路径更“复杂”,从而导致 Turbulence 提高。
在 TraMineR 中,transition weight 是通过比较这个序列在全体中的“频率”来估计的。
步骤 3:Turbulence = Diversity × Weight#
turbulence = diversity × 1 / freq_rank
- freq_rank 是该序列的“排序”(出现次数越少,排名越高 → turbulence 越高)
这就引入了“群体罕见性”这个因素。
整体来说,我们来举一个直观的对比例子:
序列 A | Turbulence |
---|---|
[Work, Work, Work, Work] | 很低 |
[Work, Retired, Work, Retired] | 中等 |
[Unemployed, Military, Abroad, Student] | 很高(因为状态稀有+频繁切换) |
总结一句话:
Turbulence 是 Entropy 的“进阶版本”:
它不只看状态用了几种、是否平均,还看你状态变得快不快、罕不罕见、顺序混不混乱。越复杂、越稀有、越跳动的序列 → Turbulence 越高。
Turbulence 的实际 R 实现#
seqST()
是 TraMineR
包里的一个专门函数,其内部实现考虑了下面的这些信息:
- 状态数
- 状态出现分布
- 状态切换数
- 序列在所有序列中的频率排序
举个对比例子:#
假设你有两条序列:
序列 A(低波动):#
[Work, Work, Work, Work, Work, Work]
- 序列的所有时间段里面,只有一个状态,并且没有状态的切换
- 因此,熵 = 0,Turbulence = 0
序列 B(中波动):#
[Student, Work, Work, Retired, Retired, Retired]
- 状态切换了两次
- 出现了 3 种状态
- 因此,熵适中,Turbulence 有一定波动
序列 C(高波动):#
[Student, Retired, Student, Work, Retired, Work]
- 切换频繁(几乎每年换一个状态)
- 出现了 3 种状态,且顺序很混乱
- 熵可能和 B 差不多,但 Turbulence 会更高,因为熵只与状态出现次数有关,但波动指数对其他的维度比如顺序更敏感
熵 vs. Turbulence:对比总结#
特性 | Entropy | Turbulence |
---|---|---|
看状态种类 | ✅ | ✅ |
看比例是否平均 | ✅ | ✅ |
看状态顺序 | ❌ | ✅(考虑切换位置) |
看切换频率 | ❌ | ✅ (变得越频繁越复杂) |
看稀有状态 | ❌ | ✅ (稀有状态出现越多越高) |
代表的复杂度类型 | “静态的状态多样性” | “动态的状态波动和波动” |
小结:什么时候该用 Entropy vs. Turbulence?
- 想看“状态分布是否均衡” → 用 Entropy
- 想看“生活路径是否动荡、多变” → 用 Turbulence
- 想一次性看所有指标 → 用
seqstatd()
如果你是社会科学研究者,或者在建模用户行为序列、职业路径、疾病演化等问题时,这两个指标都非常有参考价值。这也是为什么,我们会有下面这样一个函数,来帮助我们计算一个涵盖了信息熵和波动指数的综合指标。
学习加餐:为什么 AI 领域,关心 Entropy,但对 Turbulence 的应用很少?#
Turbulence(波动度)不如熵的应用广泛,但在处理具有行为序列、时间序列或路径轨迹的数据时,会比较有用。一些可能的应用场景包括:
- 在推荐系统中,可以通过用户的“行为波动度”来判断其偏好是否稳定(稳定用户 vs. 探索型用户);
- 在序列聚类或异常检测中,高 Turbulence 的序列往往是异常轨迹或“噪声”;
- 在强化学习(RL)或动态建模中,它可以用来衡量 agent 行为的“稳定性”或“策略切换的复杂性”;
- 在医疗、教育等领域,Turbulence 也常被用于预测“轨迹不稳定→高风险”的个体。