当前位置: 首页 > news >正文

向量数据库FAISS之五:原理(LSH、PQ、HNSW、IVF)

1.Locality Sensitive Hashing (LSH) 使用 Shingling + MinHashing 进行查找

在这里插入图片描述

左侧是字典,右侧是 LSH。目的是把足够相似的索引放在同一个桶内。

LSH 有很多的版本,很灵活,这里先介绍第一个版本,也是原始版本


在这里插入图片描述

  1. Shingling

    在这里插入图片描述

  2. one-hot

    在这里插入图片描述

  3. MinHash

    在这里插入图片描述

    从 shingled 等于 1 的那一行找,找哈希值最小的,四个颜色里面得到的最终签名是 2412.

  4. 根据签名划分桶,对桶进行哈希

    在这里插入图片描述

  5. 最后让两个向量在同一个桶内进行相似检索

    在这里插入图片描述

  6. 不同的 b 值的相似度对比

    在这里插入图片描述

在 FAISS 中的实现

import numpy as np
import faiss# 生成随机数据集(10000个128维向量)
np.random.seed(42)
d = 128  # 向量维度
nb = 10000  # 数据集大小
nq = 5  # 查询数量
xb = np.random.random((nb, d)).astype('float32')  # 数据库向量
xq = np.random.random((nq, d)).astype('float32')  # 查询向量# 创建 LSH 索引
**n_bits = 16  # 每个哈希签名的比特数(控制分布的细粒度)
nlist = 100  # 哈希桶的数量**# 使用余弦相似度的 LSH 索引
index = faiss.IndexLSH(d, n_bits)  # d 是向量维度,n_bits 是每个哈希签名的比特数# 为数据集添加索引
index.add(xb)# 执行查询
k = 5  # 要找到的最近邻数量
D, I = index.search(xq, k)  # 查询xq中k个最近邻
  1. n_bits(哈希签名比特数)
    1. 较大的 n_bits 的值意味着哈希分布更精细,每个哈希签名的长度更长,从而减少哈希冲突,提升检索的准确度。
  2. nlist(桶的数量)
    1. 代码中未显示 nlist 调节,但你可以通过构建带有倒排表(IVF)的 LSH 来设置 nlist。增加 nlist 可以减少每个桶中的向量数量,提高查询速度,但会增加空间分配的细粒度。

2.PQ

补充概念

code

code 指数据点被量化后生成的一个索引值,表示该数据点在量化器所创建的 码本(codebook) 中的位置

当数据经过量化之后,他被映射到码本中的一个 质心(centroid),每个质心有一个对应的索引,这个索引就是 code

例如,如果有 64 个质心,那么每个数据点的 code 将是 0 到 63 之间的一个整数,表示该数据点最接近哪个质心。

Codebook

码本(codebook) 是一组质心的集合,用于表示数据集中的典型向量或原型。码本中的每个质心是一个向量,代表了量化后的数据点可以映射到的“典型”位置。

质心(centroid) 是通过聚类算法(如 k-means)在训练阶段学到的,用来表示数据点的分布。

码本的大小由质心的数量决定。例如,一个码本可能包含 64 个质心,表示数据可以被量化为 64 种不同的状态。

总结

Code 是数据点量化后对应质心的索引,用来表示该数据点最接近的质心。

Codebook 是质心的集合,表示数据点被聚类后可以映射到的典型位置。

1.摘要

其思想是将空间分解为低维子空间的笛卡尔积,并分别对每个子空间进行插值

向量其子空间量化索引组成的短码表示

两个向量之间的欧氏距离可以有效地从它们的代码估计。非对称版本提高了精度,因为它计算了向量和代码之间的近似距离。

实验结果表明,我们的方法有效地搜索最近的邻居,特别是在与倒排文件系统相结合

2.引言

已经提出了几种多维索引方法,例如流行的 KD树[5]或其他分支和界限技术,以减少搜索时间。然而,对于高维,事实证明这种方法并不比穷举距离计算更有效,其复杂度为 O ( n D ) O(nD) O(nD)

在本文中,我们利用量化来构造短码。

目标是使用向量到质心距离来估计距离,例如,查询向量不被量化,code 仅被分配给数据库向量。这减少了量化噪声,并随后提高了搜索质量。为了获得精确的距离,必须限制量化误差。因此,质心的总数k应该足够大。这就提出了关于如何学习码本和分配向量的若干问题。

首先,学习量化器所需的样本数量是巨大的,即,几次 K。

其次,算法本身的复杂性是禁止的。

最后,地球上可用的计算机内存量不足以存储表示质心的浮点值。

3.背景

  1. 向量量化

    向量量化是一个破坏的过程,他会减少表示空间的基数,尤其是输入数据是实数的时候

    形式上,量化器是将 D 维向量 x x x 映射到向量 q ( x ) ∈ C = { c i , i ∈ I } , I = 0... k − 1 q(x)\in C = \{c_i, i\in I\}, I=0...k-1 q(x)C={ci,iI},I=0...k1 的函数 q q q

    再现值 c i c_i ci 被称为质心。再现值的集合 C C C 是大小为 k k k 的码本。

    映射到给定索引 i i i 的向量的集合 V i V_i Vi 被称为(Voronoi)单元

    量化器的 k k k 个单元形成 R D R^D RD 的分区。根据定义,位于相同单元 V i V_i Vi 中的所有向量由相同质心 c i c_i ci 重构。

    量化器的评价指标通常通过输入向量 x x x 和其再现值 q ( x ) q(x) q(x) 之间的均方误差 MSE 来测量。

    在这里插入图片描述

    其中, d ( x , y ) = ∣ ∣ x − y ∣ ∣ d(x,y)=||x-y|| d(x,y)=∣∣xy∣∣ p ( x ) p(x) p(x) 是相关变量 X 的概率分布函数

    为了使量化器是最佳的,它必须满足两个属性称为 Lloyd 最优性条件。首先,向量 x 必须量化到其最近的码本质心,根据欧几里得距离:

    在这里插入图片描述

    因此,单元由超平面界定。

    第二个 Lloyd 条件是重建值必须是位于 Voronoi 单元中的向量的期望:

    在这里插入图片描述

    Lloyd 量化器对应于 k 均值聚类算法,通过迭代地将训练集的向量分配给质心并从分配的向量重新估计这些质心来找到接近最优的码本。

    在没有任何进一步处理(熵编码)的情况下,存储索引值的存储器成本是 l o g 2 k log_2k log2k bit 。因此,对于k使用2的幂是方便的,因为量化器产生的代码存储在二进制存储器中。

  2. 乘积量化

    考虑 128 维向量。一个量化器产生 64bits 的 code,即包含 2 64 2^{64} 264 个质心。大的离谱,内存不能接受。

    乘积量化是一个处理这种问题的解决方案。

    输入向量 x x x 被分成 m m m 个不同的子向量 u j u_j uj, 维度为 D ∗ = D / m D^*=D/m D=D/m D D D 需要是 m m m 的倍数。

    使用 m m m 个不同的量化器分别量化 子向量

    在这里插入图片描述

    D 维向量 x 的被量化如图

    乘积量化器的再现值由乘积索引集合 I = I 1 × . . . × I m I=I_1×...×I_m I=I1×...×Im 的元素来标识。因此,码本被定义为笛卡尔积

    在这里插入图片描述

    并且该集合的质心是 M 个子量化器的质心的级联。

    从现在开始,我们假设所有的子量化器都有相同的有限数量 k 的再现值。在这种情况下,质心的总数由下式给出:

    在这里插入图片描述

    注意,在 m = D的极端情况下,向量 x 的分量全部被单独量化。然后,乘积量化器变成标量量化器,其中与每个分量相关联的量化函数可以不同。

    乘积量化器的优点是从几个小的质心集合中产生一个大的质心集合:与子量化器相关联的质心集合。

    在这里插入图片描述

    k 是质心数,假设 k = 2 64 k=2^{64} k=264 的情况下,效果还是相当可观的

4.量化搜索

在这里插入图片描述

见图2。
对称和非对称距离计算的图解。利用距离 d ( q ( x ) , q ( y ) ) d(q(x), q(y)) d(q(x),q(y))(左)或距离 d ( x , q ( y ) ) d(x,q(y)) d(x,q(y))(右)来估计距离 d ( x , y ) d(x,y) d(x,y)
距离上的均方误差平均地由量化误差限定。

最近邻搜索取决于查询向量和数据库向量之间的距离,或者等效地平方距离。

  1. 使用量化 code 计算距离

    让我们考虑查询向量 x 和数据库向量 y。我们提出了两种方法来计算这些向量之间的近似欧氏距离,对称和非对称的。有关说明,请参见图2。

    Symmetric distance computation (SDC):

    向量 x 和 y 都由它们各自的质心 q(x) 和 q(y) 表示,距离 d(x,y) 近似为距离 d ( q ( x ) , q ( y ) ) d(q(x),q(y)) d(q(x)q(y)).

    在这里插入图片描述

  2. Asymmetric distance computation (ADC)

    数据库向量 y y y q ( y ) q(y) q(y) 表示,但查询 x x x 未被编码。距离 d ( x , y ) d(x,y) d(xy) 近似为距离 d ( x , q ( y ) ) d(x,q(y)) d(x,q(y)),其使用分解计算

    在这里插入图片描述

    表 II 总结了不同步骤中的复杂度,涉及了 x x x k k k 个最近邻邻居,在 n = ∣ y ∣ n=|y| n=y 的数据集 Y Y Y中。可以看出,SDC 和 ADC 具有相同的查询准备成本,这与数据集大小 n 无关。

    在这里插入图片描述

    与 ADC 相比,SDC 的唯一优点是限制了与查询相关的内存使用,因为查询向量是由 code 定义的。这是大多数情况下不相关的,然后应该使用非对称版本,它获得了类似的复杂性较低的距离失真。我们将在本节的其余部分重点介绍 ADC。

  3. 非详尽搜索

    在这里插入图片描述

    图5.基于非对称距离计算的倒排文件(IVFADC)索引系统概述。上图:插入载体。底部:搜索。

5.总结

上面有点乱,总结一下

  1. 核心思想

    PQ 的关键思想是将一个高维向量分成若干低维的子向量,然后对每个子向量分别进行量化。

    • 高维向量分割:假设你有一个 D D D 维的向量,PQ 会将这个向量分成 m m m 个子向量。每个子向量的维度为 D / m D/m D/m
    • 每个子向量独立量化:每个子向量分别用自己的码本(codebook)进行量化。每个码本有 k 个质心(centroid),也就是 k 种可能的量化结果
    • 存储方式:每个高维向量的量化结果是 m 个子向量的量化码(code)的组合。这样。存储一个向量时,不再存储整个向量。而是存储 m 个索引
  2. 工作流程

    假设有一个 D 维向量 x,使用 PQ 进行量化。

    1. 分割向量:将 x 划分为 m 个子向量 x = ( x 1 , … , x m ) x=(x_1, …, x_m) x=(x1,,xm),每个子向量维度时 D / m D/m D/m
    2. 对每个子向量进行独立量化:
      • 为每个子向量训练一个量化器,生成对应的码本(centroid)
      • 将每个子向量 x i x_i xi 用码本中的质心替代,即找到与该子向量最近的质心,返回质心的索引
    3. 存储结果:量化后,将 x 表示为一个由 m 个量化索引组成的组合,这些索引指向各自子向量的质心
      1. 查询阶段:在查询时,将查询向量分块,分别与每个子向量的码本进行距离计算。最后,将每个子向量的距离累加,得到总距离。

6.faiss 中实现

import faiss# 维度
d = 128# 定义PQ量化器,分成m个子空间,每个子空间使用k个质心
m = 8  # 子空间数量
k = 256  # 每个子空间使用256个质心(8比特码)# 创建PQ索引
index = faiss.IndexPQ(d, m, k)# 训练PQ索引(假设有xb作为训练数据)
index.train(xb)# 添加数据
index.add(xb)# 查询
D, I = index.search(xq, k)  # 查询xq中的k个近邻
  1. m(子空间数量)
    1. 将 原始向量划分为 m 个子空间,每个空间独自量化。
    2. m 需要被 d 整除
    3. m 越大,单个子向量维度越小,量化误差可能越大;存储开销和搜索速度可能降低。
    4. 较小的 m 会保留更多原始向量的结构信息,但会增加存储和查询的计算复杂度。
  2. k(码表大小)
    1. 每个子空间使用的质心数,即每个子向量被量化为 k 种不同的值。常见的选择是 k = 256(8 比特编码),也可以选择其他值
    2. k 越大,量化的精度越高,但存储需求和计算复杂度也会增加。常见的值为 256

3.HNSW

1.解决的问题

  • 高维空间中的最近邻搜索问题:在高维空间中,传统的最近邻搜索算法(如K-Nearest Neighbor Search,K-NNS)由于“维度的诅咒”而变得低效。HNSW 通过引入层次结构来克服这个问题,提供了更好的搜索性能。
  • 近似搜索中的准确性与效率平衡:在近似最近邻搜索中,需要在搜索的准确性(召回率)和搜索效率之间找到平衡。HNSW 通过层次化的结构和启发式邻居选择策略,提高了搜索的效率和准确性。
  • 大规模数据集的可扩展性:随着数据集规模的增长,传统的ANNS算法可能会遇到性能瓶颈。HNSW 通过其层次化的设计,实现了对大规模数据集的可扩展性。

2.原理

HNSW 的核心思想是构建一个多层次的图结构,每个层次包含一个嵌套的邻近图(proximity graph),用于存储元素的子集。

在这里插入图片描述

Fig. 1 HNSW的图解。
搜索从顶层的元素开始(显示为红色)。红色箭头显示贪婪算法从入口点到查询的方向(显示为绿色)。

每个元素在图中的最大层数是随机选择的,遵循指数衰减的概率分布。这种设计允许在保持图的连通性的同时,通过不同长度尺度的链接分离来提高搜索性能。

搜索过程从最高层(具有最长链接的层)开始,然后根据需要逐步向下层搜索,直到达到底层。

这种“放大-缩小”(zoom-out and zoom-in)的策略有助于快速定位到目标区域,并在局部区域内进行精确搜索。

HNSW还采用了一种启发式方法来选择邻近图中的邻居节点,这种方法不仅考虑了候选节点与查询点的距离,还考虑了候选节点之间的距离,以创建多样化的连接。这有助于在高度聚集的数据中保持全局连通性,并提高搜索的准确性。

在这里插入图片描述

图2.用于为两个孤立的集群选择图邻居的启发式图示。
在簇 1 的边界上插入一个新的元素,该元素的所有最近邻居都属于簇 1,因此丢失了簇之间的 Delaunay 图的边。然而,试探法从簇 2 中选择元素 e2,从而在插入的元素与来自簇 1 的任何其他元素相比最接近 e2 的情况下保持全局连通性。

3.总结

HNSW 会构建一个 分层的 导航小世界图 来加速搜索。

  1. 小世界网络

    在这里插入图片描述

    这是一个NSW图,图中两个顶点的距离为 4 跳。

    如图,这允许通过少数跳跃,能够快速遍历网络中的大部分节点

  2. 分层导航结构

    HNSW 使用多层图结构,其中每一层是一个稀疏图,越往上层图越稀疏、节点数越少,而下层的图更密集,包含更多节点:

    • 顶层(高层):包含少数数据点,节点之间的连通性较弱。这里的作用是快速浏览整个数据集。
    • 底层(低层):连接更密集的数据点,允许更精确的搜索。

    每一个数据点都会随机分配到不同的层中,层次越高,点的密度越低。搜索从最顶层开始,依次向下跳转,逐渐进入更加密集的底层图,最终完成近似最近邻搜索。

  3. 邻居连接和随机跳跃

    为了在各层图中有效进行导航,HNSW 使用了“随机邻居连接”的策略。

    每个点通过固定数量的边与其他点连接,形成邻居节点集。这些连接不仅仅局限于靠近的点,还包含一定的随机性,从而确保图的连通性和避免局部最优

    • 随机性:初始构建图时,每个节点根据一定的概率与其他节点连接,特别是在高层图中,随机连接允许跨越较大距离的跳跃
    • 局部连接:在较低层次图中,节点之间的连接更多是局部的,与几何上相近的节点形成密集连接。
  4. 搜索过程

    搜索过程可以分为以下几个阶段:

    1. 从最高层开始:从顶层的一个起始节点出发,使用贪心搜索逐步寻找距离目标向量最近的邻居。
    2. 逐层向下跳跃一旦在顶层找到距离目标较近的节点,搜索算法会转移到下一层,继续在下一层寻找更接近目标的邻居。这种逐层跳跃过程可以加速搜索,因为每层的图连接性不同,可以提供全局导航和局部细化。
    3. 局部搜索:当搜索到最底层时,图的密度更高,搜索会在局部邻居之间进行更精确的距离计算,最终找到目标的近似最近邻。

4.代码

M = 16 # 每个顶点的连接数
ef_search = 8 # 搜索的深度
ef_construction = 64 # 构建时的扩展因子,决定了在构建图时为每个点找到最近邻的搜索深度index = faiss.IndexHNSWFlat(d, M)index.hnsw.efSearch = ef_search
index.hnsw.efConstruction = ef_constructionindex.add(xb)D, I = index.search(xq, k)
  1. M(最大连接数)
    1. 每个节点最大的连接边数。
    2. 值越大,搜索的结果更精确,但构建和查询的成本会变大。通常 16 - 48
  2. efConstruction(构建阶段的扩展因子))
    1. 控制图的构建质量
    2. 值越大,构建的图结构越精细,精度越高,但构建时间增加。
    3. efConstruction 通常设定为大于 M 的值。
    4. 其实设置一个比较大的值最好
  3. efSearch(查询阶段的扩展因子)
    1. 控制查询阶段的搜索广度。
    2. 值越大,搜索的邻居节点越多,精度越高,但查询速度变慢
    3. 常为 50 - 200

4.IVF

1.解决的问题

IVF(Inverted File Index)主要是为了解决大规模、高维向量数据集的最近邻搜索问题。

在高维数据集上,执行精确的最近邻搜索代价极高,尤其是当数据量大、维度高时,计算距离的成本成指数级增长,导致搜索时间和内存占用都难以接受。

2.原理

在这里插入图片描述

  1. 数据分簇(clustering)

    IVF 的核心思想是聚类。通过将数据点分成多个簇,算法可以大大减少在查询时需要计算的向量数量。

    1. 使用聚类进行分簇:常用 k-means。将数据集划分为多个簇,每个簇用一个质心(centroid) 表示。
    2. 构建倒排文件:一旦聚类完成,算法会为每个簇构建一个倒排列表。每个倒排索引列表中存储了归属于该簇的所有向量的 ID。这类似于搜索引擎中倒排索引的结构,用于快速定位相关文档
    3. 数据划分:数据集中的每个向量会被分配到某个簇,即它与该簇的质心距离最近。这样,整个数据集被划分为多个部分,每部分对应一个簇。

    倒排索引
    倒排索引是一种数据结构,它将向量空间中的特征(通常是聚类中心或代表向量)映射到包含该特征的所有数据点(向量)的列表。这种结构通过预先对数据进行分组,实现了快速的近似最近邻搜索,特别适用于高维向量空间中的大规模数据检索。
    例如

    传统索引(正向索引):

    • 条目:“番茄炒蛋的做法 A” -> 页码:10-20页

    倒排索引:

    • “番茄” -> 条目列表:{“番茄炒蛋的做法 A”, …}
    • “炒蛋” -> 条目列表:{“番茄炒蛋的做法 A”, …}
  2. 查询阶段

    在进行搜索时,IVF 只需在部分簇中执行最近邻搜索,从而大大减少了距离计算的次数。搜索过程如下:

    1. 查找最近的质心:首先,查询向量会与所有质心进行距离计算,从中选出与查询向量距离最近的几个质心。这一步用于粗略定位查询向量可能所在的簇。通常选择距离最近的 nprobe 个质心,而不是所有质心。
    2. 在对应的簇中搜索:选定最近的质心后,搜索会在这些对应的簇中查找最近邻。由于这些簇包含的数据点较少,算法只需在这些簇内进行精细的距离计算,从而有效减少了搜索范围。
    3. 返回最近邻:通过在选中的簇中执行最近邻搜索,最终返回最接近查询向量的几个数据点

3.代码

nlist = 128 # 质心数量quantizer = faiss.IndexFlatIP(d) # 可以减少内存占用,并提高搜索速度
index = faiss.IndexIVFFlat(quantizer, d, nlist)index.train(xb) # 需要训练!index.add(xb)index.nprobe = 1%%time
D, I = index.search(xq, k)
  1. nlist(聚类数量)
    1. 在训练阶段创建的聚类(桶)的数量
    2. nlist 的值越大,划分的簇越多,簇内的向量数量就越少,查询速度更快,但索引构建时间和内存占用可能会增加。
    3. 通常 nlist 的选择取决于数据的规模,经验上建议 nlist 与数据量的平方根成比例
  2. nprobe(探测簇的数量)
    1. 在查询时,nprobe 控制查询向量要搜索的簇的数量。
    2. nprobe 值越大,查询精度越高,但计算成本也相应增加。
    3. 一般而言,可以通过调节 nprobe 来在搜索精度和速度之间找到平衡

相关文章:

向量数据库FAISS之五:原理(LSH、PQ、HNSW、IVF)

1.Locality Sensitive Hashing (LSH) 使用 Shingling MinHashing 进行查找 左侧是字典,右侧是 LSH。目的是把足够相似的索引放在同一个桶内。 LSH 有很多的版本,很灵活,这里先介绍第一个版本,也是原始版本 Shingling one-hot …...

速盾:CDN缓存的工作原理是什么?

CDN(内容分发网络)是一种将内容分发到全球不同地理位置的网络架构,以提供更快速、可靠的内容传输。其核心原理是利用缓存技术,将数据内容分布到离用户最近的边缘节点上。当用户请求内容时,CDN将根据用户的IP地址&#…...

使用 Elastic AI Assistant for Search 和 Azure OpenAI 实现从 0 到 60 的转变

作者:来自 Elastic Greg Crist Elasticsearch 推出了一项新功能:Elastic AI Assistant for Search。你可以将其视为 Elasticsearch 和 Kibana 开发人员的内置指南,旨在回答问题、引导你了解功能并让你的生活更轻松。在 Microsoft AI Services…...

SQL基础语法介绍-基于MySQL

文章目录 一、SQL分类二、SQL语法1.数据库字段类型1.1.数值类型1.2 字符类型1.3 日期类型 2.字段约束2.1约束介绍2.2 非空约束(not null)2.3 唯一约束(unique)2.4 主键约束(primary key)2.5 自增长主键2.6 …...

android 性能分析工具(03)Android Studio Profiler及常见性能图表解读

说明:主要解读Android Studio Profiler 和 常见性能图表。 Android Studio的Profiler工具是一套功能强大的性能分析工具集,它可以帮助开发者实时监控和分析应用的性能,包括CPU使用率、内存使用、网络活动和能耗等多个方面。以下是对Android …...

【STM32项目】基于STM32设计的震动马达超声波电机高频震动——高级定时器PWM互补输出带死区控制

高级定时器PWM互补输出带死区控制 前言:实现高级定时器互补输出带死区控制,实现震动/超声波电机/马达,高频震动。使用 STM32F103 芯片输出两路互补 PWM,并带有死区和刹车控制功能。 定时器 1 通道 1 及其互补通道输出 PWM,且带死区控。当定时器 1 的刹车输入引脚被拉…...

深入探索Golang的GMP调度机制:源码解析与实现原理

在Golang(又称Go语言)的并发编程模型中,GMP调度模型扮演着举足轻重的角色。GMP分别代表Goroutine(协程)、M(Machine,即内核线程)和P(Processor,即逻辑处理器&…...

Django如何配置多个环境的MySQL数据库

在 Django 项目中配置多个环境的 MySQL 数据库是一个常见的需求,特别是在开发、测试和生产环境中使用不同的数据库配置。你可以通过在 settings.py 文件中使用条件语句或环境变量来实现这一点。 1. 使用环境变量 使用环境变量是一种灵活且安全的方式来配置多个环境…...

数据结构(链栈——c语言实现)

链式栈(Linked Stack)是一种基于链表数据结构实现的栈。它利用链表节点的指针来存储元素,并通过指针的链接关系来维护栈的后进先出(LIFO, Last In First Out)特性。 链式栈的优点 动态大小: 链式栈…...

FPGA实现串口升级及MultiBoot(九)BPI FLASH相关实例演示

本文目录索引 区别一:启动流程的区别区别二:高位地址处理区别三:地址映射例程说明总结例程地址之前一直都是以SPI FLASH为例进行相关知识讲解,今天我们介绍另一款常用的配置FLASH-BPI FLASH。 今天的讲解以简洁为主,主打个能用一句话不说两句话。以和SPI区别为主,实例演…...

Android 网络通信(三)OkHttp实现登入

学习笔记 目录 一. 先写XML布局 二、创建 LoginResponse 类 :封装响应数据 目的和作用: 三、创建 MyOkHttp 类 :发送异步请求 代码分析 可能改进的地方 总结 四、LoginActivity 类中实现登录功能 详细分析与注释: 总结: 改进建议: 零、响应数据样例 通过 P…...

java基础概念37:正则表达式2-爬虫

一、定义 【回顾】正则表达式的作用 作用一:校验字符串是否满足规则作用二:在一段文本中查找满足要求的内容——爬虫 二、本地爬虫VS网络爬虫 2-1、本地爬虫 示例: 代码优化: public static void main(String[] args) {// 大…...

【大数据学习 | Spark-Core】RDD的概念与Spark任务的执行流程

1. RDD的设计背景 在实际应用中,存在许多迭代式计算,这些应用场景的共同之处是,不同计算阶段之间会重用中间结果,即一个阶段的输出结果会作为下一个阶段的输入。但是,目前的MapReduce框架都是把中间结果写入到HDFS中&…...

day06(单片机高级)PCB设计

目录 PCB设计 PCB设计流程 元器件符号设计 原理图设计 元器件封装设计 元器件库使用 PCB设计 目的:学习从画原理图到PCB设计的整个流程 PCB设计流程 元器件符号设计 元器件符号:这是电子元器件的图形表示,用于在原理图中表示特定的元器件。例…...

[Redis#2] 定义 | 使用场景 | 安装教程 | 快!

目录 1. 定义 In-memory data structures 在内存中存储数据 2. 优点!快 Programmability 可编程性 Extensibility 扩展性 Persistence 持久化 Clustering 分布式集群 High availability 高可用性 ⭕快速访问的实现 3. 使用场景 1.Real-time data store …...

docker pull命令拉取镜像失败的解决方案

docker pull命令拉取镜像失败的解决方案 简介: docker pull命令拉取镜像失败的解决方案 docker pull命令拉取镜像失败的解决方案 一、执行docker pull命令,拉取镜像失败 报错信息:error pulling image configuration: Get https://produc…...

漫步北京小程序构建智慧出行,打造旅游新业态模式

近年来,北京市气象服务中心持续加强推进旅游气象服务,将旅游气象监测预警基础设施纳入景区配套工程,提升气象和旅游融合发展水平,服务建设高品质智慧旅游强市。 天气条件往往影响着旅游景观的体验,北京万云科技有限公…...

DNS域名解析服务器

一、dns简介及域名 DNS(Domain Name System) : 作为将域名和IP地址相互映射的一个分布式数据库,能便捷互联网的访问。使用53端口,通常以UDP较快的数据传输协议来查询,如果没有查询到,将再次启动TCP重新查询,两者同时启…...

MySQL数据存储详解

1. MySQL 的数据存放位置 当我们在 MySQL 数据库中创建一个表时,MySQL 会在数据库对应的文件夹下生成三个文件: 1.1 db.opt 文件 是什么: 每个数据库都有一个 db.opt 文件,这个文件保存了数据库的配置信息。作用: 记…...

Maven maven项目构建的生命周期 Maven安装配置 IDEA 配置 Maven

一,Maven的概述 Maven的作用:专门用于管理和构建Java项目的工具,它的主要功能有: 提供了一套标准化的项目结构提供了一套标准化的构建流程(编译,测试,打包,发布……)提…...

和为 K 的子数组(java)

题目描述: 给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数 。 子数组是数组中元素的连续非空序列。 示例 1: 输入:nums [1,1,1], k 2 输出:2示例 2: 输入&#xf…...

关于Redux的学习(包括Redux-toolkit中间件)

目录 什么是 Redux ? 我为什么要用 Redux ? 我什么时候应该用 Redux ? Redux 库和工具 React-Redux Redux Toolkit Redux DevTools 拓展 一个redux小示例 代码示例(很有用): Redux 术语 Actions Reducers Store Dis…...

MIT 6.S081 | 操作系统 | Lab1: Xv6 and Unix utilities

Lab1: Xv6 and Unix utilities 文章目录 Lab1: Xv6 and Unix utilities实验任务1.启动XV6(easy)2.Sleep(easy)-练手的,就是熟悉一下怎么在xv6项目中加.c文件,生成可执行程序并进行测试的1.解析rm.c2.argc 如何被赋值3.Sleep代码4.makefile编辑5.通过make…...

04 - 尚硅谷 - MQTT 客户端编程

1.在Java中使用MQTT 1.1 Eclipse Paho Java Client 具体步骤&#xff1a; 1、创建一个Spring Boot项目&#xff0c;添加如下依赖 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId>…...

C语言基础学习:抽象数据类型(ADT)

基础概念 抽象数据类型&#xff08;ADT&#xff09;是一种数据类型&#xff0c;它定义了一组数据以及可以在这组数据上执行的操作&#xff0c;但隐藏了数据的具体存储方式和实现细节。在C语言中&#xff0c;抽象数据类型&#xff08;ADT&#xff09;是一种非常重要的概念&…...

蓝桥杯每日真题 - 第16天

题目&#xff1a;&#xff08;卡牌&#xff09; 题目描述&#xff08;13届 C&C B组C题&#xff09; 解题思路&#xff1a; 题目分析&#xff1a; 有 n 种卡牌&#xff0c;每种卡牌的现有数量为 a[i]&#xff0c;所需的最大数量为 b[i]&#xff0c;还有 m 张空白卡牌。 每…...

【Docker】快速部署 Pikachu:一个包含常见 Web 安全漏洞的渗透测试练习靶场

系统介绍 Pikachu是一个带有漏洞的Web应用系统&#xff0c;在这里包含了常见的web安全漏洞。 如果你是一个Web渗透测试学习人员且正发愁没有合适的靶场进行练习&#xff0c;那么Pikachu可能正合你意。 Pikachu上的漏洞类型列表如下&#xff1a; Burt Force(暴力破解漏洞) XSS…...

【解决】Unity TMPro字体中文显示错误/不全问题

问题描述&#xff1a;字体变成方块 原因&#xff1a;字体资源所承载的长度有限 1.找一个中文字体放入Assets中 2.选中字体创建为TMPro 字体资源 3.选中创建好的字体资源&#xff08;蓝色的大F&#xff09; 在右边的属性中找到Atlas Width h和 Atlas Heigth,修改的大一点&…...

速通前端篇 —— CSS

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;速通前端 目录 CSS的介绍 基本语法规范 CSS选择器 标签选择器 class选择器 id选择器 复合选择器 通配符选择器 CSS常见样式 颜…...

【案例】泛微.齐业成助力北京中远大昌汽车实现数电票全流程管理

中远大昌统一发票共享平台上线三个多月以来&#xff0c;实现&#xff1a; 5000份 60000元 发票开具 成本节约 客户简介及需求分析 北京中远大昌汽车服务有限公司&#xff08;以下简称“中远大昌”&#xff09;成立于2002年&#xff0c;是中远海运集团所属香远&#xff08;北…...

Windows系统运行库软件游戏修复工具

本页面下载的资源包包括PC电脑常用的运行库和电脑必备组件&#xff0c;如您的电脑出现应用打不开&#xff0c;缺少dll链接库、闪退等现象可以尝试用下面软件修复。 本资源永久有效。 软件安装基本常识科普&#xff1a; 为什么要安装运行库&#xff1f;运行库默认安装到C盘&…...

解决.DS_Store 在项目一致无法排除,.gitignore里也不生效

.DS_Store 是 macOS 操作系统创建的隐藏文件&#xff0c;通常用于存储目录的属性&#xff0c;比如视图设置、图标位置等。它通常不应包含在代码仓库中&#xff0c;因此需要排除它。你提到即使将其添加到 .gitignore 文件中&#xff0c;仍然无法排除它&#xff0c;可能是由于以下…...

C#里怎么样判断文件是否存在?

C#里怎么样判断文件是否存在? 判断文件是否存在,也是一个常用的功能。 因为文件如果不存,直接去操作,就会抛出异常。 比如要拷贝一个文件到另外一个目录里,如果文件已经存在那个文件夹里,也会抛出异常。 所以提前判断,就可以减少很多不必要的异常抛出,同时程序写得更加…...

汽车免拆诊断案例 | 2012款路虎揽胜运动版柴油车加速无力

故障现象  一辆2012款路虎揽胜运动版车&#xff0c;搭载3.0T柴油发动机&#xff08;型号为306DT&#xff09;&#xff0c;累计行驶里程约为10.2万km。车主进厂反映&#xff0c;车辆行驶中加速无力&#xff0c;且发动机故障灯异常点亮。 故障诊断 接车后试车&#xff0c;发动…...

JAVA基础

JAVA基础 JAVA的变量 变量是什么 内存中存储的&#xff0c;数值可以改变的数据 定义变量 语法 数据类型 变量名 值&#xff1b; 变量的命名&#xff1a; 必须由字母、数字、下划线和$组成&#xff1b;开头不能是数字规范的命名是小驼峰命令&#xff1a;studentName要做…...

ssh无法连接Ubuntu

试了多次ssh都无法连接&#xff0c;明明可以上网 网卡、防火墙、端口都没有问题&#xff0c;就是连接不上 结果是这个版本Ubuntu镜像默认没有安装ssh服务 安装SSH服务&#xff1a;apt-get install openssh-server 开启SSH服务&#xff1a;/etc/init.d/ssh start 就可以连接…...

spi 回环

///tx 极性0 &#xff08;sclk信号线空闲时为低电平&#xff09; /// 相位0 (在sclk信号线第一个跳变沿进行采样) timescale 1ns / 1ps//两个从机 8d01 8d02 module top(input clk ,input rst_n,input [7:0] addr ,input …...

MongoDB 更新集合名

MongoDB 更新集合名 MongoDB 是一个流行的 NoSQL 数据库&#xff0c;它使用集合&#xff08;collections&#xff09;来存储文档&#xff08;documents&#xff09;。集合在 MongoDB 中相当于关系型数据库中的表。在 MongoDB 中&#xff0c;集合名是可以在某些情况下进行更新的…...

常见面试题----深入源码理解MQ长轮询优化机制

引言 在分布式系统中&#xff0c;消息队列&#xff08;Message Queue, MQ&#xff09;扮演着至关重要的角色。MQ不仅实现了应用间的解耦&#xff0c;还提供了异步消息处理、流量削峰等功能。而在MQ的众多特性中&#xff0c;长轮询&#xff08;Long Polling&#xff09;机制因其…...

Firewall防火墙配置

文章目录 一、firewalld简介二、firewalld特性三、firewalld相关文件及目录四、firewalld配置五、firewalld配置实例一、firewalld简介 firewalld 提供了支持网络/防火墙区域(zone)定义网络链接以及接口安全等级的动态防火墙管理工具。它支持 ipv4, ipv6 防火墙设置以及以太网…...

我做了一份斯坦福CS229吴恩达机器学习笔记

吴恩达教授的机器学习课程&#xff0c;可以说是AI领域的一块金字招牌。这门在斯坦福大学开设的课程&#xff0c;历经十余年&#xff0c;依旧是机器学习入门的经典之作。 记得当年&#xff0c;这门课火爆到吴恩达教授不得不将其搬到线上&#xff0c;结果不仅在斯坦福&#xff0c…...

TESSY单元测试工具详解与操作演示:ISO 26262合规性、自定义测试用例、详细测试报告等

在嵌入式系统开发中&#xff0c;安全性和可靠性至关重要&#xff0c;尤其是在汽车、医疗和工业控制等高风险行业。为了确保代码在实际运行中满足安全标准&#xff0c;开发者需要一套完善全面的测试工具&#xff0c;来严格检测代码的安全性和可靠性。 TESSY作为一款已获得IEC 61…...

C++语言之函数对象与算法

在 C 中&#xff0c;函数对象&#xff08;Function Object&#xff09;也叫仿函数&#xff08;Functor&#xff09;&#xff0c;是一个类&#xff0c;这个类重载了()运算符。从概念上讲&#xff0c;它的行为类似于一个函数&#xff0c;可以像调用函数一样来调用这个类的对象。 …...

Fakelocation Server服务器/专业版 Windows11

前言:需要Windows11系统 Fakelocation开源文件系统需求 Windows11 | Fakelocation | 任务一 打开 PowerShell&#xff08;以管理员身份&#xff09;命令安装 Chocolatey Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProto…...

java使用itext生成pdf

一、利用Adobe Acrobat DC软件创建pdf模板 备好Adobe Acrobat DC软件 1.excel/jpg/png文件转pdf文件 右击打开我们要转换的文件 2.然后点击 添加 域 3.可以看到域的名字 4.调整字体大小/对齐方式等 5.保存 二&#xff0c;代码部分 首先 上依赖 <dependency><group…...

【PPTist】添加PPT模版

前言&#xff1a;这篇文章来探索一下如何应用其他的PPT模版&#xff0c;给一个下拉菜单&#xff0c;列出几个项目中内置的模版 PPT模版数据 &#xff08;一&#xff09;增加菜单项 首先在下面这个菜单中增加一个“切换模版”的菜单项&#xff0c;点击之后在弹出框中显示所有的…...

AmazonS3集成minio实现https访问

最近系统全面升级到https&#xff0c;之前AmazonS3大文件分片上传直接使用http://ip:9000访问minio的方式已然行不通&#xff0c;https服务器访问http资源会报Mixed Content混合内容错误。 一般有两种解决方案&#xff0c;一是升级minio服务&#xff0c;配置ssl证书&#xff0c…...

适配屏幕px、rem单位换算, 将 pxToRem 函数设置为一个全局工具如:在 utils.js 文件、SCSS/Mixin 定义

页面的宽度适配&#xff1a; 假设页面的根元素&#xff08;html&#xff09;的字体大小设置为动态值&#xff08;常用 rem 单位适配时的做法&#xff09;&#xff0c; 比如 html { font-size: (屏幕宽度 / 设计稿宽度) }。如果根元素的字体大小为 1rem 屏幕宽度 / 1920px&…...

H.265流媒体播放器EasyPlayer.js播放器提示MSE不支持H.265解码可能的原因

随着人工智能和机器学习技术的应用&#xff0c;流媒体播放器将变得更加智能&#xff0c;能够根据用户行为和偏好提供个性化的内容推荐。总体而言&#xff0c;流媒体播放器的未来发展将更加注重技术创新和用户互动&#xff0c;以适应不断变化的市场需求和技术进步。 提示MSE不支…...

医学图像语义分割:前列腺肿瘤、颅脑肿瘤、腹部多脏器 MRI、肝脏 CT、3D肝脏、心室

医学图像语义分割&#xff1a;前列腺肿瘤、颅脑肿瘤、腹部多脏器 MRI、肝脏 CT、3D肝脏、心室 语义分割网络FCN&#xff1a;通过将全连接层替换为卷积层并使用反卷积上采样&#xff0c;实现了第一个端到端的像素级分割网络U-Net&#xff1a;采用对称的U形编解码器结构&#xff…...