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(二分类) | 1 | 2 | 0 |
| 4 | 2 | 4 | 0 |
| 8 | 3 | 8 | 0 |
| 10 | 4 | 16 | 6 |
| 100 | 7 | 128 | 28 |
可以看到,基编码的比特需求随类别数呈对数增长,这是它相对 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 门的本征态,这一操作是确定性的,不需要测量、不引入概率,也不产生纠缠——这正是基编码"干净"的地方。
下图展示了本节的核心结构:从离散类别出发,经整数映射与二进制展开,最终落到计算基态下标上,并标出了比特数需求与空位的关系。
典型分类任务中的直接应用
基编码在分类任务中最自然的用法,是作为标签寄存器与特征寄存器配合。以二分类为例,标签只需 1 个量子比特:类别 A 编码为 |0⟩,类别 B 编码为 |1⟩。在变分分类器或量子核方法中,标签寄存器常被用作受控操作的控制器,或用于构造监督态的叠加。多分类时,标签寄存器扩展到 n 位,每个基态对应一个类别,分类器的输出测量就变成"读出哪个基态的概率最大"。
一个具体的教学示例:假设有 4 个类别的鸢尾花简化任务,标签寄存器取 2 比特,映射为 setosa→|00⟩、versicolor→|01⟩、virginica→|10⟩、第四类→|11⟩。训练时,对每个样本制备"特征态 ⊗ 标签基态",标签部分通过 X 门确定性制备;推理时只测量标签寄存器,统计 2 比特的测量分布,取概率最高的基态作为预测类别。这里需要强调:基编码的标签是确定性的,不携带叠加信息,因此它不会像振幅编码那样在标签上引入额外的概率幅干扰,读出的分布形状直接反映分类器的不确定性。
另一个常见场景是索引编码:在量子数据库或量子随机存取结构中,把样本编号 i 编码为 |i⟩,作为地址寄存器去索引第 i 个数据项。此时比特数需求同样由样本总数决定,预处理只需保证编号连续且从 0 开始。这类应用对位序约定尤其敏感,地址位与数据位的对应关系一旦错位,取出的就是错误样本。
总结来看,基编码把"离散类别或整数"这一最朴素的数据形态,用最少的量子比特、最确定的态制备方式嵌入到计算基中。掌握比特数反推、标签映射固定、位序显式声明、空位显式屏蔽这四个环节,就能在分类任务的标签寄存器、索引寄存器等位置稳定地使用它,并为后续与振幅编码、角度编码的组合打下基础。