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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM