之前在研究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])