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

来源:互联网 发布:淘宝评论员兼职赚钱吗 编辑:程序博客网 时间:2024/05/17 21:54

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

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

原创粉丝点击