Qiskit的VQC中如何实现含复数特征的自定义特征映射
Qiskit VQC兼容复数特征的解决方案
首先明确:ParameterVector 本身仅支持绑定实数值参数,这是Qiskit电路的底层设计,所有量子门的控制参数(旋转角、振幅系数关联量等)默认都要求实型输入。要在VQC流程中使用复数特征,可以采用以下几种兼容方案:
方案1:复数特征实部虚部分拆法
这是最通用的兼容方案,无需修改VQC底层逻辑,仅需在特征预处理和特征映射阶段做适配:
- 预处理阶段:将每个复数特征拆分为实部、虚部两个独立的实数值,若有n个复数输入特征,最终生成2n个实值特征
- 构建ParameterVector时,将长度设置为2n,接收拆分后的全部实值参数
- 自定义特征映射内部,可以按需将对应位置的实部、虚部参数重新组合为复数使用
代码示例:
from qiskit.circuit import ParameterVector, QuantumCircuit from qiskit_machine_learning.algorithms import VQC # 设定输入为3个复数特征,拆分为6个实值参数 input_params = ParameterVector("x", 6) # 自定义特征映射 def complex_feature_map(params: ParameterVector) -> QuantumCircuit: qc = QuantumCircuit(3) # 按位置还原复数特征 z0 = params[0] + 1j * params[1] z1 = params[2] + 1j * params[3] z2 = params[4] + 1j * params[5] # 自定义复数特征的编码逻辑,比如振幅编码、相位编码等 norm = (abs(z0)**2 + abs(z1)**2 + abs(z2)**2 + abs(z0*z1)**2)**0.5 qc.initialize([z0/norm, z1/norm, z2/norm, z0*z1/norm], qc.qubits) return qc # 初始化VQC时,输入特征维度对应设置为6(原3个复数特征拆分后长度) vqc = VQC( feature_map=complex_feature_map(input_params), # 其余参数按需求配置 )
方案2:模-相位提取编码法
如果你的场景不需要保留复数的完整代数关系,可以提前将复数特征转换为模长、相位两个实值属性,直接作为电路参数使用:
- 对每个复数z,计算实值属性r = |z|(模长)、φ = np.angle(z)(相位)
- ParameterVector长度设为2n,直接接收上述实值属性,无需在特征映射中做复数运算
- 编码时可直接用r控制旋转门角度、φ控制相位门参数,计算效率更高,适合高维特征场景
代码示例:
def magnitude_phase_feature_map(params: ParameterVector) -> QuantumCircuit: qc = QuantumCircuit(3) for i in range(3): r = params[2*i] phi = params[2*i + 1] qc.ry(r * np.pi, i) qc.rz(phi, i) qc.barrier() # 可添加纠缠门 for i in range(2): qc.cx(i, i+1) return qc
注意事项
- 拆分后的实值特征总长度需和ParameterVector长度、VQC的输入维度严格对应
- 若使用振幅编码,需确保实部虚部重组后的复数列表满足归一化要求,即所有元素的模方和为1
- 所有传入量子门的参数最终必须为实数值,不可直接将复数类型变量绑定到电路参数
内容的提问来源于stack exchange,提问作者Isaac López
相关产品推荐
相关产品推荐

