量子机器学习入门:三种数据编码方法对比与应用

news/2025/9/24 7:05:52/文章来源:https://www.cnblogs.com/dBjZoQ833/p/19108471

在传统机器学习中数据编码确实相对直观:独热编码处理类别变量,标准化调整数值范围,然后直接输入模型训练。整个过程更像是数据清洗,而非核心算法组件。

量子机器学习的编码完全是另一回事。

传统算法可以直接消化特征向量 [0.7, 1.2, -0.3],但量子电路运行在概率幅和量子态的数学空间里。你的每个编码决策——是用角度旋转、振幅映射还是基态表示——都在重新定义信息在量子系统中的存在形式。这不是简单的格式转换,而是从根本上塑造了量子算法能够"看到"和处理的数据结构。

在量子机器学习中,编码不是预处理,而是算法设计的核心。

本文我们会详细讲解量子数据编码的三种主要方法,分析它们与传统方法的区别,以及为什么选对编码方式会决定你的量子模型成败。

量子编码的底层逻辑
量子电路处理数据的方式和传统算法截然不同,即使是在普通电脑上模拟运行也是如此。你没法直接把数值列表或者归一化向量塞给量子电路。数据必须先编码成量子态——这些数学对象可以模拟叠加和纠缠行为。这个编码过程就是连接经典数据集和量子计算环境的桥梁,让我们能在本地机器上做量子机器学习实验。

量子电路运行在一个完全不同的计算空间里。它们操作的是量子态,这些数学对象存在于叠加状态中,可以在多个量子比特之间形成纠缠,测量时会发生坍缩。量子电路处理不了 2.3 这样的普通数字,因为量子门操作的是概率幅和相位关系,不是经典的标量。

编码方法的选择从根本上决定了量子模型能学到什么。基础编码把数据直接映射成二进制量子态,实现简单但表达能力有限。振幅编码把整个数据集压缩进量子态的振幅里,效率很高但需要复杂的归一化处理。角度编码用量子门根据数据值旋转量子比特,在简单性和功能性之间找到了平衡点。

这个选择不只影响准确率,还决定了电路深度、量子比特需求,以及模型能利用哪些量子现象。选错了编码方式,即使是理论上有优势的量子算法也可能跑不过经典基线。

角度编码:最直观的映射方式
角度编码是把经典特征转换为量子态最直接的方法。每个特征值变成一个旋转角度,作用在对应的量子比特上。通常用 RY 门(绕Y轴旋转),因为它能让量子比特在Bloch球面的Y轴上旋转。

对于特征向量 x = [x₁, x₂, …, xₙ],角度编码的操作是:第一个量子比特 RY(x₁)|0⟩ → cos(x₁/2)|0⟩ + sin(x₁/2)|1⟩,第二个量子比特 RY(x₂)|0⟩ → cos(x₂/2)|0⟩ + sin(x₂/2)|1⟩,以此类推。

旋转角度直接控制量子比特在Bloch球面上的位置。角度0保持量子比特在 |0⟩ 状态,π/2 创建等权叠加 (|0⟩ + |1⟩)/√2,π 翻转到 |1⟩ 状态。这种几何解释让角度编码很好理解——每个特征实际上在旋转对应的量子比特,把信息编码在量子态的几何结构里。

用Qiskit实现角度编码很简单。每个特征通过一个 RY门 处理,作用在独立的量子比特上:

from qiskit import QuantumCircuit
import numpy as np

class AngleEncoder:
def init(self, num_features):
self.num_features = num_features

 def encode(self, features):  """Encode a single feature vector into a quantum circuit."""  qc = QuantumCircuit(self.num_features)  for i, x in enumerate(features):  qc.ry(x, i)  return qc

处理批量样本只需要遍历数据集:

def batch_encode(encoder, data):
circuits = []
for features in data:
circuits.append(encoder.encode(features))
return circuits
想看编码后的量子态,Qiskit提供了可视化工具:

from qiskit.visualization import plot_bloch_multivector
from qiskit.quantum_info import Statevector

features = [np.pi/4, np.pi/2]
qc = AngleEncoder(len(features)).encode(features)

state = Statevector.from_instruction(qc)
plot_bloch_multivector(state)
这会在Bloch球面上画出每个量子比特的状态,让你直观看到数据是怎么嵌入的。

角度编码的优势很明显:特征到量子比特的映射很直接,适用于任何连续数据。但限制也不少,每个量子比特只能编码一个特征作为单个角度,表达能力有限。每个特征只影响一个量子比特,所以多特征之间的交互没法自然表示出来,也抓不到特征间的相关性。扩展到高维数据时需要很多量子比特这在实际应用中是个大问题。

振幅编码:量子优势的体现
振幅编码真正展现了量子计算的指数优势。它不是给每个特征分配一个量子比特,而是把整个特征向量压缩到量子态的振幅里。

比如特征向量 x = [x₁, x₂, x₃, x₄],振幅编码会创建量子态 |ψ⟩ = α₁|00⟩ + α₂|01⟩ + α₃|10⟩ + α₄|11⟩,每个αᵢ对应一个归一化的特征值。这里的关键是指数信息密度:n个特征只需要 log₂(n) 个量子比特。256个特征的向量只要8个量子比特就够了,而角度编码需要256个。

但这种压缩有个硬性要求:Σ|αᵢ|² = 1,保证量子态的有效性。你的特征向量必须先归一化为单位长度。与角度编码直接映射不同,振幅编码需要复杂的数学预处理,把经典向量转换成概率幅。

这种指数压缩带来了独特的量子现象。特征不再独立它们存在于叠加态中,测量任何量子比特都会影响整个系统状态。这让量子算法能处理传统算法难以应对的特征相关性和高维模式,但也让编码的实现和理解变得复杂得多。

振幅编码面临两个角度编码没有的难题:归一化复杂性和电路深度问题。

归一化这步看起来简单,实际上很要命。你的特征向量必须满足 Σ|αᵢ|² = 1,这直接影响模型对数据关系的解释。用L2归一化、先做min-max缩放再归一化,或者基于概率的归一化,对同一份经典数据会产生完全不同的量子表示。

负特征值更麻烦。量子概率幅可以是复数,但实现复振幅编码需要额外的量子比特或者复杂的相位编码。很多实际应用把振幅限制为实数,如果你的特征有重要的负值信息,就可能丢失关键信息。

电路深度是另一个坑。创建任意振幅状态需要复杂的量子电路,不像角度编码每个特征用一个RY门就完事。振幅编码需要一串受控旋转、受控NOT门,还要辅助量子比特。电路深度随特征数量对数增长,实现起来相当复杂。

用Qiskit的 initialize 方法可以直接在量子比特上设置振幅:

from qiskit import QuantumCircuit

class AmplitudeEncoder:
def init(self, num_qubits):
self.num_qubits = num_qubits

 def encode(self, features):  """Encode normalized feature vector into quantum circuit."""  qc = QuantumCircuit(self.num_qubits)  qc.initialize(features, qc.qubits)  return qc

处理任意长度的数据集,需要结合归一化:

def encode_vector(vector):
vec = normalize(vector)
num_qubits = int(np.ceil(np.log2(len(vec))))
# Pad vector to length 2^num_qubits
pad_len = 2**num_qubits - len(vec)
padded = np.append(vec, [0]*pad_len)
return AmplitudeEncoder(num_qubits).encode(padded)
这样就能处理任意长度的向量,编码器会自动填充到最近的2的幂次。

基础编码:简单高效的离散表示
基础编码把分类数据直接映射到计算基础状态∣0⟩ 和 ∣1⟩。它不依赖叠加或干涉,而是用不同的正交状态表示不同类别,测量时能完美区分。

这创建了经典标签和二进制量子态的一对一映射。2量子比特系统有四个基础状态:∣00⟩,∣01⟩,∣10⟩,∣11⟩,可以表示四个类别。编码就是把分类标签转成二进制,然后初始化量子比特匹配这个二进制模式。类别"A"可能对应 ∣00⟩,类别"B"对应 ∣01⟩,测量时能100%确定地恢复原类别。

数学上很优雅:n个类别只需要 [log₂(n)] 个量子比特,对离散数据非常高效。

Qiskit实现基础编码很直接,把量子比特准备到对应的基础状态:

class BasisEncoder:
def init(self, num_qubits):
self.num_qubits = num_qubits

 def encode(self, binary_string):  """Prepare qubits in basis state from a binary string."""  qc = QuantumCircuit(self.num_qubits)  for i, bit in enumerate(binary_string):  if bit == "1":  qc.x(i)  # Apply X gate to flip |0⟩ → |1⟩  return qc

多类问题可以把整数标签映射成二进制字符串:

def int_to_basis(n, num_qubits):
return format(n, f"0{num_qubits}b")

encoder = BasisEncoder(3)
qc = encoder.encode(int_to_basis(5, 3)) # Encodes integer 5 as |101⟩
基础编码对分类变量很合适,但处理连续或高维数据就效率太低了。编码大数据集会消耗太多量子比特,不实用。对数值特征,角度或振幅编码是更好的选择。
更多案例:
github.com/yjndsrt/cn/issues/1015
github.com/yjndsrt/cn/issues/1014
github.com/yjndsrt/cn/issues/1013
github.com/yjndsrt/cn/issues/1012
github.com/yjndsrt/cn/issues/1011
github.com/yjndsrt/cn/issues/1010
github.com/yjndsrt/cn/issues/1009
github.com/yjndsrt/cn/issues/1008
github.com/yjndsrt/cn/issues/1007
github.com/yjndsrt/cn/issues/1006
github.com/yjndsrt/cn/issues/1005
github.com/yjndsrt/cn/issues/1004
github.com/yjndsrt/cn/issues/1003
github.com/yjndsrt/cn/issues/1002
github.com/yjndsrt/cn/issues/1001
github.com/yjndsrt/cn/issues/1000
github.com/yjndsrt/cn/issues/999
github.com/yjndsrt/cn/issues/998
github.com/yjndsrt/cn/issues/997
github.com/yjndsrt/cn/issues/996
github.com/yjndsrt/cn/issues/995
github.com/yjndsrt/cn/issues/994
github.com/yjndsrt/cn/issues/993
github.com/yjndsrt/cn/issues/992
github.com/yjndsrt/cn/issues/991
github.com/yjndsrt/cn/issues/990
github.com/yjndsrt/cn/issues/989
github.com/yjndsrt/cn/issues/988
github.com/yjndsrt/cn/issues/987
github.com/yjndsrt/cn/issues/986
github.com/yjndsrt/cn/issues/985
github.com/yjndsrt/cn/issues/984
github.com/yjndsrt/cn/issues/983
github.com/yjndsrt/cn/issues/982
github.com/yjndsrt/cn/issues/981
github.com/yjndsrt/cn/issues/980
github.com/yjndsrt/cn/issues/979
github.com/yjndsrt/cn/issues/978
github.com/yjndsrt/cn/issues/977
github.com/yjndsrt/cn/issues/976
github.com/yjndsrt/cn/issues/975
github.com/yjndsrt/cn/issues/974
github.com/yjndsrt/cn/issues/973
github.com/yjndsrt/cn/issues/972
github.com/yjndsrt/cn/issues/971
github.com/yjndsrt/cn/issues/970
github.com/yjndsrt/cn/issues/969
github.com/yjndsrt/cn/issues/968
github.com/yjndsrt/cn/issues/967

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/915154.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度学习调参新思路:Hyperband早停机制提升搜索效率

Hyperband是机器学习中一个相当实用的超参数调优算法,核心思路是用逐次减半来分配计算资源。说白了就是让一堆配置先跑几轮,表现差的直接踢掉,剩下的继续训练更多轮次。 这个方法的巧妙之处在于平衡了探索和利用。你…

解决推理能力瓶颈,用因果推理提升LLM智能决策

从ChatGPT到现在的智能体AI这个跨越说明了一个关键转变。ChatGPT本质上是个聊天机器人,生成文本回应;而AI智能体能够自主完成复杂任务——销售、旅行规划、航班预订、找装修师傅、点外卖,这些都在它的能力范围内。 …

昆明市网站制作公司网站一般多少钱一年

摘要: 准备工作 开通阿里云直播服务:阿里云直播服务接收直播流,并提供直播播放地址,完成一场直播需要先开通阿里云直播服务,在 直播官网详情页 中单击 立即开通 ,开通阿里云直播服务。 如您已经能够使用阿里…

做個app网站价格做舞美的好素材网站j

目录 一、目标二、计划三、完成情况1.宏观思维导图2.过程中的团队管理和其它方面的思考 四、意外之喜(最少2点)1.计划内的明确认知和思想的提升标志2.计划外的具体事情提升内容和标志 一、目标 通过参加考试,训练学习能力,而非单纯以拿证为目的。 1.在复…

网站建设中 windows运动网页设计

导出建库表索引等: [rootlnpg ~]# mysqldump -ugistar -pxxx -h192.168.207.143 --no-data -d lndb > lndb20230223-1.sql 只导出索引:参考:MYSQL导出现有库中的索引脚本_mysql 导出数据库所有表的主键和索引-CSDN博客 -- MYSQL导出现有…

高端手机网站 制作公司微信公众平台登录入口官网

Go基础之锁的初识 当我们的程序就一个线程的时候是不需要用到锁的,但是通常我们实际的代码不会是单个线程的,所有这个时候就需要用到锁了,那么关于锁的使用场景主要涉及到哪些呢? 当我们多个线程在读相同的数据的时候则是需要加锁…

自己做一元夺宝网站车之家汽车报价2022官网

Koa 和 Express 都会使用到中间件 Express的中间件是顺序执行,从第一个中间件执行到最后一个中间件,发出响应如上图 Koa是从第一个中间件开始执行,遇到 next 进入下一个中间件,一直执行到最后一个中间件,在逆序&#x…

如何做地方门户网站默认网站停止

👽发现宝藏 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 从零开始学习数据结构与算法:Python实现 数据结构与算法是计算机科学中至关重要…

中国空间站距离地面多少公里中英文网站设计

1、将变量名作为实参和形参: 这时传给形参的是变量的值,传递是单向的。如果在执行函数期间形参的值发生变化,并不传回实参。应为在调用函数时,形参和实参不是同一个存储单元。 2、传递变量的指针: 形参是指针变量&a…

网站建设优化外包域名备案与网站不一致

位图缓存是专用RAM缓冲区,应用可将位图保存(或缓存)在其中。 如果缓存了位图,在绘制位图时,TouchGFX将自动使用RAM缓存作为像素来源。位图缓存在许多情况下十分有用。 从RAM读取数据通常比从闪存读取要快(特…

北京好网站制作公司哪家好网站排序

元旦准备买NDS,顺带关注了下PSP,其实是想,或许买PSP也不错~PSP很像一个平台,提供了很多东西,譬如官方的PS模拟器~在上面编程也是个不错的想法。国外的一个网站提供了很多信息,PS2Dev Network (http://www.p…

石家庄学做网站建设培训学校企业网站管理系统手机版教程

A.Wrong Answer(模拟) 题意: 给你两个整数 A A A和 B B B,它们介于 0 0 0和 9 9 9之间。 输出任何一个介于 0 0 0和 9 9 9之间且不等于 A B AB AB的整数。 分析: 按题意判断并输出一个整数即可。 代码&#xff…

建设银行网站服务功能网站制作的流程包括

在计算机视觉中,特别是在相机标定和立体视觉领域,内参(intrinsic parameters)和外参(extrinsic parameters)是非常重要的概念。它们与相机的几何属性和姿态有关。 内参(Intrinsic Parameters&am…

宝安区建设工程交易服务中心做网站优化的弊端

目录 一、本节介绍 1 上集回顾 2 本节介绍 二、原理分析 1 现实中出现彩色的原因 2 软件里的彩色的原理 3 方案 三、 实现数字由【-1,1】映射为【0,1】 1 结论 2 原理 四、代码实现 1 注意事项 2 详解结构体appdata_base 3 接收数据 4 映射数据 5 输出给SV_TAR…

天津市网站建设公司wordpress在哪里注册

1 事件概述 CAPL是一种面向过程、由事件驱动的类C语言。 事件驱动针对于顺序执行,其区别如下: 顺序执行:顺序执行流程中,子例程或过程函数按照代码编写顺序逐句执行。 事件驱动:CAPL程序由事件驱动,工程…

网站开发具体做什么的商贸有限公司名称大全

来源:本文经公众号「雷克世界」授权转载(微信号:ROBO_AI) 作者:DeepMind 编译:嗯~阿童木呀、多啦A亮 概要:在将强化学习(RL)扩展到复杂序列决策问题(sequen…

买网站不给我备案开发网站需要租服务器

我们提出了 Follow-Your-Emoji,这是一种基于扩散的肖像动画框架,它使用目标地标序列对参考肖像进行动画处理。肖像动画的主要挑战是保留参考肖像的身份并将目标表情转移到该肖像,同时保持时间一致性和保真度。为了应对这些挑战,Fo…

designer怎么做网站整合营销策划方案

知识改变命运,技术就是要分享,有问题随时联系,免费答疑,欢迎联系! 厦门微思网络​​​​​​ https://www.xmws.cn 华为认证\华为HCIA-Datacom\华为HCIP-Datacom\华为HCIE-Datacom Linux\RHCE\RHCE 9.0\RHCA\ Oracle O…

长沙营销网站建设公司共享会议室租赁平台

1、 根目录 .\\ 或者直接给出文件名称,是找根目录的路径。 如:path "gs.mdb" 与 path ".\\gs.mdb"是一个意思。 2、 根目录的上级目录, 在C#中是指定到bin文件夹里面 ..\\ 应用程序的根目录的上两级 3、指定到根目录上面的三级目录…

购物网站排名2017win7下asp网站搭建

目录 概述实践安装插件docker 在线安装containerd安装二进制安装yum安装修改containder配置文件 cnietcdrsyncgo设置golang代理 安装CFSSL下载kubernetes代码编译启动本地单节点集群问题k8s没有被正常启动该如何k8s正常启动日志测试 结束 概述 此文详细说明在 centos 7上编译 k…