【代码贡献】优化量子核矩阵与量子距离计算:去除采样噪声、复用模拟器并修复多处缺陷 - #56
Open
HongbinGu wants to merge 3 commits into
Open
Conversation
- 修复 show_res() 绘图网格越界:原实现两个 np.linspace 均使用 min(x[:,0]) 与 max(x[:,1]),第 0 维上界取自第 1 维 - dist() 不再每次调用新建 CPUQVM,整个核矩阵复用同一个模拟器 (20x20 核矩阵由 400 次构造降为 1 次) - k_kernel() 对对称矩阵只计算上三角并镜像,fit 阶段约省一半线路模拟 - 抽出 _fit() 供 get_res()/show_res() 共用,消除重复的 SVR 拟合 - 移除未使用的导入 train_test_split/mean_squared_error/r2_score - 补充核矩阵数值性质与绘图网格回归测试
- _run_circuit() 去掉 measure 指令,改用态矢量精确概率; 原实现 1024 次采样导致核矩阵每次运行结果不同(实测两次差异 5.26e-02) - 整个核矩阵复用同一个 CPUQVM(15x15 由 105 次构造降为 1 次) - 对称矩阵的 PSD 投影改用 np.linalg.eigh(原 np.linalg.eig 返回复数 dtype,且投影后对角线偏离 1、出现大于 1 的"概率"); 投影后 clip 到 [0,1] 并恢复单位对角线 - 修复非对称调用(指定 y_vec)时相同样本对的保真度被跳过而留 0 的问题 - _build_circuit() 的纠缠块硬编码 CNOT(qlist[0], qlist[1]), n_qbits != 2 会静默产生错误核矩阵,现显式抛出 ValueError - 移除裸 except 与魔数 0.0001 - 补充对称性/单位对角线/确定性/值域/n_qbits 校验/单模拟器复用等回归测试
- 移除 _QuantumKmeansCircuit() 中被无条件调用的 draw_qprog(): 该函数返回线路图字符串而调用方未使用返回值,等于每个 (样本 x 质心)组合都白算一次 - 去掉 measure 指令,ancilla 概率由 1024 次采样值(如 0.7939453125 = 813/1024)改为精确值;12 点/k=2 耗时 0.038s 降至 0.0040s - fit() 全程复用同一个 CPUQVM(原每个组合新建一个,48 次降为 1 次) - _point_centroid_distances() 缩进由 2 空格修正为 4 空格(PEP8) - test/pytest.ini:testpaths 中 QRAM 为拼写错误(真实目录为 QARM), pytest 对不存在的路径静默忽略,导致 QARM 测试从未被执行; 修正为 QARM 并补入 QKmeans - 新增 test/QKmeans/Test_qkmeans.py(该模块此前无任何单元测试)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
变更动机
QSVM、QSVR、QKmeans三个机器学习类模块在构建量子核矩阵 / 计算量子距离时,存在同一类实现问题:逐点新建模拟器、用有限次采样代替精确态矢量,以及若干处会导致静默错误结果的 Bug。本 PR 在不改变任何公开 API 的前提下,统一修复这些问题。所有改动均为 drop-in 替换:类名、方法名、参数、返回类型保持不变。
一、
QSVM/quantum_kernel_svm.py_run_circuit()每个矩阵元都新建一个CPUQVMmeasure,概率来自 1024 次采样,核矩阵每次运行都不同np.linalg.eig作用于实对称矩阵,返回复数 dtype;投影后对角线不再为 1,甚至出现 >1 的"概率"np.linalg.eigh;投影后clip到[0,1]并恢复单位对角线y_vec)时,若某测试点与训练点完全相同,该处保真度被跳过而留 0(应为 1)_build_circuit()暴露n_qbits参数,但纠缠块硬编码CNOT(qlist[0], qlist[1]),传入n_qbits != 2会静默给出错误核矩阵ValueError(n_qbits=None同样报错,此前会在"0" * None处崩溃)except:裸捕获,异常时把概率静默置为魔数0.0001二、
QSVR/QSVR.pydist()每次调用都新建CPUQVM(20×20 核矩阵 = 400 次)k_kernel()对对称矩阵重复计算整个下三角sklearn在fit阶段正是这种情况),约省一半线路模拟x0_test与x1_test两个np.linspace都写成min(x[:,0])→max(x[:,1]),第 0 维的上界取自第 1 维get_res()/show_res()各自重复构建并训练一次 SVR_fit()共用train_test_split、mean_squared_error、r2_score三、
QKmeans/QuantumKmeans.pydraw_qprog(prog)——该函数返回线路图字符串,而返回值被直接丢弃,等于每个(样本 × 质心)组合白算一次CPUQVMfit()全程复用同一个模拟器measure,ancilla 概率为 1024 次采样值(如0.7939453125 = 813/1024),边界样本的簇归属会抖动_point_centroid_distances()使用 2 空格缩进,违反 PEP8四、
test/pytest.initestpaths中写的是QRAM,而真实目录名是QARM。pytest 对不存在的路径静默忽略,导致test/QARM/Test_qarm.py从未被执行QARMQKmeans未纳入收集范围QKmeans五、新增 / 扩充的单元测试
test/QKmeans/Test_qkmeans.py(新增,该模块此前无任何测试):概率归一化、精确性、可复现性、相同态距离为 0、单一模拟器复用、聚类形状与簇数。test/QSVM/Test_qsvm.py(扩充):对称性与单位对角线、确定性、实数值与值域、非对称分支相同行、n_qbits校验、单一模拟器复用、作为sklearn核回调可用。test/QAlgBase/Test_class_qsvr_Quantum_SVR.py(扩充):核矩阵性质、dist对称性、单一模拟器复用,以及针对show_res网格越界的回归测试。验证数据
环境:Windows 10 / Python 3.13.14 / pyqpanda3 0.4.1。
性能与模拟器实例化次数
CPUQVM数值正确性
max|diag - 1|complex128float64max|K - Kᵀ|0.7939453125(= 813/1024,采样值)测试套件
QARM被静默跳过)兼容性
QuantumKernel_vqnet(n_qbits!=2)现在显式报错。此前该输入会静默产生错误的核矩阵,因此这一变化只影响本来就不正确的结果。_run_circuit的返回值由「计数字典」改为「精确概率字典」,调用方evaluate已同步更新。备注(未在本 PR 修改)
pyqpanda_alg.QKmeans.QuantumKmeans这一属性被QKmeans/__init__.py导出的同名类遮蔽,导致import pyqpanda_alg.QKmeans.QuantumKmeans as m拿到的是类而非模块。修正它需要重命名模块或类,属破坏性变更,故本 PR 未改动,仅在测试中通过sys.modules规避。