量子机器学习Variational Quantum Classifier (VQC)简介

news2025/2/6 14:41:59

变分量子分类器(Variational Quantum Classifier,简称VQC)是一种利用量子计算技术进行分类任务的机器学习算法。它属于量子机器学习算法家族,旨在利用量子计算机的计算能力,潜在地提升经典机器学习方法的性能。

VQC的基本思想是使用一个量子电路,也称为变分量子电路,将输入数据编码并映射到量子态上。然后,使用量子门和测量操作对这些量子态进行操作,以提取与分类任务相关的特征。最后,处理测量结果,并将其用于为输入数据分配类别标签。

VQC将经典优化技术与量子计算相结合。在训练过程中,将变分量子电路在量子计算机或模拟器上重复执行,并将结果与训练数据的真实标签进行比较。通过迭代地调整变分量子电路的参数,使其在预测标签与真实标签之间的差异上最小化代价函数。这个优化过程旨在找到最优的量子电路配置,从而最大化分类准确性。虽然看起来很简单,但这种混合计算体系结构存在很多的挑战。

特征映射是第一阶段,其中数据必须编码为量子位。有许多编码方法,因为特征映射是从一个向量空间到另一个向量空间的数学变换。所以研究如何为每个问题找到最佳映射,就是一个待研究的问题

有了映射,还要设计一个量子电路作为模型,这是第二阶段。在这里我们可以随心所愿地发挥创意,但必须考虑到同样的旧规则仍然很重要:对于简单的问题,不要使用太多的参数来避免过拟合,也不能使用太少的参数来避免偏差,并且由于我们正在使用量子计算,为了从量子计算范式中获得最佳效果,必须与叠加(superposition )和纠缠(entanglement)一起工作。

并且量子电路是线性变换,我们还需要对其输出进行处理。比如非线性化的激活。

数据集和特征

这里我们将基于泰坦尼克号数据集设计一个分类器,我们的数据集有以下特征:

  • PassengerID
  • Passenger name
  • Class (First, second or third)
  • Gender
  • Age
  • SibSP (siblings and/or spouses aboard)
  • Parch (parents or children aboard)
  • Ticket
  • Fare
  • Cabin
  • Embarked
  • Survived

我们要构建一个根据乘客的特征预测乘客是否幸存的分类器。所以我们只选择几个变量作为示例:

  • is_child (if age <12)
  • is_class1 (if person is in the first class)
  • is_class2
  • is_female

由于只有四个变量,所以我们使用将使用Basis Embedding。我们只需将经典位转换为等效量子位。比如我们的四个变量是1010,这将被转换为|1010>。

模型

我们的模型是可参数化量子电路。这个电路必须具有一定程度的叠加和纠缠,这样才能证明使用量子组件是合理的,我们的模型如下:

这个模型可能看起来很复杂,但他的想法相当简单。 这是一个双层电路,因为核心结构重复了 2 次。 首先,我们为每个量子位绕 Z、Y 和 Z 轴旋转,这里的想法是分别在每个量子位上插入某种程度的叠加。 这些旋转是参数化的,并且在算法的每次交互中,这些参数将由经典计算机更新。 然后就是 Y 轴和 Z 轴上的旋转,因为量子位的矢量空间是一个球体(布洛赫球体)。 RZ 只会改变量子比特相位,RY 会影响量子比特与 |0> 和 |1> 的接近程度。

每对量子位之间有四个受控非 (CNOT) 状态,这是一个量子门,根据另一个量子位(分别为目标和控制)的状态反转一个量子位状态。 也就是说这个门纠缠了我们电路中的所有量子位,现在所有状态都纠缠了。 在第二层中,我们应用了一组新的旋转,这不仅仅是第一层的逻辑重复,因为现在所有状态都纠缠在一起,这意味着旋转第一个量子比特也会影响其他量子比特! 最后我们有了一组新的 CNOT 门。

这是对我们上面模型的非常简单的解释,下面代码会让这些内容变得更清晰。

优化器

我使用的是Adam Optimizer,但是这个优化器是经过特殊处理的,我们直接使用pennylane 库。

代码实现

这里我们直接使用Pennylane和sklearn实现代码。

 importpennylaneasqml
 frompennylaneimportnumpyasnp
 frompennylane.optimizeimportAdamOptimizer
 
 fromsklearn.model_selectionimporttrain_test_split
 importpandasaspd
 
 fromsklearn.metricsimportaccuracy_score
 fromsklearn.metricsimportf1_score
 fromsklearn.metricsimportprecision_score
 fromsklearn.metricsimportrecall_score
 
 importmath
 
 num_qubits=4
 num_layers=2
 
 dev=qml.device("default.qubit", wires=num_qubits)
 
 # quantum circuit functions
 defstatepreparation(x):
     qml.BasisEmbedding(x, wires=range(0, num_qubits))
 
 deflayer(W):
 
     qml.Rot(W[0, 0], W[0, 1], W[0, 2], wires=0)
     qml.Rot(W[1, 0], W[1, 1], W[1, 2], wires=1)
     qml.Rot(W[2, 0], W[2, 1], W[2, 2], wires=2)
     qml.Rot(W[3, 0], W[3, 1], W[3, 2], wires=3)
 
     qml.CNOT(wires=[0, 1])
     qml.CNOT(wires=[1, 2])
     qml.CNOT(wires=[2, 3])
     qml.CNOT(wires=[3, 0])
 
 @qml.qnode(dev, interface="autograd")
 defcircuit(weights, x):
 
     statepreparation(x)
 
     forWinweights:
         layer(W)
 
     returnqml.expval(qml.PauliZ(0))
 
 defvariational_classifier(weights, bias, x):
     returncircuit(weights, x) +bias
 
 defsquare_loss(labels, predictions):
     loss=0
     forl, pinzip(labels, predictions):
         loss=loss+ (l-p) **2
 
     loss=loss/len(labels)
     returnloss
 
 defaccuracy(labels, predictions):
 
     loss=0
     forl, pinzip(labels, predictions):
         ifabs(l-p) <1e-5:
             loss=loss+1
     loss=loss/len(labels)
 
     returnloss
 
 defcost(weights, bias, X, Y):
     predictions= [variational_classifier(weights, bias, x) forxinX]
     returnsquare_loss(Y, predictions)
 
 # preparaing data
 df_train=pd.read_csv('train.csv')
 
 df_train['Pclass'] =df_train['Pclass'].astype(str)
 
 df_train=pd.concat([df_train, pd.get_dummies(df_train[['Pclass', 'Sex', 'Embarked']])], axis=1)
 
 # I will fill missings with the median
 df_train['Age'] =df_train['Age'].fillna(df_train['Age'].median())
 
 df_train['is_child'] =df_train['Age'].map(lambdax: 1ifx<12else0)
 cols_model= ['is_child', 'Pclass_1', 'Pclass_2', 'Sex_female']
 
 X_train, X_test, y_train, y_test=train_test_split(df_train[cols_model], df_train['Survived'], test_size=0.10, random_state=42, stratify=df_train['Survived'])
 
 X_train=np.array(X_train.values, requires_grad=False)
 Y_train=np.array(y_train.values*2-np.ones(len(y_train)), requires_grad=False)
 
 # setting init params
 np.random.seed(0)
 weights_init=0.01*np.random.randn(num_layers, num_qubits, 3, requires_grad=True)
 bias_init=np.array(0.0, requires_grad=True)
 
 opt=AdamOptimizer(0.125)
 num_it=70
 batch_size=math.floor(len(X_train)/num_it)
 
 weights=weights_init
 bias=bias_init
 foritinrange(num_it):
 
     # Update the weights by one optimizer step
     batch_index=np.random.randint(0, len(X_train), (batch_size,))
     X_batch=X_train[batch_index]
     Y_batch=Y_train[batch_index]
     weights, bias, _, _=opt.step(cost, weights, bias, X_batch, Y_batch)
 
     # Compute accuracy
     predictions= [np.sign(variational_classifier(weights, bias, x)) forxinX_train]
     acc=accuracy(Y_train, predictions)
 
     print(
         "Iter: {:5d} | Cost: {:0.7f} | Accuracy: {:0.7f} ".format(
             it+1, cost(weights, bias, X_train, Y_train), acc
         )
     )
 
 X_test=np.array(X_test.values, requires_grad=False)
 Y_test=np.array(y_test.values*2-np.ones(len(y_test)), requires_grad=False)
 
 predictions= [np.sign(variational_classifier(weights, bias, x)) forxinX_test]
 
 accuracy_score(Y_test, predictions)
 precision_score(Y_test, predictions)
 recall_score(Y_test, predictions)
 f1_score(Y_test, predictions, average='macro')

最后得到的结果如下:

 Accuracy: 78.89%
 Precision: 76.67%
 Recall: 65.71%
 F1: 77.12%

为了比较,我们使用经典的逻辑回归作为对比,

 Accuracy: 75.56%
 Precision: 69.70%
 Recall: 65.71%
 F1: 74.00%

可以看到VQC比逻辑回归模型稍微好一点!这并不意味着VQC一定更好,因为只是这个特定的模型和特定的优化过程表现得更好。但这篇文章的主要还是是展示构建一个量子分类器是很简单的,并且是有效的。

总结

VQC算法需要同时利用经典资源和量子资源。经典部分处理优化和参数更新,而量子部分在量子态上执行计算。VQC的性能和潜在优势取决于诸如分类问题的复杂性、量子硬件的质量以及合适的量子特征映射和量子门的可用性等因素。

最重要的是:量子机器学习领域仍处于早期阶段,VQC的实际实现和有效性目前受到构建大规模、纠错的量子计算机的挑战所限制。但是该领域的研究正在不断进行,量子硬件和算法的进步可能会在未来带来更强大和高效的量子分类器。

https://avoid.overfit.cn/post/5c39cdddb6cb4111ab9e776f26d89ce5

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

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

相关文章

【Python】一文带你了解并使用 Json 模块

作者主页&#xff1a;爱笑的男孩。的博客_CSDN博客-深度学习,活动,python领域博主爱笑的男孩。擅长深度学习,活动,python,等方面的知识,爱笑的男孩。关注算法,python,计算机视觉,图像处理,深度学习,pytorch,神经网络,opencv领域.https://blog.csdn.net/Code_and516?typeblog个…

【历史上的今天】6 月 13 日:分组交换网路的“亲子纠纷”;博弈论创始人出生;交互式电视初现雏形

整理 | 王启隆 透过「历史上的今天」&#xff0c;从过去看未来&#xff0c;从现在亦可以改变未来。 今天是 2023 年 6 月 13 日&#xff0c;知名的 ENIAC 建造者约翰莫克利在历史上的这一天参观了 ABC 计算机&#xff0c;与 ABC 的设计者之一阿塔纳索夫会面。这次会面后来牵扯…

java发送QQ邮箱验证码实现登录注册、邮箱验证码防刷校验

文章目录 一&#xff1a;前台功能实现1.1 页面编写1.2 发送验证码——sendEmailCode1.2.1 远程调用发送接口1.2.1 接口防刷校验——60s内只能发送一次 二&#xff1a;获取QQ邮箱授权码2.1 登录QQ邮箱2.2 开启SMTP权限2.2.1 设置2.2.2 账户2.2.3 管理服务2.2.4 生成授权码2.2.5 …

新能源商用车:老玩家、新势力“争先恐后”

现如今&#xff0c;作为重要出行交通工具之一的汽车&#xff0c;已经在人们日常生活中扮演着愈发重要的角色。不仅如此&#xff0c;汽车行业也发生了不小的变化&#xff0c;新能源汽车的热度更是居高不下。除了各路玩家积极布局之外&#xff0c;新能源汽车的销量也是持续走高。…

python---列表和元组(1)

变量就是内存空间,用来表示/存储数据. 如果表示的数据少,直接定义几个变量就行了. 但是有的时候表示的数据比较多,就很麻烦 在python中就有列表和元组,就是这样的机制,可以用一个变量表示很多的数据. 这就类比于其他编程语言中的"数组" 列表和元组大部分的功能是差…

智安网络|深谈网络安全难点的根源和解决之道

随着数字化和网络化的加速发展&#xff0c;人们面临的网络安全问题日益增多。由于网络安全威胁的多样性和复杂性&#xff0c;网络安全防护变得越来越困难。本文将从几个方面来探讨网络安全难点的根源和解决之道。 一. 网络安全威胁的复杂性 网络安全威胁种类繁多&#xff0c;主…

Junit执行器Runner探索之旅 | 京东云技术团队

单元测试是每个程序员必备的技能&#xff0c;而Runner是每个单元测试类必有属性。本文通过解读Junit源码&#xff0c;介绍junit中每个执行器的使用方法&#xff0c;让读者在单元测试时&#xff0c;可以灵活的使用Runner执行器。 一、背景 在今年的敏捷团队建设中&#xff0c;…

07 lvgl-边框样式

void lv_100ask_demo_course_2_1_1(void){ static lv_style_t style;lv_style_init(&style);/*Set a background color and a radius*/lv_style_set_radius(&style, 5); //半径lv_style_set_bg_opa(&style, LV_OPA_COVER); //透明度lv_style_set_bg_color(&st…

xlsx是什么格式的文件?xlsx文件删除了怎么恢复

如果您在工作中不小心删除了重要的xlsx文件怎么办&#xff1f;xlsx文件删除了怎么恢复&#xff1f;本文将介绍如何在不同情况下恢复xlsx文件的实用技巧&#xff0c;帮助您有效的找回文件。 第一部分&#xff1a;xlsx是什么格式的文件 XLSX是一种电子表格文件格式&#xff0c;…

JAVA 实现 Redis 发布订阅

Redis 发布订阅 发布订阅&#xff1a;消息发布者发布消息 和 消息订阅者接收消息&#xff0c;两者之间通过某种媒介联系起来 例如订杂志&#xff0c;当自己订阅了爱格杂志&#xff0c;每个月会发刊一本。到发布的时候派送员将杂志送到自己手上就能看到杂志内容。只有我们订阅了…

为什么美颜插件比传统集成方式更快?

都说云市场插件快&#xff0c;快在哪里呢&#xff1f; 美颜功能是实时互动应用的基础功能&#xff0c;广泛应用在社交、直播、约会、会议等场景&#xff0c;开发者们往往在集成美颜功能时候非常头疼。今天&#xff0c;我们来介绍云市场美颜插件相比传统的裸数据集成方式快在哪…

Unity与原生交互之Unity篇——AndroidStudio导出aar/jar包供Unity使用实现交互全流程(2)

序言:此篇介绍在(1)的基础上引入Unity的API库进行交互,原生调Unity 1.导入Unity库 注意: (1)老版本Unity的classes.jar里包含UnityPlayerActivity API (2)新版本Unity的UnityPlayerActivity API 在UnityEditor安装路径中,需单独导入,后续介绍 1.1导入unity的classes.jar …

Seesion会话超时时间测试-业务安全测试实操(3)

Seesion会话超时时间测试, Cookie仿冒测试, 密文比对认证测试 本地加密传输测试-业务安全测试实操(2)_luozhonghua2000的博客-CSDN博客 测试原理和方法 在用户成功登录系统获得Session认证会话后,该Session认证会话应具有生命周期,即用户在成功登录系统后,如果在固定时间内…

反汇编逆向实战——扫雷辅助制作

一、编程前准备 刚开始是预备知识&#xff0c;如果熟悉的话&#xff0c;可以直接跳到第二部分阅读 在 Windows API 中&#xff0c;SetTimer 函数用于创建一个定时器&#xff0c;并在指定的时间间隔后触发一个定时器消息。以下是关于 SetTimer 函数的介绍&#xff1a; 功能&a…

接口文档设计注意事项

接口名称清晰 一般接口url要求能看得出接口的作用。比如说&#xff0c;查询用户信息&#xff08;queryUserInfo&#xff09;&#xff0c;就是一个不错的接口名称。 接口地址完整 接口的地址&#xff0c;也叫接口的URL地址。即别人调用你的接口&#xff0c;用的是什么URL。比…

【Unity Shader】入门到惊叹(1)基本概念:什么是网格?材质?Shader?

文章目录 一、什么是网格(Mesh)?二、什么是MeshFilter(网格过滤器)?三、什么是MeshRenderer(网格渲染器)?四、什么是材质(Material)?五、什么是Shader(着色器)?一、什么是网格(Mesh)? 如图,模型的三角形面就叫做网格(Mesh),它的本质是一堆顶点数据的规则排…

华为OD机试真题 JavaScript 实现【按身高和体重排队】【2022Q4 100分】,附详细解题思路

一、题目描述 某学校举行运动会&#xff0c;学生们按编号(1、2、3…n)进行标识&#xff0c;现需要按照身高由低到高排列&#xff0c;对身高相同的人&#xff0c;按体重由轻到重排列&#xff1b; 对于身高体重都相同的人&#xff0c;维持原有的编号顺序关系。请输出排列后的学生…

医械围城的觉醒时刻:从“乱世枭雄” 到“剩者为王”

我们现在看到医疗器械行业其实非常的热&#xff0c;不管是投资&#xff0c;还是创业&#xff0c;还有各种跨界进来打劫想分一杯羹的。 但是这个行业是不是一个围城&#xff1f; 真的是进来就可以捡钱吗&#xff1f; 在一片繁荣的景象下&#xff0c;企业的发展存在什么风险&a…

STM32FreeRTOS操作系统移植

移植好的FreeRTOS模板&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1_87VQAWXUl4jTqSCZ0MFjw?pwddw52 提取码&#xff1a;dw52 1.在工程中新建FreeRTOS文件夹 2.把源码source里面的文件全部粘贴进FreeRTOS文件夹中 3.在portable文件中只保留一下文件&#xff0c;…

【剑指offer刷题记录 java版】数组双指针 之 二分搜索

本系列文章记录labuladong的算法小抄中剑指offer题目 【剑指offer刷题记录 java版】数组双指针 之 二分搜索 剑指 Offer 53 - I. 在排序数组中查找数字 I剑指 Offer II 068. 查找插入位置剑指 Offer 04. 二维数组中的查找剑指 Offer II 069. 山峰数组的顶部剑指 Offer II 073. …