4. 基编码与计算基嵌入

在量子特征映射的诸多方案中,基编码(basis encoding)是最直接、也最容易被低估的一种。它的核心思想只有一句话:把离散类别或整数数据直接映射为计算基态的下标。一个 n 量子比特的寄存器共有 2n 个计算基态 |0…0⟩ 到 |1…1⟩,基编码就是让数据值决定"落在哪一个基态上",而不是让数据值决定振幅或相位。

理解基编码的关键在于区分"下标"与"内容"。在基编码中,信息完全承载在基态的编号里,振幅是确定的(目标基态振幅为 1,其余为 0),相位没有额外含义。这与振幅编码把数据摊到 2n 个振幅上、角度编码把数据放进旋转角里形成鲜明对比。正因为信息在"下标"上,基编码天然适合表达离散、无序、类别型的对象,而不适合表达连续实值。

比特数需求:从类别数到寄存器宽度

基编码的第一个工程决策是确定寄存器宽度 n。若待编码的离散取值共有 K 个(K 个类别,或整数范围 0 到 K−1),则需要满足 2n ≥ K 的最小整数 n,即 n = ⌈log₂K⌉。例如 4 个类别只需 2 个量子比特(|00⟩、|01⟩、|10⟩、|11⟩),8 个类别需要 3 个量子比特,而 10 个类别同样需要 4 个量子比特——因为 2³=8 不够,必须进位到 2⁴=16。这里有一个常被忽视的细节:当 K 不是 2 的幂时,会有一部分基态(如 10 类别时的 |1010⟩ 到 |1111⟩)成为"空位",它们不对应任何合法类别,需要在后续处理中显式排除或屏蔽。

下表给出几个典型规模下的比特数需求,可作为设计时的速查参考(数值为按公式计算的理论值):

离散取值数 K所需量子比特 n可用基态数 2n空位数
2(二分类)120
4240
8380
104166
100712828

可以看到,基编码的比特需求随类别数呈对数增长,这是它相对 one-hot 经典编码的巨大优势:100 个类别在经典 one-hot 下需要 100 维向量,而在基编码下只需 7 个量子比特。但也要清醒认识到,对数增长换来的是"每个基态只承载一个样本"——若要把 N 个样本同时编码,通常需要 N 个寄存器或 N 次态制备,这一点在批量数据处理时必须纳入考量。

数据预处理:把原始标签变成合法下标

基编码对输入数据有明确要求,预处理环节不可跳过。第一步是类别到整数的映射:为每个类别分配一个唯一整数标签 0, 1, …, K−1,映射表必须固定并记录,保证训练与推理阶段一致。第二步是整数到二进制的转换:把整数标签写成 n 位二进制串,位序约定必须显式声明。例如约定"最高位对应第 n−1 号量子比特",则类别 5 在 3 比特下写作 101,对应 |q₂q₁q₀⟩ = |101⟩。第三步是合法性检查:确认所有标签都落在 [0, K−1] 内,且二进制串长度恰为 n,避免因位宽不足导致截断。

下面是一段可直接参考的预处理示例(Python 伪代码,参数为示例设定):

import math

# 示例:10 个类别的标签映射与基编码
categories = ["cat", "dog", "bird", "fish", "horse",
              "cow", "sheep", "goat", "rabbit", "duck"]
label_map = {c: i for i, c in enumerate(categories)}   # 类别 -> 整数
K = len(categories)
n = math.ceil(math.log2(K))                            # n = 4

def to_basis_string(label):
    idx = label_map[label]
    assert 0 <= idx < K, "标签越界"
    return format(idx, f"0{n}b")                       # 固定 n 位,高位补零

print(to_basis_string("duck"))   # 输出 '1001',对应 |1001>
print(to_basis_string("cat"))    # 输出 '0000',对应 |0000>

这段代码体现了三个要点:位宽由 K 反推、二进制串固定长度补零、越界断言。实际工程中还应把 label_map 序列化保存,否则一旦类别顺序变动,同一个基态就会指向不同语义,造成难以排查的标签错位。

态制备:从二进制串到计算基态

得到二进制串后,态制备的任务是把寄存器从默认的 |0…0⟩ 翻转到目标基态。最直接的做法是对每一位为 1 的量子比特施加 Pauli-X 门。例如目标为 |1001⟩,则对第 3 位和第 0 位各施加一次 X 门,其余位保持不动。由于计算基态是 X 门的本征态,这一操作是确定性的,不需要测量、不引入概率,也不产生纠缠——这正是基编码"干净"的地方。

下图展示了本节的核心结构:从离散类别出发,经整数映射与二进制展开,最终落到计算基态下标上,并标出了比特数需求与空位的关系。

离散类别 cat dog bird … duck K = 10 映射 整数标签 0 1 2 … 9 0 … K−1 二进制 n 位二进制 0000 0001 0010 … 1001 n = ⌈log₂K⌉ = 4 X 门 计算基态 |0000⟩ |0001⟩ |0010⟩ … |1001⟩ 振幅为 1,其余为 0 |1010⟩–|1111⟩ 为空位:不对应合法类别,需屏蔽

典型分类任务中的直接应用

基编码在分类任务中最自然的用法,是作为标签寄存器与特征寄存器配合。以二分类为例,标签只需 1 个量子比特:类别 A 编码为 |0⟩,类别 B 编码为 |1⟩。在变分分类器或量子核方法中,标签寄存器常被用作受控操作的控制器,或用于构造监督态的叠加。多分类时,标签寄存器扩展到 n 位,每个基态对应一个类别,分类器的输出测量就变成"读出哪个基态的概率最大"。

一个具体的教学示例:假设有 4 个类别的鸢尾花简化任务,标签寄存器取 2 比特,映射为 setosa→|00⟩、versicolor→|01⟩、virginica→|10⟩、第四类→|11⟩。训练时,对每个样本制备"特征态 ⊗ 标签基态",标签部分通过 X 门确定性制备;推理时只测量标签寄存器,统计 2 比特的测量分布,取概率最高的基态作为预测类别。这里需要强调:基编码的标签是确定性的,不携带叠加信息,因此它不会像振幅编码那样在标签上引入额外的概率幅干扰,读出的分布形状直接反映分类器的不确定性。

另一个常见场景是索引编码:在量子数据库或量子随机存取结构中,把样本编号 i 编码为 |i⟩,作为地址寄存器去索引第 i 个数据项。此时比特数需求同样由样本总数决定,预处理只需保证编号连续且从 0 开始。这类应用对位序约定尤其敏感,地址位与数据位的对应关系一旦错位,取出的就是错误样本。

基编码的优点是态制备简单、无纠缠、可解释性强;代价是每个基态只表示一个离散值,无法直接表达连续特征。实践中常把连续特征交给振幅编码或角度编码,把类别标签交给基编码,形成"混合编码"结构。
两个高频错误:其一,位序约定不统一,导致同一二进制串在不同模块中被解释为不同下标;其二,K 非 2 的幂时忘记处理空位,使分类器可能输出非法类别。建议在预处理阶段就把 label_map、位序、空位屏蔽规则写成配置并做单元测试。

总结来看,基编码把"离散类别或整数"这一最朴素的数据形态,用最少的量子比特、最确定的态制备方式嵌入到计算基中。掌握比特数反推、标签映射固定、位序显式声明、空位显式屏蔽这四个环节,就能在分类任务的标签寄存器、索引寄存器等位置稳定地使用它,并为后续与振幅编码、角度编码的组合打下基础。