当前位置: 首页 > news >正文

量子机器学习实战:用变分量子电路对泰坦尼克数据集分类

1. 项目概述:当量子计算遇上经典分类难题

量子机器学习(QML)听起来像是科幻小说里的概念,但如果你像我一样,在经典机器学习领域摸爬滚打多年,再一头扎进量子计算的海洋,你会发现它更像是一场激动人心的“跨界实验”。这个领域的核心命题很直接:我们能否利用量子力学那些反直觉的特性——比如叠加和纠缠——来为传统的数据分析任务,比如分类,带来一些新的可能性?我最近就花了大量时间,亲手实践了这样一个“跨界实验”:用变分量子电路(VQC)来对经典的泰坦尼克数据集进行分类。

泰坦尼克数据集对于机器学习从业者来说,就像“Hello, World!”对于程序员一样经典。它包含了1309名乘客的信息,目标是根据乘客的性别、年龄、舱位等特征预测其是否幸存。这个数据集结构清晰,但存在缺失值和不平衡问题,是检验模型鲁棒性的绝佳试金石。我的目标不是要证明量子模型在现阶段能“碾压”经典模型,那既不现实也无意义。在当前的嘈杂中型量子(NISQ)时代,量子硬件还远未成熟。我的兴趣点在于,作为一个混合系统的一部分,一个设计得当的量子电路,能否在经典优化器的驱动下,学习到数据中有效的分类模式,并展现出与经典方法可比甚至独特的性能特质。

这次实践的核心工具是Qiskit,一个由IBM主导的开源量子计算框架。整个流程是典型的“混合量子-经典”范式:数据预处理和模型优化在经典计算机上完成,而将数据编码为量子态、通过参数化量子电路进行变换以及最终的量子测量,则在量子模拟器(或未来的真实量子设备)上执行。我重点对比了两种不同的量子特征编码方式——ZFeatureMap和ZZFeatureMap,并搭配了RealAmplitudes作为变分电路(或称ansatz),观察不同参数规模下的表现。最终,我还将表现最好的量子模型与经典的线性支持向量机(SVC)进行了一场“公平”对决。整个过程充满了对参数、噪声、以及“量子优势”可能形态的思考,接下来,我就把这趟实践之旅的详细过程、核心发现和踩过的坑,毫无保留地分享给你。

2. 核心思路与方案设计:为何选择混合量子-经典路径?

在NISQ时代直接构建一个全量子的学习模型是不切实际的。当前量子比特数量有限、相干时间短、且噪声显著。因此,主流的QML研究都聚焦于变分量子算法(VQA)框架,也就是我这次采用的混合架构。它的设计哲学非常务实:让量子处理器做它擅长的事(在希尔伯特空间中进行特定线性变换),而让经典计算机做它擅长的事(基于损失函数的梯度或值进行迭代优化)。

2.1 整体工作流拆解

整个项目的流程可以清晰地分为五个阶段,我将其绘制成以下工作流,以便你一目了然地把握全局:

flowchart TD A[原始泰坦尼克数据集] --> B[数据预处理与特征工程] B --> C[经典数据量子态编码<br>(Feature Map)] C --> D[变分量子电路处理<br>(Variational Ansatz)] D --> E[量子测量与经典损失计算] E --> F{经典优化器判断收敛?} F -- 否 --> G[更新量子电路参数] G --> D F -- 是 --> H[模型评估与性能分析]

这个闭环流程是混合量子-经典学习的核心。量子部分(编码、电路演化、测量)负责生成一个与输入数据和可调参数相关的预测值;经典部分则负责评估这个预测的好坏(计算损失),并指挥参数该如何调整(优化)。下面,我们来深入拆解其中几个关键的设计选择。

2.2 特征编码:从经典数据到量子态的第一道门

将经典数据(实数向量)加载到量子计算机中,是QML的第一步,也是决定模型表达能力上限的关键一步。我这次实验对比了Qiskit提供的两种保罗特征映射电路。

ZFeatureMap(一阶保罗展开):这是相对简单的一种编码方式。它的过程可以这样理解:

  1. 初始化:对所有量子比特施加哈达玛门(H),将每个量子比特从基态 |0⟩ 制备到叠加态 |+⟩ = (|0⟩ + |1⟩)/√2。你可以把这想象成把每个比特都“摊平”,为后续编码做好准备。
  2. 相位编码:对每个量子比特施加一个相位门 P(φ)。这个门的相位角 φ 是输入特征值的线性函数,通常是 φ = 2π * x_i(其中 x_i 是第 i 个归一化后的特征值)。这个操作不会改变 |+⟩ 态在 |0⟩ 和 |1⟩ 上的概率幅,但会改变它们的相对相位。关键点在于,这个映射电路不引入量子纠缠,各个量子比特的演化是独立的。

ZZFeatureMap(二阶保罗展开):这是一种更复杂的编码方式。它在一阶相位编码的基础上,增加了二阶相互作用项。

  1. 包含一阶部分:同样先进行H门和P门操作。
  2. 引入纠缠:随后,电路会引入一系列受控非门(CNOT)和以 ZZ 相互作用(即两个量子比特的Z方向耦合)为生成元的旋转门。这使得相位角不仅依赖于单个特征值,还依赖于特征值之间的乘积等非线性组合。这直接在各特征维度对应的量子比特之间创建了纠缠

为什么选择这两种并做对比?这背后是一个关于“表达力”与“可训练性”的权衡问题。ZZFeatureMap 由于引入了纠缠和非线性,理论上具有更强的表达能力和将数据映射到更高维特征空间(即所谓“量子核”效应)的潜力。但硬币的另一面是,过于复杂的编码和随之而来的高度纠缠,可能加剧“贫瘠高原”问题——即损失函数的梯度在参数空间中变得指数级平坦,使得优化器如同在迷雾中随机游走,难以找到下降方向。ZFeatureMap 虽然简单,但可能因其简单的结构而更容易训练。这次实验的一个重要目的,就是直观地验证这个理论上的权衡在实际数据集上的表现。

2.3 变分电路设计:可学习的量子变换层

在数据被编码为量子态 |Φ(x)⟩ 之后,需要经过一个可学习的量子变换 U(θ),得到最终态 |ψ(θ, x)⟩ = U(θ)|Φ(x)⟩。这个 U(θ) 就是变分量子电路,我选择了 Qiskit 中标准的RealAmplitudes拟设。

RealAmplitudes 的结构很有规律:它由交替的单比特旋转层纠缠层构成。

  • 旋转层:通常使用 Ry(θ) 门,因为它可以在布洛赫球面上产生任意实系数的量子态叠加。这里的旋转角度 θ 就是我们需要优化的变分参数。
  • 纠缠层:通常采用简单的线性纠缠方式,比如用CNOT门将相邻量子比特连接起来。

通过重复这个“旋转+纠缠”的基本单元,可以增加电路的深度和参数数量,从而提高模型的容量。在实验中,我构建了参数数量从10到50不等的多种电路。这里的一个实操心得是:并非参数越多越好。过多的参数不仅会增加优化难度,在NISQ模拟中显著增加计算时间,还可能因模型过复杂而更容易过拟合训练数据,导致在测试集上表现变差。我们需要寻找一个“甜蜜点”。

2.4 优化策略与损失函数:经典大脑如何指挥量子手臂

量子电路输出的是一个量子态,我们需要从中提取一个标量值用于分类。通常的做法是测量某个可观测量(比如所有量子比特的Z方向平均磁化强度)的期望值,将其映射到 [0, 1] 区间作为属于“幸存”类别的预测概率。

有了预测概率和真实标签,就需要一个指标来衡量模型��好坏,即损失函数。我选择了分类任务中最常用的交叉熵损失。它的物理意义可以理解为,衡量模型预测的概率分布与真实标签分布之间的“距离”。最小化交叉熵,就是让模型的预测尽可能接近真实情况。

优化器我选择了COBYLA。这是一个无梯度的、基于线性近似的局部优化算法。在QML的早期探索中,梯度计算(无论是通过参数移位规则还是其他方法)在模拟或实际硬件上都可能比较昂贵或受噪声影响较大。COBYLA 这类直接搜索方法只依赖损失函数值的比较,相对更稳健,且需要调节的超参数较少。注意:在初步训练中,我发现损失函数在大约150轮迭代后基本收敛,因此将后续所有模型的训练轮数统一设置为150轮,以保证比较的公平性和效率。

3. 数据预处理与量子模型构建实操

理论设计之后,就是落地的脏活累活了。量子模型的表现,很大程度上取决于喂给它的数据质量。

3.1 泰坦尼克数据集的特征工程

原始数据集有十多个特征,但并非所有都有用。我的处理原则是:保留信息量高、缺失少、与生存逻辑相关性强的特征。以下是具体的处理步骤:

  1. 删除无关或问题特征

    • name,ticket,embarked(登船港口):我认为这些与乘客生存能力关联度极低,直接删除。
    • boat(救生艇编号),body(遗体编号):这两个特征存在严重的“数据泄露”。如果一个人有救生艇编号,那他必然幸存;如果有遗体编号,则必然遇难。用这些特征来预测,等于作弊,必须删除。
    • fare(船票价格):数据记录方式不一致(有时是个人票价,有时是家庭总票价),为避免混淆,删除。
    • cabin(船舱),home.dest(目的地):缺失值太多,实用性差,删除。
  2. 处理缺失值

    • age(年龄)有263个缺失值。我采用了均值填充。虽然更精细的方法(如基于其他特征的回归填充)可能更好,但均值填充在首次实验中能快速提供一个基线,且能保留该特征的整体分布中心趋势。
  3. 特征缩放

    • 剩下的五个特征:pclass(舱位等级,1/2/3)、sex(性别,转为0/1)、agesibsp(同行的兄弟姐妹/配偶数)、parch(同行的父母/子女数),其量纲和范围不同。我使用sklearnMinMaxScaler将所有特征线性缩放到 [0, 1] 区间。这对于基于旋转角度的量子编码至关重要,能防止某个特征值过大导致旋转角溢出合理的相位周期(如2π)。
  4. 数据集划分

    • 按7:3的比例随机划分训练集和测试集。这里有个关键点:由于数据本身是不平衡的(幸存500人,遇难809人),在划分时我使用了分层抽样,确保训练集和测试集中正负样本的比例与全集基本一致,避免因划分引入的偏差。

经过以上处理,我们得到了一个干净、包含5个特征、1309个样本的数据集, ready for quantum encoding。

3.2 在Qiskit中构建量子分类器

接下来是使用Qiskit Machine Learning库将设计落地的过程。以下是构建一个分类器的核心代码逻辑:

from qiskit.circuit.library import ZFeatureMap, ZZFeatureMap, RealAmplitudes from qiskit_machine_learning.neural_networks import EstimatorQNN from qiskit_machine_learning.algorithms.classifiers import NeuralNetworkClassifier from sklearn.preprocessing import MinMaxScaler from sklearn.model_selection import train_test_split # 1. 准备数据 (假设X是特征数组,y是标签) X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, stratify=y, random_state=42) scaler = MinMaxScaler() X_train_scaled = scaler.fit_transform(X_train) X_test_scaled = scaler.transform(X_test) # 注意:用训练集的scaler来变换测试集 # 2. 选择特征映射和变分电路 num_features = X_train.shape[1] feature_map = ZFeatureMap(feature_dimension=num_features, reps=1) # 或 ZZFeatureMap ansatz = RealAmplitudes(num_qubits=num_features, reps=3) # reps控制参数数量, entanglement='linear' # 3. 组合成量子神经网络 (QNN) from qiskit.primitives import Estimator estimator = Estimator() qnn = EstimatorQNN( estimator=estimator, circuit=feature_map.compose(ansatz), input_params=feature_map.parameters, weight_params=ansatz.parameters ) # 4. 包装成分类器并训练 classifier = NeuralNetworkClassifier( neural_network=qnn, optimizer=COBYLA(maxiter=150), # 设置最大迭代次数 loss='cross_entropy_loss' ) classifier.fit(X_train_scaled, y_train) # 5. 预测与评估 y_pred = classifier.predict(X_test_scaled) # ... 计算准确率、精确率、召回率等指标

关键参数解析与选择

  • feature_dimension:必须等于特征数。我们的数据是5维,所以需要5个量子比特。
  • reps(在RealAmplitudes中):这是最重要的超参数之一。它决定了基本“旋转+纠缠”单元重复的次数。reps增加,参数数量线性增加,模型容量和深度也增加。我通过实验测试了不同reps值对应的参数总数(从10到50),以观察性能饱和点。
  • entanglement:在RealAmplitudes中,我选择了最简单的'linear'(线性最近邻纠缠),这通常足以捕获特征间的关联,且不会让电路过于复杂。

一个重要的避坑点:在定义EstimatorQNN时,必须明确区分input_params(特征映射的参数,由数据驱动)和weight_params(变分电路的参数,由优化器训练)。这一步如果弄混,模型将无法正确学习。

4. 实验结果深度分析与讨论

所有模型在Google Colab的“Statevector”理想模拟器上运行。这个模拟器能完美模拟量子电路,没有噪声,让我们可以专注于算法本身的表现。

4.1 不同量子模型的性能对比

我训练并测试了基于ZFeatureMapZZFeatureMap的共18个模型(参数数从10到50)。评估指标除了常用的准确率(Accuracy),还特别关注了平衡准确率(Balanced Accuracy)约登指数(Youden‘s Index, J)。因为数据集不平衡,单纯准确率可能虚高(例如,全部预测为“遇难”也能获得约62%的准确率)。平衡准确率是正类召回率(灵敏度)和负类召回率(特异度)的平均值,对不平衡数据更公平。约登指数 J = 灵敏度 + 特异度 - 1,其值越接近1,说明模型综合判别能力越好。

ZFeatureMap系列模型表现

  • 性能饱和现象:如下图所示,当参数数量达到15-20个时,模型的准确率、平衡准确率和约登指数均达到平台期,分别稳定在0.78-0.80、0.77-0.79和0.55-0.58左右。继续增加参数到50个,性能没有显著提升,有时甚至略有波动下降。
  • 解读:这说明对于泰坦尼克这个5维特征的数据集,一个中等复杂度的量子模型(约15-20参数)已经足够捕捉其分类模式。过多的参数可能是冗余的,甚至可能因优化难度增加而无法达到更优解,这也印证了之前关于“贫瘠高原”和过拟合的担忧。

ZZFeatureMap系列模型表现

  • 整体表现不佳:相比之下,所有ZZFeatureMap模型的性能都显著更差。准确率和平衡准确率在0.60-0.75之间大幅波动,约登指数很多在0.2以下���甚至为负。
  • 原因分析:这个结果非常有意思。理论上表达能力更强的ZZFeatureMap反而失败了。我分析主要原因有二:第一,过度纠缠与贫瘠高原:二阶展开和强纠缠可能使损失函数景观过于平坦复杂,COBYLA优化器陷入局部极值或无法有效搜索。第二,数据与编码不匹配:泰坦尼克数据特征间的非线性关系可能并不需要或不适合用这种强纠缠的复杂编码来提取,简单的线性相位编码(ZFeatureMap)反而更匹配数据的本质结构,更容易被训练。

实操心得:这个对比强烈地提醒我们,在QML中“更强大”并不总是“更好”。选择特征映射和变分电路时,必须考虑与具体数据集的适配性。从一个简单的、无纠缠的编码开始,往往是更稳妥的起点。

4.2 量子随机性的影响评估

量子计算中存在固有的随机性(如测量塌缩)。为了评估这种随机性对结果的影响,我对表现最好的Z20模型进行了10次独立重复实验(从相同的训练/测试集划分开始,但每次模型参数随机初始化)。结果如下图所示,所有评估指标的分布都非常集中,方差极小。

这表明,在当前使用理想模拟器和固定优化轮次的设置下,量子随机性对最终分类性能的影响微乎其微。性能波动主要来源于优化器从不同初始点出发的路径差异,而这在经典机器学习中也同样存在。

4.3 与经典模型的正面较量

我选择了Z15Z20这两个表现最佳且参数较少的量子模型,与sklearn中的线性支持向量机(LinearSVC)进行对比。为了更全面,我改变了训练集的比例(从10%到90%),观察模型在不同数据量下的表现。

关键发现

  1. 性能相当:在大多数训练集比例下(尤其是30%-70%),Z20量子分类器的准确率、平衡准确率与经典线性SVC不相上下,有时甚至略优。这说明在这个特定任务上,一个设计良好的混合量子-经典模型可以达到经典主流方法的基准水平。
  2. 经典模型的“崩溃”:一个非常有趣的现象是,当使用90%的数据进行训练时,经典线性SVC的性能出现了断崖式下跌,约登指数接近0,意味着模型失去了分类能力。而两个量子模型则保持了稳定的性能。
  3. 原因推测:我怀疑这可能是由于数据划分导致的偶然性,或者当训练集极大时,线性SVC的某个超参数(如正则化系数C)不再适用,需要重新调整。而量子模型由于其不同的优化景观和损失函数,对此似乎不那么敏感。这暗示了量子模型可能在某些数据分布或规模下具有不同的泛化行为,但这需要更多实验验证,不能作为一般性结论。

5. 常见问题、挑战与未来展望

通过这个完整的项目,我深刻体会到QML应用落地的挑战与魅力。以下是一些共性问题和我个人的思考。

5.1 实践中遇到的主要挑战

  1. 模拟计算成本:即使只有5个量子比特,模拟一个较深的变分电路(如50参数)并进行150轮优化,在Colab的CPU环境下也需要数分钟。随着比特数和电路深度增加,模拟时间会指数级增长。这是阻碍大规模探索的主要瓶颈。
  2. 超参数选择:量子模型的超参数很多:特征映射类型、变分电路结构(层数、纠缠方式)、优化器类型、学习率/迭代次数等。目前缺乏像经典机器学习那样成熟的理论指导或经验法则,很大程度上依赖网格搜索和经验,试错成本高。
  3. “贫瘠高原”的幽灵:虽然在这个小规模实验中未明显观察到,但理论上它是大规模QML的主要障碍。需要谨慎设计电路结构(如采用浅层电路、局部纠缠)、或采用专门的初始化策略和优化技巧来缓解。
  4. 对经典预处理的高度依赖:量子模型并没有免除我们对数据清洗、特征工程和特征缩放的责任。事实上,由于编码方式的物理限制(如相位旋转的范围),对数据尺度可能更敏感。

5.2 给入门者的建议

如果你想开始自己的第一个QML项目,我的建议是:

  • 从模拟器和经典数据集开始:Qiskit、PennyLane等框架的模拟器非常成熟,是学习的不二之选。泰坦尼克、鸢尾花、手写数字(MNIST子集)都是很好的起点。
  • 遵循“简单至上”原则:先从ZFeatureMapAngleEncoding这类简单编码开始,搭配RealAmplitudesTwoLocal这类标准变分电路。不要一开始就追求复杂的纠缠和大型电路。
  • 重视经典部分:扎实的机器学习基础(数据预处理、模型评估、交叉验证)在QML中同样至关重要,甚至更重要。一个糟糕的经典数据处理流程会毁掉任何量子模型。
  • 理解“混合”的本质:始终清楚哪些部分在量子芯片上运行,哪些在经典CPU上运行。学会使用框架(如Qiskit Runtime)提供的混合编程接口。

5.3 未来方向与个人体会

这次实验验证了在NISQ时代,混合量子-经典模型处理经典分类问题是完全可行的,并且能在一些任务上达到与经典方法媲美的性能。但这离所谓的“量子优势”还很远。

我认为近期的价值不在于替代经典算法,而在于探索:探索哪些类型的数据结构(如图数据、具有复杂相关性的数据)可能更受益于量子态的表示;探索量子模型是否在某些情况下具有更好的鲁棒性或泛化能力,就像我们在90%训练集比例下看到的那一幕一样。

我个人的体会是,QML目前更像是一门实验科学。它需要研究者兼具量子物理的直觉和机器学习工程的经验。每一次成功的实验,都是对参数空间的一次小心翼翼的地图测绘。过程中充满了“为什么这个不work”的困惑,和“原来这样才行”的惊喜。虽然前路漫长,但亲手搭建一个量子电路,看着它从随机猜测开始,逐渐学会区分泰坦尼克上的幸存者与遇难者,这种跨越抽象理论与具体实践的成就感,正是这个领域最吸引人的地方。或许,量子计算的未来,就藏在这一个个看似微小的分类实验的积累之中。

http://www.cnnetsun.cn/news/2552746.html

相关文章:

  • Wireshark+pyshark协同分析DNS与TLS异常
  • Unity与Android Studio协同开发实战指南
  • CVE-2016-2183漏洞深度治理:从SWEET32原理到全栈禁用实战
  • 终极游戏翻译解决方案:XUnity.AutoTranslator完整指南
  • ppt模板_0045_蓝色登山
  • Feishu-Doc-Export技术实现深度解析:企业级文档批量导出解决方案
  • C++/C#混合编程实现FFmpeg屏幕录制的工业级实践
  • 百度网盘下载速度太慢?Python脚本帮你获取高速直链
  • 可微卡尔曼滤波:融合场反演与机器学习的状态估计新范式
  • 如何高效使用Iwara视频下载神器:一键批量下载的完整指南
  • 每日一Go-66、K8s 蓝绿发布 金丝雀发布实战:Service 切流量 + Ingress 灰度一次讲透
  • 炉石传说深度定制:用HsMod打造你的专属卡牌对战体验
  • 工业设备预测性维护实战:自适应阈值与合成数据驱动的故障诊断
  • common lisp 张量,矩阵计算库介绍
  • GPT-5.5登顶开发者最期待工具榜
  • 2026年学习Java还有前景吗?如何看待2026Java程序员就业难现状?
  • 深度学习与神经网络学习笔记 —— 卷积神经网络(CNN)基础
  • GHelper终极指南:华硕笔记本轻量控制工具的专业使用教程
  • Unity+鸿蒙构建汽车工厂数字孪生实时监控系统
  • OllyDbg 1.10 动态调试实战:从零掌握Windows底层执行原理
  • Seraphine:英雄联盟玩家的智能游戏助手完整指南
  • Lipschitz常数与傅里叶级数在自动驾驶中的应用
  • LabVIEW 系统化入门学习路径
  • 小白带你揭秘“盒子模型”前端开发者必知的布局基石
  • Week 1:机器学习入门与核心框架
  • 《道德经》第二十章
  • 告别黑屏!手把手教你为OpenEuler 22.03 LTS安装轻量级xfce桌面(附背景图设置)
  • 机器学习记忆化:平衡隐私、鲁棒性与公平性的核心技术挑战
  • AI爬虫流量治理:从请求体语义识别AI工作流
  • 基于伊辛机与机器学习的无线网络TDMA调度优化实践