• 局部敏感哈希源代码-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])
  • 相关阅读:
    2019.8.6原型链与继承
    2019.8.2闭包,作用域
    2019.8.1正则二
    2019.7.31正则
    2019.7.29二维数组
    2019.7.28关于数组和循环的八道题
    2019.7.27数组api
    DOM
    JavaScript数组5种去重方法
    JavaScript面向对象
  • 原文地址:https://www.cnblogs.com/demo-deng/p/12568758.html
Copyright © 2020-2023  润新知