最前沿・量子退火建模方法(2) : Domain wall encoding讲解和python实现

前言

上篇讲的subQUBO属于方法论,这次讲个通过编码量子比特的方式,同样的约束条件,不同的编码,所需的量子比特数是不同的。有的编码方式,很节省量子比特。比如,这次要讲的Domain wall encoding。


一、Domain wall encoding是什么?

1.1 直觉上的理解

Domain wall的概念来自于物理学,具体的由来我还没有考古,等我有时间了再补充。

  • 它主要是可以用N-1位量子比特,来代表N位的One-hot编码。
  • 它的概念解释中用的变量是Ising machine的spin变量,也就是变量取值是+1或-1。

下面资料的图主要来自以下文章:

https://qiita.com/sotobenjamin0307/items/2cd329923fb3f0c03692
Domain-Wall / Unary Encoding in QUBO for Permutation Problems
https://ieeexplore.ieee.org/document/9951263

大家对比一下0~4的one-hot编码和Domain wall encoding的区别。

  • one hot编码,有几个数值,就需要几个量子比特。

在这里插入图片描述

  • Domain wall encoding,N个数值的话,就只需要N-1个spin。
    在这里插入图片描述

为什么4个量子比特可以代表5个数值呢?

  • 因为,它隐藏了首尾两个默认值,
  • 所以,就是它本来用了N+2个spin,所有会有N个边,就是下图中的竖线段的位置。
    就想象成,10个电线杆的话,需要8段线。

在这里插入图片描述

1.2 Domain wall encoding的数学定义

  • one hot编码的约束项,等价于下面的Domain wall encoding的约束项。

在这里插入图片描述

  • spin串里,从-1变为+1的位置下标数值i,就是该编码的代表的数值。(*满足该条件的位置仅存在一个)
    在这里插入图片描述
    下面的Domain wall value就是,上面👆约束项的最小值。可以代入验算一下。
    在这里插入图片描述

二、Domain wall encoding的python实现

1. 安装amplify库

pip install -U amplify

2.创建Domain wall约束

from amplify import domain_wall

gen = VariableGenerator()
q = gen.array("Binary", 4)
dw = domain_wall(q)

也可以换成Binary变量,具体约束项参考以下文档。

https://amplify.fixstars.com/en/docs/amplify/v1/constraint.html

在这里插入图片描述


总结

Domain wall encoding的概念并不难理解,但是网上资料太少了,搞懂也花了点时间,不过终于搞懂了,希望能帮到大家。还有更高级的Domain wall encoding在某些问题上可以缩减到正常one hot编码的几十分之一。以后有机会再介绍。

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
随机前沿 (Stochastic Frontier Analysis, SFA) 是一种经济学方法,用于测量生产效率。它是通过将产出看作是技术效率和随机误差的乘积,来估计生产函数的确定性 (技术效率) 和随机成分 (随机误差)。 在随机前沿SFA模型中,我们假设技术效率是未观测到的变量,并引入误差项来衡量技术效率的波动。 在Python实现随机前沿SFA模型,可以使用统计分析库statsmodels。首先,我们需要导入相应的库: ``` import numpy as np import pandas as pd from statsmodels.api import OLS from statsmodels.tools.tools import add_constant ``` 接下来,我们需要准备用于模型估计的数据。这些数据应该包含有关产出、输入和其他相关因素的信息。首先,我们创建一个DataFrame来存储这些数据: ``` data = pd.DataFrame({'output': [10, 12, 14, 16, 18], 'input1': [2, 3, 4, 5, 6], 'input2': [3, 4, 5, 6, 7], 'input3': [1, 2, 3, 4, 5]}) ``` 接下来,我们需要对输入变量进行对数变换,以取得更好的结果: ``` data['log_input1'] = np.log(data['input1']) data['log_input2'] = np.log(data['input2']) data['log_input3'] = np.log(data['input3']) ``` 随后,我们需要定义模型并拟合数据: ``` model = OLS(data['output'], add_constant(data[['log_input1', 'log_input2', 'log_input3']])) result = model.fit() ``` 最后,我们可以通过result.summary()方法来查看模型的拟合结果: ``` print(result.summary()) ``` 以上就是用Python实现随机前沿SFA模型的简单步骤。当然,在实际应用中,我们还需要考虑模型的假设前提、数据的准备和模型的验证等方面。在这里,我们只演示了最基本的代码实现。希望这能对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值