Коэффициент Жаккара глубокого обучения

глубокое обучение

Коэффициент Жаккара

Чем больше значение коэффициента Жаккара, тем выше сходство выборки.

J(A,B)=ABA+BABJ(A,B)= \frac{|A\bigcap B|}{|A| +|B| - | A \bigcap B| }

Расстояние Жаккара

Показатель, связанный с коэффициентом Жаккара, называется расстоянием Жаккара, которое используется для описания различий между наборами. Чем больше расстояние Жаккара, тем ниже сходство выборки.

dj(A,B)=1ABA+BABd_{j}(A,B)= 1 - \frac{|A\bigcap B|}{|A| +|B| - | A \bigcap B| }

пример

Предполагая, что есть 6 пользователей и 5 продуктов, пользователи могут приобретать случайным образом не только покупки, но и поведение, например коллекции. Данные записываются в двумерную таблицу.

import pandas as pd
import numpy as np

users = [f"User{i}" for i in range(1, 6)]
items = [f"Item{i}" for i in 'ABCDE']

# 假设用户购买记录
datasets = [
    [1, 0, 1, 1, 0],
    [1, 0, 0, 1, 1],
    [1, 0, 1, 0, 0],
    [0, 1, 0, 1, 1],
    [1, 1, 1, 0, 1],
]
df = pd.DataFrame(datasets, columns=items, index=users)

       ItemA  ItemB  ItemC  ItemD  ItemE
User1      1      0      1      1      0
User2      1      0      0      1      1
User3      1      0      1      0      0
User4      0      1      0      1      1
User5      1      1      1      0      1

Например, чтобы вычислить сходство между ItemA и ItemB, ItemA = [1,1,1,0,1], ItemB=[0,0,0,1,1], существует одно пересечение между ItemA и ItemB, и объединение Есть 5. Обратите внимание, что если оба равны 0, коэффициент Жаккара j = 1/5 = 0,2, если ItemA = [0,1,1,0,1], ItemB=[0,0,0, 1, 1], j = 1/4 = 0,25

score = jaccard_score(df['ItemA'], df['ItemB'])  # 0.2

сходство между любыми двумя пользователями

# 求任意两个用户之间的距离
from sklearn.metrics import pairwise_distances
# jaccard 距离
jaccard_dis = pairwise_distances(df.values, metric='jaccard')
[[0.         0.5        0.33333333 0.8        0.6       ]
 [0.5        0.         0.75       0.5        0.6       ]
 [0.33333333 0.75       0.         1.         0.5       ]
 [0.8        0.5        1.         0.         0.6       ]
 [0.6        0.6        0.5        0.6        0.        ]]

Процесс расчета выглядит следующим образом:

结果数组是一个5*5的二维表,数组的第一行第一列就是a[1]与a[1]之间的jaccard距离,数组的第一行第二列就是a[1]与a[2]之间的jaccard距离
a[1] = [1, 0, 1, 1, 0]
a[2] = [1, 0, 0, 1, 1]
a[3] = [1, 0, 1, 0, 0]
a[4] = [0, 1, 0, 1, 1]
a[5] = [1, 1, 1, 0, 1]
按照上面的计算方法可以计算出jaccard距离
user_sim = 1 - jaccard_dis # jaccard相似系数

# print("任意两个用户相似系数")
user_sim = pd.DataFrame(user_sim, columns=users, index=users)

сходство между любыми двумя предметами

item_sim = 1 - pairwise_distances(df.T.values, metric='jaccard')
item_sim = pd.DataFrame(item_sim, columns=items, index=items)

topN

# 基于用户的协同过滤  找每一个用户最相似的两个
topN_users = {}

for i in user_sim.index:
    df1 = user_sim.loc[i].drop(i)
    df1_sorted = df1.sort_values(ascending=False)
    top2 = list(df1_sorted.index[:2])
    topN_users[i] = top2
{'User1': ['User3', 'User2'], 'User2': ['User4', 'User1'], 'User3': ['User1', 'User5'], 'User4': ['User2', 'User5'], 'User5': ['User3', 'User4']}

Рекомендуемые результаты

# 根据topN的相似用户构建推荐结果
rs_results = {}

for user, sim_users in topN_users.items():
    rs_result = set()
    for sim_user in sim_users:
        # 获取物品共同购买过的集合
        rs_result |= set(df.loc[sim_user].replace(0, np.nan).dropna().index)

    # 过滤掉已经购买的商品
    rs_result -= set(df.loc[user].replace(0, np.nan).dropna().index)
    rs_results[user] = rs_result
{'User1': {'ItemE'}, 'User2': {'ItemB', 'ItemC'}, 'User3': {'ItemD', 'ItemB', 'ItemE'}, 'User4': {'ItemA', 'ItemC'}, 'User5': {'ItemD'}}

В связанных исследованиях метод измерения подобия, основанный на системе совместной фильтрации элементов, обычно использует косинусное сходство. Однако во многих практических приложениях оценочные данные слишком скудны, икосинусное сходствоРасчеты могут привести к ошибочным результатам. Мера подобия Жаккара применяется к системе совместной фильтрации на основе элементов, и устанавливается соответствующий метод анализа оценки. По сравнению с традиционным методом измерения подобия метод Жаккара устраняет недостаток косинусного подобия, который учитывает только оценки пользователей и игнорирует другую информацию, и особенно подходит для приложений с чрезмерно разреженными данными.