zoukankan      html  css  js  c++  java
  • (数据挖掘-入门-2)相似度衡量的方法

    主要内容:

    1、距离度量

    2、皮尔逊关系系数

    3、cosine相似度

    4、方法的选择

    1、距离度量

    距离度量是最简单的衡量相似度的方法,公式如下:

    当r=1时,为曼哈顿距离(manhattan distance);

    当r=2时,为欧几里得距离(Euclidean distance);

    优点:简单

    缺点:当数据某些属性或特征缺失时,该度量结果不准确

    代码:

    def minskowski(rating1,rating2,r):
        distance=0
        commonRatings=Flase
        for key in rating1:
            for key in rating2:
                distance+=pow(abs(rating1[key]-rating2[key]),r)
                commonRatings=True
        if commonRatings:
            return pow(distance,1/r)
        else:
            return 0 #indicates no ratings in common

    2、皮尔逊关系系数(Pearson Correlation Coefficient)

    有时候,每个人的判断标准不一样,例如在给物品打分(1-5)时,有的人的打分范围为4-5,而有的人为1-5,而他们其实的评价结果是一样的。

    但如果通过上述的距离度量的话,那么这两个人的相似度则会相差甚远,因此需要一种类似归一化的方法来解决。

    公式如下:

    r范围为-1~1

    在实际代码实现中,也可以写成下面的形式,这样子就只需要遍历一遍数据即可。

    代码:

    def pearson(rating1, rating2):
        sum_xy = 0
        sum_x = 0
        sum_y = 0
        sum_x2 = 0
        sum_y2 = 0
        n = 0
        for key in rating1:
            if key in rating2:
                n += 1
                x = rating1[key]
                y = rating2[key]
                sum_xy += x * y
                sum_x += x
                sum_y += y
                sum_x2 += pow(x, 2)
                sum_y2 += pow(y, 2)
        # now compute denominator
        denominator = sqrt(sum_x2 - pow(sum_x, 2) / n) * sqrt(sum_y2 - pow(sum_y, 2) / n)
        if denominator == 0:
            return 0
        else:
            return (sum_xy - (sum_x * sum_y) / n) / denominator
      

    3、cosine 相似度

    在距离度量中提到,特征空间往往都是稀疏的,如果通过距离去度量相似性的话,会出现不准确的结果。

    因此,cosine相似度计算可以解决这个问题,因为它会忽略0值的计算,公式如下:

    代码:

    def cosine(rating1, rating2):
        sum_xy = 0
        sum_x2 = 0;
        sum_y2 = 0
        for key in rating1:
            sum_x += rating1[key] * rating1[key]
        for key in rating2:
            sum_y += rating2[key] * rating2[key]
        for key in rating1:
            for key in rating2:
                sum_xy += rating1[key] * rating2[key]
        
        denominator = sqrt(sum_x2) * sqrt(sum_y2)
        if denominator == 0:
            return 0
        else:
            return sum_xy / denominator

    4、方法的选择

    如果数据是密集dense,那么可以用距离度量;

    如果数据是稀疏的sparse,那么可以用cosine度量;

    如果数据尺度不一致,那么可以用pearson度量;

  • 相关阅读:
    Read-Copy Update Implementation For Non-Cache-Coherent Systems
    10 华电内部文档搜索系统 search04
    10 华电内部文档搜索系统 search05
    lucene4
    10 华电内部文档搜索系统 search01
    01 lucene基础 北风网项目培训 Lucene实践课程 索引
    01 lucene基础 北风网项目培训 Lucene实践课程 系统架构
    01 lucene基础 北风网项目培训 Lucene实践课程 Lucene概述
    第五章 大数据平台与技术 第13讲 NoSQL数据库
    第五章 大数据平台与技术 第12讲 大数据处理平台Spark
  • 原文地址:https://www.cnblogs.com/AndyJee/p/4852004.html
Copyright © 2011-2022 走看看