隐私计算 2.9 秘密共享应用于横向联邦学习

1 简介

1.1 横向联邦学习

横向联邦学习也称为按样本划分的联邦学习,主要应用于各个参与方的数据集有相同的特征空间和不同的样本空间的场景,例如两个地区的城市商业银行可能在各自的地区拥有非常不同的客户群体,所以他们的客户交集非常小,并且数据集有不同的样本ID,然而他们的业务模型却非常相似,因此他们的数据集的特征空间是相同的。由此,这两家银行就可以联合起来进行横向联邦学习以构建更好的风控模型。

1.2 相关工作

谷歌联邦学习研发团队在ACM CCS 2017学术大会上提出的一种高效的安全聚合方法,利用秘密共享技术使服务器能够安全地聚合来自不同用户的梯度,同时单个用户的梯度不会被泄露。
Practical secure aggregation for privacy-preserving machine learning
源代码见:https://github.com/ammartahir24/SecureAggregation

2 Practical secure aggregation for privacy-preserving machine learning分析

2.1 论文的动机

机器学习模型通常会包含大量的神经网络参数,而在联邦学习的场景中,用户在本地训练好模型后,需要将这些参数上传至服务器进行聚合,但直接上传是存在隐私泄露的风险的,因此需要将所有参数进行加密再进行聚合。

我们知道加密解密的运算时间是不容忽视的,特别是在训练深度学习神经网络时,模型参数可能达到上千个甚至上万个,对这些模型参数加密并满足同态的性质是一个极具挑战的任务。

2.2 贡献

  • (1)支持高维向量的加密;
  • (2)即使每一轮有新的用户加入,该方案也能保持高效的通信;
  • (3)能够应付用户掉线的情况;
  • (4)在以服务器为中介的、未经身份验证的网络模型的约束下提供最强的安全性。

2.3 预备知识

将涉及到秘密共享、密钥协商、认证加密、伪随机数生成、数字签名、公钥基础设施等知识。

2.3.1 Key Agreement 密钥协商

核心为Diffie-Hellman密钥交换,两个用户可以协商一个共享密钥:

  • KA.param⁡(k)\operatorname{KA.param} (k)KA.param(k):生成一些公共参数 ppp ppp
  • KA.gen⁡(pp)\operatorname{KA.gen} (p p)KA.gen(pp) :参与方 uuu 根据 ppp ppp 生成私-公密钥对 (suSK,suPK)\left(s_{u}^{S K}, s_{u}^{P K}\right)(suSK,suPK)
  • KA.agree⁡(suSK,svPK)\operatorname{KA.agree} \left(s_{u}^{S K}, s_{v}^{P K}\right)KA.agree(suSK,svPK):用户使用自身的私钥 suSKs_{u}^{S K}suSK 和所有其他用户 vvv 的公钥 svPKs_{v}^{P K}svPK 生成 uuuvvv 之间的私有共享密钥 su,vs_{u, v}su,v 。 在DH密钥协商中使用了哈希函数的密钥协商方案。

2.3.2 Secret Sharing 秘密共享

核心为shamir的(t,n)(t, n)(t,n)秘密分享方案,将要分享的秘密参数sss通过多项式分成nnn份,只有满足至少ttt份份额才可解密得到sss

  • SS.share⁡(s,t,U)\operatorname{SS.share} (s, t, \mathcal{U})SS.share(s,t,U):共享算法,输入为秘密 sss ,代表用户ID的 nnn 个域元素的集合 U\mathcal{U}U ,和一个阈值 t≤∣U∣t \leq|\mathcal{U}|tU ,输出为共享 sus_{u}su 的集合,其中 u∈Uu \in \mathcal{U}uU
  • SS.recon⁡({(u,su)}u∈V,t)\operatorname{SS.recon}\left(\left\{\left(u, s_{u}\right)\right\}_{u \in \mathcal{V}}, t\right)SS.recon({(u,su)}uV,t):重构函数,输入为阈值 ttt ,参与共享的用户子集 V⊆U\mathcal{V} \subseteq \mathcal{U}VU 且满足 ∣V∣≥t|\mathcal{V}| \geq tVt ,输出为域元素 sss

2.3.3 加密、哈希、签名

PRG可以理解为Hash,加密和签名为密码学基本工具。

  • 加密:
    AE.enc⁡\operatorname{AE.enc}AE.enc:认证加密的加密算法,输入为密钥key和消息message,输出为密文ciphertext。
    AE.dec⁡\operatorname{AE.dec}AE.dec:认证加密的解密算法,输入为密文ciphertext和密钥key,输出为原始明文或者是错误一个符号。
  • 哈希:
    PRG⁡(b)\operatorname{P R G}(b)PRG(b):以 bbb 为随机种子的伪随机数生成算法。
  • 签名机制:
    SIG.gen⁡(k)\operatorname{SIG.gen} (k)SIG.gen(k):以安全参数 kkk 作为输入,输出为一个私钥 dSKd^{S K}dSK 和一个公钥 dPKd^{P K}dPK
    SIG.sign⁡(dSK,m)\operatorname{SIG.sign} \left(d^{S K}, m\right)SIG.sign(dSK,m):以私钥 dSKd^{S K}dSK 和消息 mmm 作为输入,输出为签名 σ\sigmaσ
    SIG.ver⁡(dPK,m,σ)\operatorname{SIG.ver} \left(d^{P K}, m, \sigma\right)SIG.ver(dPK,m,σ) :输入为公钥 dPKd^{P K}dPK ,消息 mmm 和签名 σ\sigmaσ ,验证签名的合法性。

2.4 协议构造

该方案假设用户id有序,且以下算法是以单次聚合的角度进行讨论,但我们知道机器学习需要多次聚合才能收敛到阈值,因此以下讨论的步骤需要在每一次聚合时执行。

2.4.1 加密构思

加密的设计方案如下所示:
yu=xu+∑v∈U:u<vsu,v−∑v∈U:u>vsv,u(modR)\boldsymbol{y}_{u}=\boldsymbol{x}_{u}+\sum_{v \in \mathcal{U}: u<v} \boldsymbol{s}_{u, v}-\sum_{v \in \mathcal{U}: u>v} \boldsymbol{s}_{v, u}(\bmod R) yu=xu+vU:u<vsu,vvU:u>vsv,u(modR)
其中su,vs_{u, v}su,v 为用户 uuu 通过与每一个其他用户进行KA.agree⁡(suSK,svPK)\operatorname{KA.agree}( s_{u}^{S K}, s_{v}^{P K} )KA.agree(suSK,svPK) (Key Agreement)得到,若当前用户uuu的id大于vvv的id则加密时相加,否则相减。直观的可以得到,当所有用户上传参数后,这些加密 的参数自然而然能够抵消。
问题1: 这种方法显然存在问题,首先就是巨大的计算和通信开销,为了保证加密参数的随机性,这种 方法需要对每个模型参数都进行一次KA⁡\operatorname{KA}KA协商,那么通信代价为 O(N∗d)\mathbf{O}\left(\mathbf{N}^{*} \mathbf{d}\right)O(Nd) ,其中N\mathbf{N}N为用户总数, d\mathrm{d}d 为向量 维度(模型参数总数)。
解决方案1: 论文中对加密方式进行了改造,如下所示:
yu=xu+∑v∈U:u<vPRG⁡(su,v)−∑v∈U:u>vPRG⁡(sv,u)(modR)\boldsymbol{y}_{u}=\boldsymbol{x}_{u}+\sum_{v \in \mathcal{U}: u<v} \operatorname{PRG}\left(s_{u, v}\right)-\sum_{v \in \mathcal{U}: u>v} \operatorname{PRG}\left(s_{v, u}\right) \quad(\bmod R) yu=xu+vU:u<vPRG(su,v)vU:u>vPRG(sv,u)(modR)
其中,PRG⁡\operatorname{PRG}PRG就代表哈希,这个式子含义为当所有用户都使用同一个哈希函数并遵循一定的规则,就能实现每一对用户都只需要协商一次KA⁡\operatorname{KA}KA,并将该值哈希 d\mathrm{d}d 次实现加密式子的随机性,便能实现 O(N)\mathbf{O}\left(\mathbf{N}\right)O(N) 的 通信代价。
问题2: 如何解决掉线问题?
解决方案2: 论文使用了shamir大神的秘密共享方案,用户 uuu 将自己的私钥 suSKs_{u}^{S K}suSK 作为 秘密共享参数,把不同的份额分发给其他用户,在聚合阶段若用户 uuu 掉线,那么通过其他至少ttt个用 户便能恢复出密钥。
问题3: 看似已经解决了所有问题,但是考虑这种情况,若用户uuu很晩才将参数上传,但此时服务器判定用 户uuu已经掉线并让其他用户恢复了该用户的私钥,那么此时便能破解用户uuu的参数。考虑更坏的情 况,好奇的服务器可以撒谎用户uuu掉线,这样一来,方案还无法构成足够的安全。
最终方案:
yu=xu+PRG(bu)+∑v∈U:u<vPRG⁡(su,v)−∑v∈U:u>vPRG(sv,u)(modR)\begin{aligned} \boldsymbol{y}_{u}=\boldsymbol{x}_{u} &+\mathbf{P R G}\left(\boldsymbol{b}_{u}\right) \\ &+\sum_{v \in \mathcal{U}: u<v} \operatorname{PRG}\left(s_{u, v}\right) \\ &-\sum_{v \in \mathcal{U}: u>v} \mathbf{P R G}\left(s_{v, u}\right) \quad(\bmod R) \end{aligned} yu=xu+PRG(bu)+vU:u<vPRG(su,v)vU:u>vPRG(sv,u)(modR)
其中bub_{u}bu为用户uuu自行添加的秘密参数,和 sus_{u}su 一样需要将不同的份额分发给其他用户,但是区别就在于 bub_{u}bu是若用户uuu在线才恢复,而sus_{u}su 是用户uuu掉线时恢复,如此一来,一个诚实的用户 vvv便不会同时提交用户uuu的两个秘密份额。

2.4.2 方案具体流程

以用户uuu作为视角作为讨论,其余的用户uuu执行的操作与用户相同。
在这里插入图片描述

Setup
  • 各方都被赋予了安全参数 kkk , 用户数nnn 和一个门限值ttt , honestly generated pp←KA.gen⁡(k)p p \leftarrow \operatorname{KA.gen} (k)ppKA.gen(k) , 参数mmmRRR,则 ZRm\mathbb{Z}_{R}^{m}ZRm 是对输入进行采样的空间, 和一个用于秘密分享的字段F\mathbb{F}F 。所有用户还具有与服务器的私有身份验证通道。
  • 所有用户 uuu 都会从受信任的第三方收到他们的签名密钥 duSKd_{u}^{SK}duSK,以及绑定到每个用户身份 vvv 的验证密钥 dvPKd_{v}^{P K}dvPK
Round 0 (AdvertiseKeys)

在这里插入图片描述
用户uuu

  • 产生密钥对(cuPK,cuSK)←KA⁡⋅gen⁡(pp),(suPK,suSK)←KA⁡⋅gen⁡(pp)\left(c_{u}^{P K}, c_{u}^{S K}\right) \leftarrow \operatorname{KA} \cdot \operatorname{gen}(p p),\left(s_{u}^{P K}, s_{u}^{S K}\right) \leftarrow \operatorname{KA} \cdot \operatorname{gen}(p p)(cuPK,cuSK)KAgen(pp),(suPK,suSK)KAgen(pp)以及签名σu←SIG⁡⋅sign⁡(duSK,cuPK∥suPK)\sigma_{u} \leftarrow \operatorname{SIG} \cdot \operatorname{sign}\left(d_{u}^{S K}, c_{u}^{P K} \| s_{u}^{P K}\right)σuSIGsign(duSK,cuPKsuPK)
  • 将公钥及签名(cuPK∥suPK∥σu)\left(c_{u}^{P K}\left\|s_{u}^{P K}\right\| \sigma_{u}\right)(cuPKsuPKσu) 发送给服务器,服务器将公钥路由给其他用 户;
  • 其他用户拿到用户 uuu 的公钥后与自己的私钥 (cvSK,svSK)\left(c_{v}^{S K}, s_{v}^{S K}\right)(cvSK,svSK) 结合便能得到两个共享密钥: cu,vc_{u, v}cu,v 用来后续加密传输的信息,su,vs_{u, v}su,v 用来加密模型参数。

服务器:

  • 从上一轮的个人用户中收集至少 ttt 条消息(用U1\mathcal{U}_{1}U1表示这组用户)。 否则,中止;
  • U1\mathcal{U}_{1}U1 列表中的所有用户广播 {(v,cvPK,svPK,σv)}v∈U1\left\{\left(v, c_{v}^{P K}, s_{v}^{P K}, \sigma_{v}\right )\right\}_{v \in \mathcal{U}_{1}}{(v,cvPK,svPK,σv)}vU1;
Round 1 (ShareKeys)

在这里插入图片描述
bub_{u}busus_{u}su的秘密份额通过Round 0得到的cu,vc_{u, v}cu,v加密发送给对应的其他用户。
用户uuu

  • 接收由服务器广播得到的列表 {(v,cvPK,svPK,σv)}v∈U1\left\{\left(v, c_{v}^{P K}, s_{v}^{P K}, \sigma_{v}\right)\right\}_{v \in \mathcal{ U}_{1}}{(v,cvPK,svPK,σv)}vU1 。 判断以下条件是否满足:∣U1∣≥t\left|\mathcal{U}_{1}\right| \geq tU1t,所有的公钥对都是不同的,并且 ∀v∈U1,SIG.ver⁡(dvPK,cvPK∥svPK,σu)=1\forall v \in \mathcal{U}_{1} , \operatorname{SIG.ver} \left(d_{v}^{PK}, c_{v}^ {P K} \| s_{v}^{P K}, \sigma_{u}\right)=1vU1,SIG.ver(dvPK,cvPKsvPK,σu)=1
  • 采样一个随机元素 bu←Fb_{u} \leftarrow \mathbb{F}buF(用作 PRG 的种子);
  • 生成 t -out-of- ∣U1∣\left|\mathcal{U}_{1}\right|U1 suSKs_{u}^{SK}suSK 的份额:{(v,su,vSK)}v∈U1←SS.share⁡(suSK,t,U1)\left\{\left(v, s_{u, v}^{SK}\right)\right\}_{v \in \mathcal{U}_{1 }} \leftarrow \operatorname{SS.share}\left(s_{u}^{SK}, t, \mathcal{U}_{1}\right){(v,su,vSK)}vU1SS.share(suSK,t,U1);
  • 生成 t -out-of- ∣U1∣\left|\mathcal{U}_{1}\right|U1 bub_{u}bu 的份额:{(v,bu,v)}v∈U1←SS.share⁡(bu,t,U1)\left\{\left(v, b_{u, v}\right)\right\}_{v \in \mathcal{U}_{1}} \leftarrow \operatorname{SS.share}\left(b_{u}, t, \mathcal{U}_{1}\right){(v,bu,v)}vU1SS.share(bu,t,U1);
  • 对于每个其他用户 v∈U1\{u}v \in \mathcal{U}_{1} \backslash\{u\}vU1\{u} ,计算 eu,v←AE.enc⁡(KA.agree⁡(cuSK,cvPK),u∥v∥su,vSK∥bu,v)e_{u, v} \leftarrow \operatorname{AE.e n c}\left(\operatorname{KA.agree} \left(c_{u}^{SK}, c_{v}^{PK}\right), u\|v\| s_{u, v}^{SK} \| b_{u, v}\right)eu,vAE.enc(KA.agree(cuSK,cvPK),uvsu,vSKbu,v);
  • 如果上述任何操作(断言、签名验证、密钥协商、加密)失败,则中止;
  • 将所有密文 eu,ve_{u, v}eu,v 发送到服务器(每个都隐含地包含寻址信息 u,vu, vu,v 作为元数据);
  • 存储本轮收到的所有消息和生成的值,然后进入下一轮。

服务器:

  • 收集至少 ttt 个用户的密文列表(用 U2⊆U1\mathcal{U}_{2} \subseteq \mathcal{U}_{1}U2U1 这组用户表示);
  • 向每个用户 u∈U2u \in \mathcal{U}_{2}uU2 发送为其加密的所有密文: {eu,v}v∈U2\left\{e_{u, v}\right\}_{v \in \mathcal{U}_{2} }{eu,v}vU2 并进入下一轮。
Round 2 (MaskedInputCollection)

在这里插入图片描述

  • 从服务端收到其他用户发送给自己的秘密份额后,根据收到的用户列表,计算PRG⁡(su,v)\operatorname{PRG} \left(s_{u, v}\right)PRG(su,v)PRG⁡(bu)\operatorname{PRG}( b_{u} )PRG(bu),注意这是每个参数都需要哈希一次,保证每个位置上的参数加密的数都是随机的。
  • 计算完成后将加密后的参数上传给服务器。
Round 3

在这里插入图片描述

  • 服务器将收到的模型参数进行聚合并将掉线用户列表发送给所有用户,用户通过该列表上传掉线用户的秘密份额 sj′s_{j}^{\prime}sj 和在线用户的秘密份额 bi′b_{i}^{\prime}bi
  • 服务器收到至少ttt个用户上传的份额后恢复对应参数,得到聚合结果。

2.4.3 其它

从上述的方案我们可以得知,服务器主要做的路由的作用,完成用户之间信息的交换,因此服务器有能力对不同的用户宣称不同的用户掉线,借此来试图破解shamir秘密共享中的多项式,因此原论文还加了一轮一致性检测,感兴趣的朋友可以去原论文看看~。

参考文献:
内容大部分借鉴了
http://joeybarry.cn/practical-secure-aggregation/

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

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

相关文章

python缩进说法_【多选题】关于Python程序中与“缩进”有关的说法中,以下选项中错误的是()。...

问题&#xff1a;【多选题】关于Python程序中与“缩进”有关的说法中&#xff0c;以下选项中错误的是&#xff08;&#xff09;。更多相关问题 因方某将赵某打伤&#xff0c;方某住所地的市劳动教养委员会对方某作出劳动教养2年的决定&#xff0c;并将方某送交劳动 根据行政诉讼…

智能测井解释

1 智能测井解释的需求分析 1、岩性识别 2、储层划分 3、参数计算 4、流体判别 5、井数据批量处理 岩性识别&#xff1a;分类任务 曲线预测、曲线补齐&#xff1a;回归任务 2 岩性识别 2.1 岩性识别主要方法简介 目前岩性识别的方法主要有重磁、测井、地震、遥感、电 磁、地…

基于移动设备的OCR识别工作进展(1)

1 模型调研 模型1&#xff1a;Tesseract-OCR 模型2&#xff1a;PaddleOCR Android上面有体验版的demo&#xff1a;https://ai.baidu.com/easyedge/app/openSource?frompaddlelitePP-OCR模型&#xff1a;https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.5/README_…

2020.2idea创建web_IntelliJ IDEA 2017.3 完整的配置Tomcat运行web项目教程(多图)

小白一枚&#xff0c;借鉴了好多人的博客&#xff0c;然后自己总结了一些图&#xff0c;尽量的详细。在配置的过程中&#xff0c;有许多疑问。如果读者看到后能给我解答的&#xff0c;请留言。Idea请各位自己安装好&#xff0c;还需要安装Maven和Tomcat&#xff0c;各自配置好环…

OCR基本原理

学习内容为《动手学OCR.pdf》 1 OCR基础 1.1 OCR是什么 OCR&#xff08;Optical Character Recognition&#xff0c;光学字符识别&#xff09;&#xff1b; 传统意义上的OCR&#xff1a;面向扫描文档类对象&#xff1b; 一般意义上的OCR&#xff1a;场景文字识别&#xff08…

实用供暖通风空调设计手册 第三版_实用供热空调设计手册第三版即将出版随想...

看到西北院组织豪华的暖通空调大师阵容编写的《实用供热空调设计手册》第三版即将出版的信息&#xff0c;暖通空调人都期盼着2020年底见到具有更多新理念、新技术、新方法、新设备、新材料内容的新版《实用供热空调设计手册》。看到《实用供热空调设计手册》第二版&#xff0c;…

android 北斗定位代码_iPhone 11 确认支持北斗导航,真相来了!

点击 哎咆科技 关注我们最近“北斗”火了。因为7月31日&#xff0c;北斗三号全球卫星导航系统正式开通。截止8月7日&#xff0c;微博话题“北斗三号全球卫星导航系统正式开通”已有5.3亿次阅读、8万次讨论。北斗三号全球卫星导航系统的开通&#xff0c;意味着中国自主研发的北斗…

linux shell rman删除归档_我们一起学一学渗透测试——黑客应该掌握的Linux基础

点击上方「蓝字」关注我们各位新老朋友们&#xff1a;大家好&#xff0c;我是菜鸟小白。欢迎大家关注“菜鸟小白的学习分享”公众号&#xff0c;菜鸟小白作为一名软件测试工程师&#xff0c;会定期给大家分享一些测试基础知识、测试环境的搭建和python学习分享&#xff0c;另外…

PAN++学习笔记

1 主要创新点 文本检测和识别两个任务结合起来&#xff0c;作为互补&#xff0c;提高检测和识别精度&#xff1b;处理不规则形状的文本&#xff1b;提供一个高效的端到端框架PAN&#xff0c;对实时的应用场景友好。 2 已有工作的痛点 将文本检测和识别任务分开&#xff0c;不…

postgresql 遍历字符串数组_每日一道编程题(348):1005.K次取反后最大化的数组和...

1005.K次取反后最大化的数组和每日编程中遇到任何疑问、意见、建议请公众号留言或直接撩Q474356284(备注每日编程)给定一个整数数组 A&#xff0c;我们只能用以下方法修改该数组&#xff1a;我们选择某个个索引 i 并将 A[i] 替换为 -A[i]&#xff0c;然后总共重复这个过程 K 次…

python读取mysql数据_Selenium(Python) ddt读取MySQL数据驱动

import unittest from time import sleep from ddt import ddt, data from pymysql import connect from selenium import webdriver def getMySQLTestData(): # 查询数据库的方法 db connect(host"localhost", user"root", password"123456", …

签字后被开除_员工虚假报销公司可以开除吗?

大家好&#xff0c;我是法小明。今天继续和大家聊聊劳动法那些事&#xff0c;很多企业都会有报销制度&#xff0c;但制度难免会有漏洞&#xff0c;如果劳动者钻空子的话公司可以解除劳动合同吗&#xff1f;我们一起看看下面这个例子&#xff1a;小案例陈某系某公司员工&#xf…

python创建sqlite3数据库_树莓派使用 Python + SQLite 建立温度数据库

相比 MySQL 而言&#xff0c;SQLite 更为轻便、易于维护和部署。本文使用Python向SQLite数据库中插入树莓派温度数据&#xff0c;SQLite数据库中包含一张只包含三个字段的记录表——参数名称&#xff0c;时间和温度值。本文重点解释Python操作SQlite的具体方法&#xff0c;由于…

论文笔记:推荐系统去偏(Debiased Recommendation)研究综述

1 推荐系统的偏差 出现偏差的原因&#xff1a;用户行为数据是观察所得(Observational)而不是实验所得(Experimental)&#xff0c;因此会存在各种偏差&#xff0c;如用户对物品的选择偏差、系统对物品的曝光偏差等&#xff1b;偏差带来的问题&#xff1a;不考虑偏差&#xff0c…

c++ 内存管理_Python Bindings - 从 Python 调用 C/C++

python 最被人诟病的问题是什么&#xff1f; 慢&#xff0c;这是被人诟病最多的问题&#xff0c;很少人知道具体原因&#xff0c;极少人愿意去深入了解并找到原因&#xff0c;更极少的人愿意付出时间去解决这个问题&#xff0c;很多人都是停留在抱怨吐槽阶段&#xff0c;知乎上…

python安装idle_(1)Python 安装使用IDLE

安装Windows x86 web-based installer 在线安装 Windows x86 executable installer 离线安装 x86-64 64位软件 配置环境变量path下添加 python安装路径 查看版本号&#xff1a;运行Python 输入 help()一、IDLE介绍 IDLE是Python自带简单的集成开发环境&#xff0c;安装python的…

S-MBRec学习笔记

1 动机 传统推荐系统一般只考虑购买行为&#xff0c;忽略了放入购物车、浏览行为&#xff1b;本文将购买、放入购物车、浏览三个行为一起考虑&#xff1b;考虑购买和放入购物车行为的差异&#xff0c;进行对比学习&#xff1b;考虑购买和浏览行为的差异&#xff0c;进行对比学…

小米5点位图_最新!地铁5号线、6号线部分车站文化墙设计出炉!你选哪个?

情忆汉长安、惊鸿游龙、星辰大海……这些绝美的名字属于地铁文化墙近日西安地铁5号线和6号线一期工程的6座车站文化墙设计方案新鲜出炉邀请广大市民乘客对文化墙设计进行投票并提出宝贵建议西安地铁“一站一景”一直以来&#xff0c;西安地铁因其“一站一景”的独立logo设计、精…

python 编辑距离_最小编辑距离python

1 什么是编辑距离 在计算文本的相似性时&#xff0c;经常会用到编辑距离&#xff08;Levenshtein距离&#xff09;&#xff0c;其指两个字符串之间&#xff0c;由一个字符串转成另一个所需的最少编辑操作次数。在字符串形式上来说&#xff0c;编辑距离越小&#xff0c;那么两个…

asp多表查询并显示_MySQL多表查询与事务

回顾1. DQL单表高级查询条件 where比较运算逻辑运算符in关键字between关键字if null关键字like关键字% 多个任意字符_ 单个任意字符排序 order byascdesc聚合函数count(*) 统计行&#xff0c;包括null值maxminavgsum分组 group by 分组字段 having 分组后条件过滤分页 limit 开…