zoukankan      html  css  js  c++  java
  • 用户相似度计算

    协同过滤中用户距离计算

    # 构建共同的评分向量
    def build_xy(user_id1, user_id2):
        bool_array = df.loc[user_id1].notnull() & df.loc[user_id2].notnull()
        return df.loc[user_id1, bool_array], df.loc[user_id2, bool_array]
    # 欧几里德距离
    def euclidean(user_id1, user_id2):
        x, y = build_xy(user_id1, user_id2)
        try:
            value = sum((x - y)**2)**0.5
        except ZeroDivisionError:
            value = 0
        return value
    
    
    # 余弦相似度
    def cosine(user_id1, user_id2):
        x, y = build_xy(user_id1, user_id2)
        # 分母
        denominator = (sum(x*x)*sum(y*y))**0.5
        try:
            value = sum(x*y)/denominator
        except ZeroDivisionError:
            value = 0
        return value
    
    
    # 皮尔逊相关系数
    def pearson(user_id1, user_id2):
        x, y = build_xy(user_id1, user_id2)
        mean1, mean2 = x.mean(), y.mean()
        # 分母
        denominator = (sum((x-mean1)**2)*sum((y-mean2)**2))**0.5
        try:
            value = sum((x - mean1) * (y - mean2)) / denominator
        except ZeroDivisionError:
            value = 0
        return value
    # 1.如果数据密集(所有数据几乎都有属性值,属性值量级重要),就用欧几里德算法
    # 2.数据受级别膨胀影响(不同的用户使用不同的评分标准),就用皮尔逊相关系数算法
    # 3.数据稀疏性强,就考虑用夹角余弦相似度算法
  • 相关阅读:
    Vasya and Endless Credits CodeForces
    Dreamoon and Strings CodeForces
    Online Meeting CodeForces
    数塔取数 基础dp
    1001 数组中和等于K的数对 1090 3个数和为0
    1091 线段的重叠
    51nod 最小周长
    走格子 51nod
    1289 大鱼吃小鱼
    POJ 1979 Red and Black
  • 原文地址:https://www.cnblogs.com/lzhc/p/9206386.html
Copyright © 2011-2022 走看看