郑州外贸网站建设哪家好,常用的网络营销工具有哪些,wordpress主题上传到哪里,想找个专业做网站公司目录 简介安装方法安装OpenBLAS安装lapack编译Faiss 代码示例余弦相似度计算输出ID号而非索引的改进版 简介
Faiss 是一个强大的向量相似度搜索库#xff0c;具有以下优点#xff1a; 高效的搜索性能#xff1a;Faiss 在处理大规模向量数据时表现出色。它利用了高度优化的索… 目录 简介安装方法安装OpenBLAS安装lapack编译Faiss 代码示例余弦相似度计算输出ID号而非索引的改进版 简介
Faiss 是一个强大的向量相似度搜索库具有以下优点 高效的搜索性能Faiss 在处理大规模向量数据时表现出色。它利用了高度优化的索引结构和近似搜索算法可以快速地执行最近邻搜索和相似度匹配具有很低的查询延迟。 高度可扩展Faiss 提供了多种索引结构和算法的选择包括 k-d树、IVFInverted File System和 PQProduct Quantization等。这些索引结构能够轻松应对大规模的向量数据集并支持高效的并行计算和分布式处理。 高精度的近似搜索Faiss 通过采用近似搜索技术在保证搜索速度的同时尽量接近精确搜索的结果。这使得 Faiss 在许多实际应用中能够有效地处理高维度的向量数据如图像、文本和推荐系统等。 多语言支持Faiss 提供了多种编程语言的接口如 Python、Java 和 Go 等使得它能够方便地集成到各种应用和平台中。
然而Faiss 也有一些局限性和缺点 内存消耗Faiss 在处理大规模向量数据时可能需要大量的内存。特别是在使用一些高级索引结构和算法时内存消耗可能会很高。 学习曲线陡峭对于初次接触 Faiss 的开发者来说学习曲线可能会比较陡峭。理解并配置 Faiss 的索引结构、算法和参数可能需要一定的时间和经验。
综上所述Faiss 是一个强大而高效的向量相似度搜索库适用于大规模的向量数据集和高维度的向量数据。它提供了高速的近似搜索和优化的索引结构有助于构建复杂的检索系统和应用。然而在使用 Faiss 时需要注意内存消耗和学习曲线的挑战。
安装方法
安装OpenBLAS
OpenBLAS 是一个开源的数值线性代数库用于高性能科学计算和数据处理。它提供了基于多核处理器和向量指令集的并行化实现以加速矩阵运算和其他数值计算操作。
git clone https://github.com/xianyi/OpenBLAS.gitgfortran 是 GNU Compiler Collection简称 GCC的一部分它是 GNU 项目开发的免费开源的编译器套件。gfortran 是 GCC 提供的 Fortran 编译器用于编译和执行 Fortran 程序。 使用gfortran进行编译
sudo apt install gfortran
cd OpenBLAS
make FCgfortran
make install
ln -s /opt/OpenBLAS/lib/libopenblas.so /usr/lib/libopenblas.so
LD_LIBRARY_PATH/opt/OpenBLAS/lib
export LD_LIBRARY_PATH在这个特定的命令中FCgfortran将设置FC变量的值为gfortran指示构建过程使用gfortran作为Fortran编译器。
安装lapack
LAPACKLinear Algebra Package是一个用于数值线性代数计算的库它提供了一系列高性能的算法和子程序用于解决线性方程组、特征值问题、奇异值分解和相关的数值计算任务。
wget http://www.netlib.org/lapack/lapack-3.4.2.tgz
tar -zxf lapack-3.4.2.tgz
cd lapack-3.4.2
cp ./INSTALL/make.inc.gfortran ./
mv make.inc.gfortran make.inc
vi Makefile # 修改如下
[#lib: lapacklib tmglib
lib: blaslib variants lapacklig tmglib]
make
cd lapacke
make
cp include/*.h /usr/include
cd ..
cp *.a /usr/lib编译Faiss
git clone https://github.com/facebookresearch/faiss.git
cd faiss
#这个命令是使用 CMake 构建一个项目并将构建产物放置在名为 “build” 的目录中。
cmake -B build . -DFAISS_ENABLE_GPUOFF -DFAISS_ENABLE_PYTHONOFF
#这个命令是使用 make 构建名为 “faiss” 的目标并且指定构建目录为 “build”。
make -C build -j faiss
#这个命令是使用 make 进行构建并将构建产物安装到系统中。同样在build目录下构建
make -C build install代码示例
余弦相似度计算
给定一个向量在已有的两个向量中找到余弦相似度最优的一个向量
#include iostream
#include cmath
#include faiss/IndexFlat.h
#include faiss/index_io.h
#include faiss/utils/distances.h
int main() {// 创建索引对象faiss::IndexFlatIP index(2); // 使用L2距离度量2维向量// 添加向量数据float xb[4] {1.0, 1.0, 0.0, 0.5}; // 2个2维向量//存储向量个数int n2;// 为了使用内积求出余弦相似度要对每个向量进行归一化操作size_t d 2; // 向量维度float norm[d]{0,0};// 计算向量的 L2 范数是已经过开方的// 函数有四个参数// x指向输入向量数组的指针所有向量在内存中是连续存储的。即向量数组的布局是 [x₀₀, x₀₁, ..., xₙ₋₁(d-1)]。// norms指向输出结果数组的指针用于存储计算出的 L2 范数。结果数组的布局和输入向量相同即 [norm₀, norm₁, ..., normₙ₋₁]。// d向量的维度即每个向量的元素数目。// n向量的数量或者说是向量数组的长度。faiss::fvec_norms_L2(norm, xb,d,n); // 将每个向量归一化为单位向量同时添加到索引中#pragma omp parallel{#pragma omp forfor (int i 0; i n; i) {// 每个向量的起始地址float* vector xb[i * d]; // 将向量归一化为单位向量for (size_t j 0; j d; j) {vector[j] / norm[i];}// 每次将1个向量添加到索引中#pragma omp critical{index.add(1, vector);}}//进行同步#pragma omp barrier}// 保存索引到文件faiss::write_index(index, index.faissindex);// 从文件加载索引faiss::Index* loaded_index faiss::read_index(index.faissindex);// 执行搜索float xq[2] {1.0, 0.0}; // 查询向量int k 1; // 返回最接近的2个邻居faiss::idx_t* I new faiss::idx_t[k]; // 邻居索引float* D new float[k]; // 邻居距离// search 方法的主要参数如下
// n表示要搜索的查询向量的数量即查询向量的个数。
// x一个指向浮点数的指针表示查询向量的数据。x 的大小应该为 n 乘以向量的维度。
// k表示要返回的相似邻居的数量。
// distances一个指向浮点数的指针用于存储查询向量与相似邻居之间的距离。distances 的大小应该为 n 乘以 k。
// labels一个指向整数的指针用于存储相似邻居的索引标签。labels 的大小应该为 n 乘以 k。loaded_index-search(1, xq, k, D, I);// 打印结果std::cout 查询结果: std::endl;std::cout 邻居索引: I[0] , 距离: D[0] std::endl;//返回原始向量// 获取索引为 i 的向量// 向量的维度std::vectorfloat vectors(index.d);index.reconstruct(I[0], vectors.data());// 使用循环遍历并打印该向量每个元素for (const auto element : vectors) {std::cout element ;}std::cout std::endl;// 释放内存delete loaded_index;delete[] I;delete[] D;return 0;
}对应cmakelist:
cmake_minimum_required(VERSION 3.5)
project(fangdou)
FIND_PACKAGE( OpenMP REQUIRED)
if(OPENMP_FOUND)
message(OPENMP FOUND)
set(CMAKE_C_FLAGS ${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS})
set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS})
set(CMAKE_EXE_LINKER_FLAGS ${CMAKE_EXE_LINKER_FLAGS} ${OpenMP_EXE_LINKER_FLAGS})
endif()# 添加 Faiss 库的路径
set(FAISS_INCLUDE_DIR /usr/local/include/faiss)
set(FAISS_LIBRARY_DIR /usr/local/lib)include_directories(
${FAISS_INCLUDE_DIR}
)SET(OpenCV_DIR /usr/local/lib/cmake/opencv4/)
FIND_PACKAGE(OpenCV REQUIRED)file(GLOB_RECURSE cpp_srcs ${CMAKE_SOURCE_DIR}/src/*.cpp ${CMAKE_SOURCE_DIR}/src/*.cc ${CMAKE_SOURCE_DIR}/src/*.h)link_directories(
/usr/lib/x86_64-linux-gnu/
${FAISS_LIBRARY_DIR}
)add_executable(${PROJECT_NAME} ${cpp_srcs})target_link_libraries(${PROJECT_NAME} ${OpenCV_LIBS} faiss openblas)输出ID号而非索引的改进版
#include iostream
#include cmath
#include faiss/IndexFlat.h
#include faiss/index_io.h
#include faiss/utils/distances.h
#include faiss/IndexIDMap.h
int main() {// 创建一个IndexFlatIP内积索引对象作为内部索引faiss::IndexFlatIP inner_index(2);// 创建一个IndexIDMap对象将内部索引设置为IndexFlatIPfaiss::IndexIDMap index(inner_index);// 添加向量数据float xb[4] {1.0, 1.0, 0.0, 0.5}; // 2个2维向量//idsfaiss::idx_t ids[] {1001, 1002};//存储向量个数int n2;// 为了使用内积求出余弦相似度要对每个向量进行归一化操作size_t d 2; // 向量维度float norm[d]{0,0};// 计算向量的 L2 范数是已经过开方的// 函数有四个参数// x指向输入向量数组的指针所有向量在内存中是连续存储的。即向量数组的布局是 [x₀₀, x₀₁, ..., xₙ₋₁(d-1)]。// norms指向输出结果数组的指针用于存储计算出的 L2 范数。结果数组的布局和输入向量相同即 [norm₀, norm₁, ..., normₙ₋₁]。// d向量的维度即每个向量的元素数目。// n向量的数量或者说是向量数组的长度。faiss::fvec_norms_L2(norm, xb,d,n); // 将每个向量归一化为单位向量同时添加到索引中#pragma omp parallel{#pragma omp forfor (int i 0; i n; i) {// 每个向量的起始地址float* vector xb[i * d]; // 将向量归一化为单位向量for (size_t j 0; j d; j) {vector[j] / norm[i];}// 每次将1个向量添加到索引中#pragma omp critical{index.add_with_ids(1, vector,ids[i]);}}//进行同步#pragma omp barrier}// 保存索引到文件faiss::write_index(index, index.faissindex);// 从文件加载索引faiss::Index* loaded_index faiss::read_index(index.faissindex);// 执行搜索float xq[2] {1.0, 0.0}; // 查询向量int k 1; // 返回最接近的2个邻居faiss::idx_t* I new faiss::idx_t[k]; // 邻居索引float* D new float[k]; // 邻居距离// search 方法的主要参数如下
// n表示要搜索的查询向量的数量即查询向量的个数。
// x一个指向浮点数的指针表示查询向量的数据。x 的大小应该为 n 乘以向量的维度。
// k表示要返回的相似邻居的数量。
// distances一个指向浮点数的指针用于存储查询向量与相似邻居之间的距离。distances 的大小应该为 n 乘以 k。
// labels一个指向整数的指针用于存储相似邻居的索引标签。labels 的大小应该为 n 乘以 k。loaded_index-search(1, xq, k, D, I);// 打印结果std::cout 查询结果: std::endl;std::cout 邻居索引: I[0] , 距离: D[0] std::endl;//此时不再支持返回原向量。// 释放内存delete loaded_index;delete[] I;delete[] D;return 0;
}