You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 09:09:00