局部敏感哈希源代码-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])

 

posted @ 2020-03-25 19:21  今夜无风  阅读(1388)  评论(0编辑  收藏  举报