[总结]集体智慧编程中用到的数据评估模型

本文总结了集体智慧编程中涉及的数据评估模型,包括欧几里得距离、皮尔逊相关度、基尼不纯度等。重点探讨了不同距离和相似度计算方法的应用场景,如欧氏距离适用于数值差异分析,余弦相似度适用于方向差异分析。还介绍了权重比例模型,如反函数、减法函数和高斯函数,以及各种距离度量的优缺点,如马氏距离、曼哈顿距离、切比雪夫距离等。
摘要由CSDN通过智能技术生成

做数据分析时,数据间权重和距离的计算是最常见的也是很重要的问题。快速扫了一遍集体智慧编程的相关分类,推荐算法后,

对数据的建模预处理整理总结下,以备以后使用。

一、数据间的相似度,距离计算

1.欧几里得距离(第二章)

最简单直观的计算方式,直接计算两组数据间的属性距离,对每一项属性求差平方和再相加开平方。

值域[0,正无穷),可以取倒数1/(1+dis)。映射到(0,1]的区间,值越大距离越近。

python源代码如下

# Returns a distance-based similarity score for person1 and person2
def sim_distance(prefs,person1,person2):
  # Get the list of shared_items
  si={}
  for item in prefs[person1]:
    if item in prefs[person2]: si[item]=1

  # if they have no ratings in common, return 0
  if len(si)==0: return 0
  # Add up the squares of all the differences
  sum_of_squares=sum([pow(prefs[person1][item]-prefs[person2][item],2)
                      for item in prefs[person1] if item in prefs[person2]])

  return 1/(1+sum_of_squares)
处理规范数据时好用,但是如果数据间值偏差比较大,计算效果不理想。


2.皮尔逊相关度评价(第二章)

相比欧几里得跟复杂一些,计算两个数据在一条直线上的拟合程度,对于大偏差的数据集效果更好。

在第三章博客文章计算单词距离时也是用到,欧几里得距离无法有效评估两篇单词数相差很大的文章的距离

# Returns the Pearson correlation coefficient for p1 and p2
def sim_pearson(prefs,p1,p2):
  # Get the list of mutually rated items
  si={}
  for item in prefs[p1]:
    if item in prefs[p2]: si[item]=1

  # if they are no ratings in common, return 0
  if len(si)==0: return 0

  # Sum calculations
  n=len(si)

  # Sums of all the preferences
  sum1=sum([prefs[p1][it] for it in si])
  sum2=sum([prefs[p2][it] for it in si])

  # Sums of the squares
  sum1Sq=sum([pow(prefs[p1][it],2) for it in si])
  sum2Sq=sum([pow(prefs[p2][it],2) for it in si])

  # Sum of the products
  pSum=sum([prefs[p1][it]*prefs[p2][it] for it in si])

  # Calculate r (Pearson score)
  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

二、数据集的混乱程度评估

1.基尼不纯度(第七章)

来自集合中的某种结果随机应用于集合中的某一类别的预期误差率。

如果集合中所有数据都是同一分类则误差率为0,如果有4种可能则误差率为0.75

def uniquecounts(rows):
   results={}
   for row in rows:
      # The result is the last column
      r=row[len(row)-1]
      if r not in results: results[r]=0
      results[r]+=1
   return results
def giniimpurity(rows):
  total=len(rows)
  counts=uniquecounts(rows) 
  imp=0
  for k1 in counts:
    p1=float(counts[k1])/total
    for k2 in counts:
      if k1==k2: continue
      p2=float(counts[k2])/total
      imp+=p1*p2
  return imp


2.熵
越混乱熵值越高(第七章)

def entropy(rows):
   from math import log
   log2=lambda x:log(x)/log(2)
   results=uniquecounts(rows)
   # Now calculate the entropy
   ent=0.0
   for r in results.keys():
      p=float(results[r])/len(rows)
      ent=ent-p*log2(p)
   return ent

熵和基尼不纯度的主要区别在于,熵到达峰值的过程要相对慢一些,因此熵对于混乱集合的“判罚”程度要更重。


三、权重比例模型

对于一些值进行预估,或者计算某一属性的时候,通常需要利用已有的值进行计算,这时可能需要对不同的数据添加

对应的权值。

1.反函数

v = 1/(val+0.1)

执行速度快,容易实现,缺点在于衰减速度快,对噪声敏感。

2.减法函数

v=const-val>0?const-val:0

3.高斯函数

在距离为0时权重值为1,并且权重值随着距离增加而减少,但是不会衰减到0

def gaussian(dist,sigma=5.0):
  return math.e**(-dist**2/(2*sigma**2))



附录:常用的距离度量函数

X=(x1,x2,..,xn)T,Y=(y1,y2,...yn)T为两个输入向量,

欧几里得距离(Euclidean distance)-EuclideanDistanceMeasure.

Euclidean Distance

相当于高维空间内向量说表示的点到点之间的距离。
由于特征向量的各分量的量纲不一致,通常需要先对各分量进行标准化,使其与单位无关,比如对身高(cm)和体重(kg)两个单位不同的指标使用欧式距离可能使结果失效
优点:简单,应用广泛(如果也算一个优点的话)
缺点:没有考虑分量之间的相关性,体现单一特征的多个分量会干扰结果。


马氏距离(Mahalanobis distance)-MahalanobisDistanceMeasure

C=E[(X-X平均)(Y-Y平均)]为该类输入向量X的协方差矩阵.(T为转置符号,E取平均时是样本因此为n-1)

适用场合:
1)度量两个服从同一分布并且其协方差矩阵为C的随机变量X与Y的差异程度
2)度量X与某一类的均值向量的差异程度,判别样本的归属。此时,Y为类均值向量.
优点
1)独立于分量量纲
2)排除了样本之间的相关性影响。
缺点:不同的特征不能差别对待,可能夸大弱特征。

闵可夫斯基距离(Minkowsk distance)-MinkowskiDistanceMeasure(默认p=3)

Minkowski Distance

可看成是欧氏距离的指数推广,还没有见到过很好的应用实例,但通常,推广都是一种进步,特别的,

当p=1,也成做曼哈顿距离,也称绝对距离,曼哈顿距离来源于城市区块距离,是将多个维度上的距离进行求和后的结果ManhattanDistanceMeasure.

Manhattan Distance

当q=∞时,称为切比雪夫距离ChebyshevDistanceMeasure 

切比雪夫距离起源于国际象棋中国王的走法,我们知道国际象棋国王每次只能往周围的8格中走一步,那么如果要从棋盘中A格(x1, y1)走到B格(x2, y2)最少需要走几步?扩展到多维空间,其实切比雪夫距离就是当p趋向于无穷大时的明氏距离:

Chebyshev Distance

汉明距离(Hamming distance)-Mahout无

在信息论中,两个等长字符串之间的汉明距离是两个字符串对应位置的不同字符的个数。换句话说,它就是将一个字符串变换成另外一个字符串所需要替换的字符个数。

    例如:

    1011101 与 1001001 之间的汉明距离是 2。
    2143896 与 2233796 之间的汉明距离是 3。
    "toned" 与 "roses" 之间的汉明距离是 3。

Tanimoto系数(又称广义Jaccard系数)-TanimotoDistanceMeasure.

通常应用于X为布尔向量,即各分量只取0或1的时候。此时,表示的是X,Y的公共特征的占X,Y所占有的特征的比例。

Jaccard系数

Jaccard系数主要用于计算符号度量或布尔值度量的个体间的相似度,因为个体的特征属性都是由符号度量或者布尔值标识,因此无法衡量差异具体值 的大小,只能获得“是否相同”这个结果,所以Jaccard系数只关心个体间共同具有的特征是否一致这个问题。如果比较X与Y的Jaccard相似系数, 只比较xn和yn中相同的个数,公式如下:


Jaccard Coefficient

皮尔逊相关系数(Pearson correlation coefficient)-PearsonCorrelationSimilarity

即相关分析中的相关系数r,分别对X和Y基于自身总体标准化后计算空间向量的余弦夹角。公式如下:

Pearson Correlation Coefficient

余弦相似度(cosine similarity)-CosineDistanceMeasure

Cosine Similarity

就是两个向量之间的夹角的余弦值。

余弦相似度用向量空间中两个向量夹角的余弦值作为衡量两个个体间差异的大小。相比距离度量,余弦相似度更加注重两个向量在方向上的差异,而非距离或长度上。

优点:不受坐标轴旋转,放大缩小的影响。

9.调整余弦相似度-Adjusted Cosine Similarity

虽然余弦相似度对个体间存在的偏见可以进行一定的修正,但是因为只能分辨个体在维之间的差异,没法衡量每个维数值的差异,会导致这样一 个情况:比如用户对内容评分,5分制,X和Y两个用户对两个内容的评分分别为(1,2)和(4,5),使用余弦相似度得出的结果是0.98,两者极为相 似,但从评分上看X似乎不喜欢这2个内容,而Y比较喜欢,余弦相似度对数值的不敏感导致了结果的误差,需要修正这种不合理性,就出现了调整余弦相似度,即 所有维度上的数值都减去一个均值,比如X和Y的评分均值都是3,那么调整后为(-2,-1)和(1,2),再用余弦相似度计算,得到-0.8,相似度为负 值并且差异不小,但显然更加符合现实。

调整余弦相似度和余弦相似度,皮尔逊相关系数在推荐系统中应用较多。在基于项目的推荐中,GroupLens有篇论文结果表明调整余弦相似度性能要优于后两者。

10.基于权重的距离计算方法:

WeightedDistanceMeasure、WeightedEuclideanDistanceMeasure 、 WeightedManhattanDistanceMeasure

欧氏距离与余弦相似度

借助三维坐标系来看下欧氏距离和余弦相似度的区别:

distance and similarity

根据欧氏距离和余弦相似度各自的计算方式和衡量特征,分别适用于不同的数据分析模 型:欧氏距离能够体现个体数值特征的绝对差异,所以更多的用于需要从维度的数值大小中体现差异的分析,如使用用户行为指标分析用户价值的相似度或差异;而 余弦相似度更多的是从方向上区分差异,而对绝对的数值不敏感,更多的用于使用用户对内容评分来区分用户兴趣的相似度和差异,同时修正了用户间可能存在的度 量标准不统一的问题(因为余弦相似度对绝对数值不敏感)。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值