1 | import numpy as np |
Golang 线程安全的 sync.Map 以及使用时遇到的问题
前言
最近在使用 Golang 实现 HNSW 算法的多属性支持,在其中用到的 map 结构。然后 Map 并不是线程安全的,使用多线程的话在新版本的 Golang 中会直接出现 panic。
sync.Map 这个数据结构是线程安全的,它填补了 Map 线程不安全的缺陷,不过最好只在需要的情况下使用。它一般用于并发模型中对同一类 map 结构体的读写,或其他适用于 sync.Map 的情况。
关于 sync.Map 的源码解析文章:Go 1.9 sync.Map揭秘
sync.Map使用方法
Store
存 key,valueLoadOrStore
取&存—具体看代码Load
取 key 对应的 valueRange
遍历所有的 key,valueDelete
删除 key,及其 value
排序算法 Python 实现
归并排序
1 | def merge_sort(li): |
Java HashMap 源码
近似最近邻算法 HNSW 学习笔记(二) 主要算法伪代码分析
前言
近期在研究近似最近邻算法 HNSW 的源码和论文,这里结合论文中的伪代码做一下 HNSW 主要的几个算法的解读,这将对读懂源码十分有帮助。本文介绍以下算法:
- $\tt INSERT(\it hnsw, q, M, M_{max}, efConstruction, m_L \tt)$ : 新元素 $q$ 插入算法。
- $\tt SEARCH\ LAYER(\it q, ep, ef, l_c \tt)$ : 在第 $l_c$ 层查找距离 $q$ 最近邻的 $ef$ 个元素。
- $\tt SELECT\ NEIGHBORS\ SIMPLE( \it q, C, M \tt) $ : 在候选点集合 $C$ 中 选取距离 $q$ 最近邻的 $M$ 个元素。
- $\tt SELECT\ NEIGHBORS\ HEURISTIC(\it q, C, M, lc, extendCandidates, keepPrunedConnections \tt)$ : 探索式寻找最近邻。
- $\tt KNN\ SEARCH(\it hnsw, q, K, ef \tt)$ : 在 $hnsw$ 索引中查询距离 $q$ 最近邻的 $K$ 个元素。
近似最近邻算法 HNSW 学习笔记(一)介绍
前言
实验室一直在用到推荐系统,其中最重要的一部分就是利用近似最近邻算法(ANN)在大量论文/专利/项目中找到最相似的的论文/专利/项目进行推荐。
之前的 ANN 算法一直是 gensim 中使用的 Annoy。但是鉴于基于图的 HNSW 在 ANN Benchmarks 中的优异表现,需要对其进行学习并且进行一定修改,最后应用到推荐系统中。
KNN 和 ANN
k-Nearest Neighbor, KNN
- K最近邻算法,可用作聚类、回归等。
Approximate nearest neighbor, ANN
- 目前在高维度度量空间中没有有效精确 NNS 的方法。这背后的原因在于维度的“诅咒” 。为了避免维数的诅咒,减少对 kNN 问题解决方案的要求,使其近似(ANN),精度允许的条件下通过牺牲准确率来换取比暴力搜索要快的多的搜索速度。
- ANN 应用:推荐系统。
算法学习——错排问题
使用 jQuery 实现 Solr 搜索的前端页面展示
前言
今天要做的是一个具有搜索功能的前端页面,通过调用 Solr 搜索的接口来实现搜索功能。其中为了解决跨域的问题,利用 Python 写了一个简单的 Flask 服务器来请求 Solr,而前端页面仅需请求 Flask 服务器。
之前用 Vue.js 搭建过一个数据可视化平台,本来今天的搜索只需在之前的项目中添加一个 Tab 就可以了,但是这次的要求是初学者比较容易理解和上手,所以这次我们选用了 jQuery ,Bootstrap 4 来构建本次页面。
jQuery —— 简化的 JavaScript
jQuery 曾经是最流行的 Web 前端 JavaScript 库,可是现在无论是国内还是国外他的使用率正在渐渐被其他的基于 MVVM 思想的 JavaScript 库(例如 Vue,React,Angular)所代替,随着浏览器厂商对 HTML5 规范统一遵循以及 ECMA6 在浏览器端的实现,jQuery 的使用率将会越来越低。
jQuery 是使用选择器 $
选取 DOM(文档对象模型,可以理解成 HTML 中的元素)对象,对其进行赋值、取值、事件绑定等操作,其实和原生的 JavaScript 的区别只在于可以更方便的选取和操作 DOM 对象,而数据和界面是在一起的。比如需要获取 label 标签的内容:$("lable").val();
,它还是依赖 DOM 元素的值。
基本用法在 jQuery 教程 | 菜鸟教程。