2017年6月3日机器学习笔记

本文介绍协同过滤技术的基本原理,包括用户偏好的收集方法、不同用户的相似度计算方式,并探讨了如何选择合适的相似性度量方法及实现推荐系统的具体步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Collaborative Filtering

David Goldberg 1992 《Using collaborative filtering to weave an information tapestry》
Tapestry框架 web端 (—>待了解)

1.搜集偏好 Collecting Preferences

python 嵌套字典 数据库

2.寻找相似的用户 Finding Similar Users

相似度评价
1.欧几里得距离 Euclidean Distance Score

—————————————————————————————————
代码段

from math import sqrt

#返回一个有关person1与person2的基于距离的相似度评价
def sim_distance(prefs,person1,person2):
    #得到shared_items的列表
    si = {}
    for item in prefs[person1]:
        if item in prefs[person2]:
            si[item] = 1
    #如果两者没有共同之处,则返回0
    if len(si) == 0: return 0
    #计算所有差值的平方和
    sum_of_squares = sum([pow(prefs[person1][item] - prefs[preson2][item],2)
                        for item in prefs[person1] if item in prefs[person2]])
    return 1/(1+sqrt(sum_of_squares))

—————————————————————————————————

2.皮尔逊相关度评价 Pearson Correlation Score

修正夸大分值(grade inflation)在数据不规范的时候会倾向于给出更好的结果
—————————————————————————————————
计算公式
num=Nk=1aibiNk=1aiNk=1biN

den=(Nk=1a2i(Nk=1ai)2N)(Nk=1b2i(Nk=1bi)2N)

res=numden
—————————————————————————————————
代码段

def sim_pearson(prefs,person1,person2):
    # 得到双方都曾评价过的物品列表
    si={}
    for item in prefs[person1]:
        if item in prefs[person2]:
            si[item] = 1

    # 得到列表元素的个数
    n = len(si)

    # 如果两者没有共同之处,则返回1
    if n==0: return 1

    # 对所有偏好求和
    sum1 = sum([prefs[person1][item] for item in si])
    sum2 = sum([prefs[person2][item] for item in si])

    #求平方和
    sum1sq = sum([pow(prefs[person1][item],2) for item in si])
    sum2sq = sum([pow(prefs[person2][item],2) for item in si])

    #求乘积之和
    pSum = sum([prefs[person1][item]*prefs[person2][item] for item in si])

    #计算皮尔逊评价值
    num = pSum-(sum1*sum2/n)
    den = sqrt((sum1sq-pow(sum1,2)/n)*(sum2sq-pow(sum2,2)/n))
    if den == 0: return 0

    r = num/den

    return r

—————————————————————————————————

3.应该选择哪一种相似性度量方法 Which Similarity Metric Should You Use

(1)欧几里得算法

(2)皮尔逊相关度

(3)Jaccard系数 (—>待了解)

(4)曼哈顿距离算法

4.为评论者打分Ranking the Critics

—————————————————————————————————
代码段

#从反映偏好的字典中返回最为匹配者
#返回结果的个数和相似度函数均为可选参数
def topMatches(prefs,person,n=5,similarity=sim_pearson):
    scores=[(similarity(prefs,person,other),other)for other in prefs if other != person]
#对列表进行排序,评价值最高者排在最前面
    score.sort()
    score.reverse()
    return scores[0:n]

—————————————————————————————————

5.推荐物品Recommending Items

加权评价值

—————————————————————————————————
代码段

#利用所有他人评价值的加权平均,为某人提供建议
def getRecommendations(prefs,person,similarity = sim_pearson):
    totals = {}
    simSums = {}
    for other in prefs:
    #不用和自己做对比
        if other == person: continue
        sim = similarity(prefs,person,other)

        #忽略评价值为零或小于零的情况
        if sim<=0:continue
        for item in prefs[other]:
            #只对自己还没有看过的影片进行评价
            if item not in prefs[person] or prefs[person][item] == 0:
                totals.setdefault(item,0)
                #相似度*评价值
                totals[item]+=prefs[other][item]*sim
                #相似度之和
                simSums.setdefault(item,0)
                simSums[item]+=sim

    #建立一个归一化的列表
    rankings = [(total/simSums[item],item) for item,total in totals.items()]

    #返回经过排序的列表
    rankings.sort()
    rankings.reverse()
    return rankings

—————————————————————————————————

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值