지역 시스템을 기반으로 추천 알고리즘 --- 협업 필터링 알고리즘

이웃에 기반 협력 필터링은 사용자와 협력 필터링 기반 협력 필터링 항목에 기초하여, 두 개의 카테고리로 나누어진다. 그는 비슷한 관심사 좋아하는 항목과 사용자와 다른 사용자에게 추천 전자는 후자 전에 권장 그는 유사한 항목 항목을 좋아했다.

사용자 협력 필터링 알고리즘에 근거

여기서 사용자 기반 협력 필터링은, 정의에 의해, 다음의 두 단계로 나누어 질 수있다 :

  1. 그리고 비슷한 관심사를 가진 사용자의 대상 사용자 집합을 찾을 수
  2. 그리고 대상 사용자에게 권장되는 사용자 친화적 인의 수집 및 항목 들어 본 적이 대상 사용자를 찾을 수

기본 알고리즘은 사용자의 유사도를 산출한다 :

(1) Jaccard 공식

(2) 코사인 유사도 :

사용자의 이익 사이의 유사성의 정도를 획득 한 후, 가장 유사한 UserCF 알고리즘은 사용자가 마음에 드는 아이템을 추천 K 사용자에 관심 줄 것이다, 다음의 식 즉, 사용자 U 기사에 대한 관심이 전의 수준 :

S (U, K)에 가장 가까운 사용자를 포함하는 경우 u 및 K 사용자 관심, N (i)는 상기 사용자 설정 항목 I의 문제가 있고, W UV는 사용자 u와 사용자 V, R & LT의 관심의 유사성이다 VI의 대표 아이템에 관심 사용자 V의 I, 그 경우 R & LT VI =. 1

각 항목은 항목의 목록이 동작을 생성 한 사용자를 저장합니다 위해 사용자는, 룩업하는 테이블을 아래 항목을 만들 수 있습니다

A는 위의 그림을 추천 할 수 있습니다를 선택합니다 K = 3, 기사는 C의 사용자, 이상, 그것은 사용자 A에이 두 항목을 추천 할 수 있으며, 문서 C의 사용자 A, E의 관심은 전자되는 것은 아닙니다 행위 :

개선 :

톱 알고리즘은 예를 들어, 두 사람이 "신화 사전"이 책을 구입하지만, 이것은 대부분의 사람들이 책을 구입하기 때문에 비슷한 관심사를 가진 두 사람이, 경우 두 사용자가 구입하는 것을 의미하지 않았다, 문제가 이명이 한 데이터 마이닝 사람들이 책을 구입하므로 매우 비슷한 관심사를 고려 될 수 있으며, 그 "소개 데이터 마이닝". 즉 자신의 이익의 유사성을 설명하는 성능이 월등하고, 따라서 유사성 측정 기능이 같은 행동을 한 두 사람이 인기가없는 항목에 걸릴 수 있습니다 :

 

기사에 기반 협업 필터링 알고리즘

공정은 두 단계로 구성되어 여기 협력 필터링 알고리즘을 기반으로 문서 :

  1. 항목들 사이의 유사도를 계산
  2. 사용자 행동 및 기록 항목의 유사성을 기반으로 사용자가 생성 한 추천 목록

유사성 계산 항목 :

N (I) : 기사 나는 같은 사용자의 수 | N (I) ∩N (J) | : 나는 사용자의 기사와 항목 J 번호를 좋아하면서

与UserCF算法类似,用ItenCF算法计算物品相似度时,也可以首先建立用户-物品倒排表(即对每个用户建立一个包含他喜欢的物品的列表),然后对于每个用户,将物品列表中的物品两两在共现矩阵C中加1,最终将这些矩阵相加得到上边的C矩阵,其中C[i][j]记录同时喜欢物品i和物品j的用户数,最后将c矩阵归一化得到物品之间的余弦相似度矩阵W。

 

得到物品的相似度之后,ItemCF通过如下公式计算用户u对一个物品j的兴趣:

N(u)是用户喜欢的物品的集合,S(i,k)是和物品i最相似的k个物品的集合,wji 是物品j和i的相似度,rui是用户u对物品i的兴趣。对于隐反馈数据集,如果用户u对物品i有过行为,即可令rui=1,该公式的含义是,和用户历史上感兴趣的物品越相似,越有可能在用户的推荐列表中获得比较高的排名。

用户活跃度对用户的影响

除了上面的分析权重的过程,还可以考虑用户活跃度对物品相似度的影响IUF,即活跃用户对物品相似度的贡献应该小于不活跃的用户,因袭增加IUF参数来修正物品相似度的计算公式

  

物品相似度归一化

如果已经得到了物品的相似性矩阵w,则可以得到归一化之后的相似度矩阵w'

归一化之后的好处是不仅仅增加推荐的准确度,还提高了覆盖率和多样性。

 

实现算法:

复制代码
import math
import time
import pandas as pd

def calcuteSimilar(series1,series2):
    '''
    计算余弦相似度
    :param data1: 数据集1 Series
    :param data2: 数据集2 Series
    :return: 相似度
    '''
    unionLen = len(set(series1) & set(series2))
    if unionLen == 0: return 0.0
    product = len(series1) * len(series2)
    similarity = unionLen / math.sqrt(product)
    return similarity

def calcuteUser(csvpath,targetID=1,TopN=10):
    '''
    计算targetID的用户与其他用户的相似度
    :return:相似度TopN Series
    '''
    frame = pd.read_csv(csvpath)                                                        #读取数据
    targetUser = frame[frame['UserID'] == targetID]['MovieID']                          #目标用户数据
    otherUsersID = [i for i in set(frame['UserID']) if i != targetID]                   #其他用户ID
    otherUsers = [frame[frame['UserID'] == i]['MovieID'] for i in otherUsersID]         #其他用户数据
    similarlist = [calcuteSimilar(targetUser,user) for user in otherUsers]              #计算
    similarSeries = pd.Series(similarlist,index=otherUsersID)                           #Series
    return similarSeries.sort_values()[-TopN:]

def calcuteInterest(frame,similarSeries,targetItemID):
    '''
    计算目标用户对目标物品的感兴趣程度
    :param frame: 数据
    :param similarSeries: 目标用户最相似的K个用户
    :param targetItemID: 目标物品
    :return:感兴趣程度
    '''
    similarUserID = similarSeries.index                                                 #和用户兴趣最相似的K个用户
    similarUsers = [frame[frame['UserID'] == i] for i in similarUserID]                 #K个用户数据
    similarUserValues = similarSeries.values                                            #用户和其他用户的兴趣相似度
    UserInstItem = []
    for u in similarUsers:                                                              #其他用户对物品的感兴趣程度
        if targetItemID in u['MovieID'].values: UserInstItem.append(u[u['MovieID']==targetItemID]['Rating'].values[0])
        else: UserInstItem.append(0)
    interest = sum([similarUserValues[v]*UserInstItem[v]/5 for v in range(len(similarUserValues))])
    return interest

def calcuteItem(csvpath,targetUserID=1,TopN=10):
    '''
    计算推荐给targetUserID的用户的TopN物品
    :param csvpath: 数据路径
    :param targetUserID: 目标用户
    :param TopN:
    :return: TopN个物品及感兴趣程度
    '''
    frame = pd.read_csv(csvpath)                                                        #读取数据
    similarSeries = calcuteUser(csvpath=csvpath, targetID=targetUserID)                 #计算最相似K个用户
    userMovieID = set(frame[frame['UserID'] == 1]['MovieID'])                           #目标用户感兴趣的物品
    otherMovieID = set(frame[frame['UserID'] != 1]['MovieID'])                          #其他用户感兴趣的物品
    movieID = list(userMovieID ^ otherMovieID)                                          #差集
    interestList = [calcuteInterest(frame,similarSeries,movie) for movie in movieID]    #推荐
    interestSeries = pd.Series(interestList, index=movieID)
    return interestSeries.sort_values()[-TopN:]                                         #TopN

if __name__ == '__main__':
    print('start..')
    start = time.time()
    a = calcuteItem('ratings.csv')
    print(a)
    print('Cost time: %f'%(time.time()-start))
复制代码

추천

출처www.cnblogs.com/cmybky/p/11776390.html