局部敏感哈希源代码-python
之前在研究lsh算法,糊里糊涂的,但是该算法的高速性能让我还是得把他搞懂。
借鉴之前阅读的各个大佬博客,从相思能推荐的角度完善了一版代码,花了两天时间才调试出来,看看以后能不能用得上。大家有需求的可以直接使用了,福利满满。嘎嘎嘎
功能:已知一个样本的二进制特征向量,从特征中心中找出特征相似的样本
源代码:
import numpy as np def lsh(): T = 3 # 表个数 m = 6 # hash函数个数 M = np.array([[1,0,1,1,0,1],[1,1,0,1,1,1],[0,0,1,1,1,1],[1,1,1,0,1,1],[0,0,1,0,1,0],[1,1,1,0,0,1],[1,0,1,0,0,1]]) users_size, items_size = M.shape # 建立hash表,维度:shape=(3, 11112, 0) 十进制数 [[] for _ in range(3)]:实现初始化的作用 hashtables = [[[] for _ in range(int('1' * m) + 1)] for _ in range(T)] # print(hashtables) # 为每一个hash表构建一个随机矩阵 random_matrixes = [np.empty((m, items_size)) for _ in range(T)] for i in range(T): random_matrixes[i] = np.random.uniform(-1, 1, (m, items_size)) # 每一个用户 for i, user_vec in enumerate(M): # print('当前用户向量:',user_vec) # 每一个hash表 for j in range(T): # 每次构建随机矩阵 v = random_matrixes[j] # print('哈希函数矩阵:',v) index = '' for k in range(m): index += '1' if np.dot(user_vec, v[k]) >0 else '0' # 存入哈希表 t_index = int(index, 2) hashtables[j][t_index].append(i) print(hashtables) # 查找相似用户 target_vec = [1,0,1,0,0,1] all_user = [[1,0,1,1,0,1],[1,1,0,1,1,1],[0,0,1,1,1,1],[1,1,1,0,1,1],[0,0,1,0,1,0],[1,1,1,0,0,1],[1,0,1,0,0,1]] similar_users = set() for i, hashtable in enumerate(hashtables): index = '' for j in range(m): index += '1' if np.dot(target_vec, random_matrixes[i][j]) > 0 else '0' target_index = int(index, 2) # x = hashtable[target_index] # print(x) similar_users |= set(hashtable[target_index]) print('当前向量:',target_vec) print('当前向量的相似性向量:') for each in similar_users: print(each, M[each])
时刻记着自己要成为什么样的人!