【视频讲解】Python量子计算聚类Q-means:量子k-means算法分析电路数据实现可视化

news/2024/10/9 0:12:05

全文链接:https://tecdat.cn/?p=37821

原文出处:拓端数据部落公众号

分析师:Yifan Zhang

量子计算在近期已然成为一个频繁出现的热门概念。尽管它在大众认知以及互联网社区中备受瞩目,热度极高,然而就其实际能力而言,当前仍然存在诸多局限。

量子计算作为一个全新的领域,带来了相较于传统经典计算模式的重大范式转变。在量子计算的体系中,传统的 0 或 1 的经典比特被一种具有特定概率值的量子比特所替代。

由于量子比特具备特殊的量子态性质,所以每当对其进行测量时,它会依据一定的概率呈现出 0 或 1 的状态。例如,当一个量子比特处于 0.85 : 0.15 这样的状态时,那么我们大致可以预估它有 85% 的可能性在测量时结果为零,而有 15% 的可能性测量结果为 1。

虽然量子计算的发展道路依旧漫长,但机器学习无疑是其极具发展前景的潜在应用方向。以下几个示例能够帮助我们初步了解量子计算所具备的计算能力:

其一,一个量子比特能够同时包含 0 和 1 这两种状态。相应地,两个量子比特就可以保存四种值状态,即 00、01、10 和 11;三个量子比特则能够达到八种状态,以此类推。

其二,从理论上来说,n 个量子比特所包含的信息量等同于 2n 个经典比特。

此外,量子电路所具有的流体概率性质或许能够为深度学习带来独特的优势。要知道,深度学习本身就从网络中的概率流以及信息转换过程中获益匪浅。

当前,量子机器学习这一概念正逐渐流行起来。例如,TensorFlow 作为谷歌公司著名的深度学习框架,近期也推出了其量子版本 ——“TensorFlow Quantum”。

本文着重探讨量子版本的 k - means 算法(Q - means),旨在借助量子计算的优势提升聚类算法的性能,通过 Qiskit 模拟器来近似计算距离,进而为无监督机器学习提供全新的解决方案。文中详细阐述了 Q - means 算法的原理以及具体的实现步骤,并且将其与传统的 k - means 算法进行了对比,实验结果充分展示了 Q - means 算法的有效性以及潜在应用价值。

引言

随着信息技术发展,数据规模与复杂性增加,传统机器学习算法处理大规模数据面临挑战。量子计算具强大并行计算能力与潜在指数级加速优势,为解决复杂机器学习问题提供新思路。k-means 算法是经典无监督机器学习算法,广泛用于数据聚类等领域,但传统算法处理大规模数据效率低且易陷局部最优。Q-means 利用量子计算优势克服传统算法问题。

k-means 算法概述

(一)数据准备
从 “.csv” 文件读取数据,转换分类数据为数字,将数据框转为 numpy 矩阵。

 
  1.  
    df["Class"] = pd.Categorical(df["Class"])
  2.  
    df["Class"] = df["Class"].cat.codes
  3.  
    data = df.values[:, 0:2]
  4.  
    category = df.values[:, 2]
 

(二)参数设置

  1. 设置聚类数k = 3,确定训练数据数n与数据特征数c
  2. 生成随机中心,用均值和标准差确保代表整个数据集。
 
  1.  
    mean = np.mean(data, axis = 0)
  2.  
    std = np.std(data, axis = 0)
  3.  
    centers = np.random.randn(k,c)*std + mean
 
  1. 提供静态数据测试。
centers = np.array([[-0.25, 0.2], [0, -0.1], [0.25, 0.35]])

(三)绘制初始数据和中心
用不同颜色表示不同类别,绘制数据点与中心。

 
  1.  
    colors=['green', 'blue', 'black']
  2.  
    for i in range(n):
  3.  
    plt.scatter(data[i, 0], data[i,1], s=7, color = colors[int(category[i])])
  4.  
    plt.scatter(centers[:,0], centers[:,1], marker='*', c='g', s=150)
 

 

 

(四)迭代更新中心

  1. 初始化旧中心为全零矩阵,新中心为初始中心深拷贝。
  2. 计算数据点到每个中心距离。
  3. 将数据点分配到最近中心。
  4. 计算每个簇新中心,即该簇数据点均值。
  5. 计算新中心与旧中心误差,当误差为零停止迭代。
 

Q-means 算法原理

Q - means 算法是一种用于聚类的量子算法,是经典 k - means 算法的量子版本。以下是其详细原理介绍:

1. 总体流程

Q - means 算法在高层次上遵循与经典 k - means 算法相似的步骤,包括初始化中心点、将数据点分配到最近的中心点所属的簇以及更新中心点等操作。但在具体实现中,使用了量子子例程进行距离估计、寻找元素中的最小值、通过矩阵乘法获取作为量子态的新中心点以及进行高效的量子态层析成像(tomography)来获取经典的中心点描述。

2. 距离估计(Centroid distance estimation)

  • 目的:估计数据点与簇之间的平方距离。
  • 方法
    • 利用量子过程进行估计,可以使用如 Swap Test 或 Frobenius 距离估计程序。对于 Q - means 算法,由于需要处理不同范数的向量间的距离或内积估计,首先估计对应于归一化向量的量子态之间的内积,然后将估计值乘以向量范数的乘积来得到未归一化向量的内积估计值,类似地可用于平方距离估计。
    • 具体地,假设有数据矩阵 V(是一个 N×d 的矩阵,N 表示数据点数量,d 表示数据维度)和质心矩阵 C(是一个 k×d 的矩阵,k 表示簇的数量)存储在 QRAM 中,且已知向量的范数以及某些特定的酉变换(unitaries)可以在时间 O (log (N×d)) 内执行,对于任意大于 0 的 Δ 和大于 0 的 epsilon1,存在一个量子算法执行特定映射,使得 | d2 (vi, cj) 的估计值 - d2 (vi, cj)| ≤ epsilon1 的概率至少为 1 - Δ,运行时间为 O (k×(eta /epsilon1)×log (1 / Δ)),其中 eta = maxi (||vi|| 的平方),||vi|| 表示向量 vi 的范数。

3. 簇分配(Cluster assignment)

  • 目的:根据距离估计结果,将每个数据点分配到最近的质心所属的簇。
  • 方法
    • 在步骤 1 结束时,已经在不同寄存器中相干地估计了数据集中每个点与 k 个质心之间的平方距离。由于平方是单调函数,不需要计算距离的平方根即可找到距离每个数据点最近的质心索引。
    • 通过一个量子电路(Circuit for finding the minimum)来实现找到最小距离对应的索引。给定 k 个不同的 log p - bit 寄存器,存在一个量子电路可以在时间 O (k×log p) 内找到这些寄存器中值的最小值索引。

4. 质心状态创建(Centroid states creation)

  • 目的:根据簇分配结果,计算新的质心状态。
  • 方法
    • 首先定义特征向量 chi_j_t(是一个 N 维向量),它表示在迭代 t 时簇 j 的特征向量(经过归一化)。根据 k - means 算法更新质心的规则 c_j_(t + 1) =(1 / |C_j_t|)×sum (i 属于 C_j_t) vi,可以得到 c_j_(t + 1) = V 的转置 ×chi_j_t。
    • 通过测量相关寄存器,可以从状态 x_j_t 中采样,然后利用量子矩阵乘法 V 的转置来恢复近似的质心状态 c_j_(t + 1),同时可以得到质心范数的估计值,误差分别为 epsilon2 和 epsilon3。

5. 质心更新(Centroid update)

  • 目的:将量子态表示的质心转换为经典描述的质心,以便进行下一次迭代。
  • 方法
    • 对步骤 3 中创建的质心状态 c_j_(t + 1) 应用向量态层析成像算法(vector state tomography)。对于每个 j 属于 k,需要多次调用创建 c_j_(t + 1) 的酉变换来实现 ||c_j - c_j 的估计值 || < epsilon4,总共需要调用 O ((k×(log k)×d×(log d)) / (epsilon4 的平方)) 次。
    • 向量态层析成像给出单位范数质心的经典估计值,误差在 epsilon4 范围内。结合质心范数的估计值(相对误差为 epsilon3),可以恢复质心向量,并且满足 ||c_j 的估计值 - c_j|| ≤sqrt (eta)×(epsilon3 + epsilon4)=epsilon_centroids,其中 eta 的定义同上。

(一)数据准备和参数设置

与 k-means 类似,读取数据、转换数据、设置参数。

(二)定义距离计算函数
point_centroid_distances函数计算数据点到多个中心距离。

  1. 计算相位和角度。
  2. 创建量子寄存器和经典寄存器,构建量子电路。
 
  1.  
    qreg = QuantumRegister(3, 'qreg')
  2.  
    creg = ClassicalRegister(1, 'creg')
  3.  
    qc = QuantumCircuit(qreg, creg, name='qc')
  4.  
    backend = Aer.get_backend('qasm_simulator')
 
  1. 通过量子门操作实现编码和距离计算。
 
  1.  
    qc.h(qreg[2])
  2.  
    qc.u3(theta_list[0], phi_list[0], 0, qreg[0])
  3.  
    qc.u3(theta_list[i], phi_list[i], 0, qreg[1])
  4.  
    qc.cswap(qreg[2], qreg[0], qreg[1])
  5.  
    qc.h(qreg[2])
  6.  
    qc.measure(qreg[2], creg[0])
 
  1. 测量辅助量子比特,统计结果得到距离。
 

(三)迭代更新中心
与 k-means 类似,不断迭代更新中心,直到中心估计值不变。

 
  1.  
    centers_old = np.zeros(centers.shape)
  2.  
    centers_new = deepcopy(centers)
  3.  
    data.shape
  4.  
    clusters = np.zeros(n)
  5.  
    distances = np.zeros((n,k))
  6.  
    error = np.linalg.norm(centers_new - centers_old)
 

四、实验结果与分析

(一)绘制数据和中心
展示算法聚类结果。

 
  1.  
    for i in range(n):
  2.  
    plt.scatter(data[i, 0], data[i,1], s=7, color = colors[int(category[i])])
  3.  
    plt.scatter(centers_new[:,0], centers_new[:,1], marker='*', c='g', s=150)
 
 

量子聚类算法可视化及电路实现

数据准备与特征编码

(一)数据读取与预处理
从 “.csv” 文件读数据,转换分类数据为数字编码,转为 numpy 矩阵。

(二)定义特征编码函数
encode_feature函数将数据特征值映射为角度和相位值。

 
  1.  
    def encode_feature(x):
  2.  
    return ((x + 1) * pi / 2)
 

(三)确定数据点和质心
设置数据点坐标,定义质心数组,计算相位和角度值。

三、量子寄存器与电路构建

(一)创建量子寄存器
根据需求创建三个量子寄存器。

 
  1.  
    qreg_input = QuantumRegister(k, name='qreg_input')
  2.  
    qreg_centroid = QuantumRegister(k, name='qreg_centroid')
  3.  
    qreg_psi = QuantumRegister(k, name='qreg_psi')
 

(二)创建经典寄存器
创建经典寄存器存储测量结果。

creg = ClassicalRegister(k, 'creg')

(三)构建量子电路
使用寄存器构建量子电路。

 
 

(二)量子电路可视化
绘制量子电路,设置背景颜色和样式。

 
  1.  
    style = {'backgroundcolor': '#DFEAEC', 'showindex': False, 'displaycolor': {
  2.  
    'id': 'red', 'meas':'#0066DA', 'h': '#00DAA7', 'u3': '#EFFF1B'} }
  3.  
    qc.draw(output='mpl', style=style, reverse_bits= False,filename="d2.png",scale=1.2)
 

(三)确定数据点类别

  1. 量子算法确定类别
 
  1.  
    results_list = []
  2.  
    for i in range(1, 4):
  3.  
    qc.h(qreg[2])
  4.  
    qc.u3(theta_list[0], phi_list[0], 0, qreg[0])
  5.  
    qc.u3(theta_list[i], phi_list[i], 0, qreg[1])
  6.  
    qc.cswap(qreg[2], qreg[0], qreg[1])
  7.  
    qc.h(qreg[2])
  8.  
    qc.measure(qreg[2], creg[0])
  9.  
    job = execute(qc, backend=backend, shots=1024)
  10.  
    result = job.result().get_counts(qc)
  11.  
    results_list.append(result['1'])
  12.  
    class_list = ['Green', 'Blue', 'Black']
  13.  
    quantum_p_class = class_list[results_list.index(min(results_list))]
 
  1. 经典欧氏距离计算确定类别
 
  1.  
    distances_list = [((x_p - i[0])**2 + (y_p - i[1])**2)**0.5 for i in [(xgc, ygc), (xbc, ybc), (xkc, ykc)]]
  2.  
    classical_p_class = class_list[distances_list.index(min(distances_list))]
 

结论

本文介绍量子聚类算法可视化与电路构建,展示量子计算在数据分类潜力。但量子计算处发展阶段,有技术挑战。

参考文献

Kerenidis et al. q-means: A quantum algorithm for unsupervised machine learning, 2018 https://arxiv.org/pdf/1812.03584.pdf

分析师

 

在此对Yifan Zhang对本文所作的贡献表示诚挚感谢,她完成了信息管理与信息系统专业的学位。擅长软件Java语言、SPSS,擅长领域包括数据采集、数据预处理、MySQL等,同时还擅长Python、Matlab仿真、视觉处理、神经网络、数据分析。

 

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

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

相关文章

20222417 2024-2025-1 《网络与系统攻防技术》实验一实验报告

1.实验内容 (1).掌握反汇编与十六进制编程器 (2).能正确修改机器指令改变程序执行流程 (3).能正确构造payload进行bof攻击 2.实验过程 (1).直接修改程序机器指令,改变程序执行流程 将pwn1文件放入共享文件夹,后续在kali中使用,再将文件复制到实验文件夹share路径…

第一课 php基础语法 变量 函数

php语法<?php// 代码段   ?> php输出方法:echo 和 print不同点:echo-能够输出一个以上的字符串,英文逗号隔开print-只能输出一个字符串,并始终返回1echo 比 print 稍快,并且开销低 注释注释不会被作为程序来读取和执行。它唯一的作用是供代码编辑者阅读(让别人…

CentOS 8 停止维护后通过 rpm 包手动安装 docker

根据 Docker官方文档 的指引,进入 Docker rpm 包下载的地址,根据自己系统的架构和具体版本选择对应的路径这里我使用 https://download.docker.com/linux/centos/7/x86_64/stable 版本,根据 docker 官方的给出的安装命令选择性的下载对应的 rpm 包最终使用 yum 命令安装下载…

02 Vue默认项目说明

1. node_modules pnpm 安装的第三方依赖 2. public 公共资源,存放网页图标等 3. src 开发代码存放位置 3.1 项目入口文件 main.ts import { createApp } from vue // 引入vue import ./style.css // 引入默认样式 import App from ./App.vue // 引入页面 App.VuecreateApp(App…

深度学习环境配置

安装显卡驱动 安装显卡驱动: sudo apt install ubuntu-drivers-common # 安装 ubuntu-drivers 工具 ubuntu-drivers devices # 查看可用的 NVIDIA 驱动程序版本sudo ubuntu-drivers autoinstall # 自动安装推荐的驱动版本 sudo apt install nvidia-…

解构UI设计

解构UI设计 第一章 界面类型 1.1 闪屏页 又称为启动页,就是APP启动在进入功能主界面前用户看到的页面。 闪屏页决定了用户对App的第一印象。 闪屏页显示的时间很短,通常只有1秒。 闪屏页分为品牌宣传型、节日关怀型和活动推广型3种类型。 1.1.1 品牌宣传型 App的闪屏页是为体…

创建新的 App 页面

完整的页面创建过程包括三个步骤:在 layout 目录下创建 XML 文件创建与 XML 文件对应的 Java 代码在 AndroidManifest.xml 中注册页面配置实现两个 Activity 相互跳转的代码: MainActivity: package com.example.myapplication1;import androidx.appcompat.app.AppCompatActiv…

[Vue] 异步路由组件和非路由组件的区别?

异步路由组件 都知道异步路由组件通过 () => import("./views/Home.vue") 导入路由组件。 但是它怎么就按需加载资源、代码分割了? 不同的代码解析报告 非异步路由组件异步路由组件代码分析报告生成代码 pnpm install webpack-bundle-analyzerfile:[vue.config.j…