我们对同样的一些电影,书,音乐进行评分,从这些评分中能看到我们彼此之间的相似度么?说到这里你可能会想到豆瓣,我们有没有方法来模仿豆瓣计算这种相似度呢?本文是《集体智慧编程》介绍相似度算法:欧几里德距离和皮尔逊相关度系数的一次演练。<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
本文将介绍.
距离是在传统统计学和数据挖掘中衡量接近程度的关键度量。我们如何衡量接近程度或距离呢?在详细介绍不同距离度量方式前,让我们先描述一个便于讨论的问题场景。
故事是这样的:一些人对同样的一些电影做出了评价,我们将在这个基础上进行分析.我们按照IMDB的评分规则,10分为电影的最高评分.首先我们将能够描述这一事实的数据构造出来放入数据库中.我们需要下列的表:
o Moive表 电影信息表
o UserInfo表 用户表(这些人将对电影给出评分)
o Moive_Level表
使用下面的SQL语句就可以完成上面数据表的建表工作.
CREATE TABLES
<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->ifexists(select*fromdbo.sysobjectswhereid=object_id(N'[dbo].[Moive]')andOBJECTPROPERTY(id,N'IsUserTable')=1)
droptable[dbo].[Moive]
GO
ifexists(select*fromdbo.sysobjectswhereid=object_id(N'[dbo].[Moive_Level]')andOBJECTPROPERTY(id,N'IsUserTable')=1)
droptable[dbo].[Moive_Level]
GO
ifexists(select*fromdbo.sysobjectswhereid=object_id(N'[dbo].[UserInfo]')andOBJECTPROPERTY(id,N'IsUserTable')=1)
droptable[dbo].[UserInfo]
GO
CREATETABLE[dbo].[Moive](
[Name][char](30)COLLATEChinese_PRC_CI_ASNOTNULL,
[Director][char](30)COLLATEChinese_PRC_CI_ASNULL,
[Actor][nvarchar](200)COLLATEChinese_PRC_CI_ASNULL,
[Year][int]NULL,
[Region][char](10)COLLATEChinese_PRC_CI_ASNULL,
[id][bigint]IDENTITY(1,1)NOTNULL
)ON[PRIMARY]
GO
CREATETABLE[dbo].[Moive_Level](
[UserID][char](20)COLLATEChinese_PRC_CI_ASNOTNULL,
[MoiveID][char](30)COLLATEChinese_PRC_CI_ASNOTNULL,
[Level][float]NULL
)ON[PRIMARY]
GO
CREATETABLE[dbo].[UserInfo](
[UserID][nvarchar](50)COLLATEChinese_PRC_CI_ASNULL,
[Age][int]NULL,
[ID][bigint]IDENTITY(1,1)NOTNULL
)ON[PRIMARY]
GO
首先是Moive电影表,我从一些电影网站中抽取了1330条电影信息,覆盖了爱情电影,动作电影,科幻电影等各种类型的电影.实际上我们坐算法演示的时候只用到其中的10条数据.如下图,这10条数据是比较有代表性的,从类型和发行时间上都有特点..
下列用户将对上面的十部电影进行评价:
用户对电影的评价是如下结构(下图试数据片段):
一个简单常用的距离度量是欧几里德距离。它以人们都评价过的电影为坐标轴,然后将参与评价的人绘制在图上,并考察它们的距离远近,换句话说这幅图就是描述了处于偏好空间中的人们.第一种算法考察方法是:
欧几里德距离
欧几里得度量定义欧几里得空间中点 x = (x1,...,xn) 和 y = (y1,...,yn) 之间的距离为
为了方便将这个算法应用到数据库上,我们创建一个存储过程EuclideanDistance:
EuclideanDistance
<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->SETQUOTED_IDENTIFIEROFF
GO
SETANSI_NULLSOFF
GO
CREATEPROCEDURE[dbo].[EuclideanDistance]
@UserIDAint,
@UserIDBint
AS
select@UserIDAUserA,@UserIDBUserB,sqrt(sum(result))Distance
From
(
selectm1.*,power(m1.level-m2.level,2)resultFrommoive_levelm1,moive_levelm2
wherem1.userid=@UserIDAandm2.userid=@UserIDBandm1.moiveid=m2.moiveid
)T
GO
SETQUOTED_IDENTIFIEROFF
GO
SETANSI_NULLSON
GO
Code
<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->下面我们计算一下用户Zen和Lily的距离,执行存储过程代码如下:
DECLARE@RCint
DECLARE@UserIDAint
DECLARE@UserIDBint
--Setparametervalues
EXEC@RC=[U-M].[dbo].[EuclideanDistance]1,2
我们多看几组距离:
DECLARE@RCint
DECLARE@UserIDAint
DECLARE@UserIDBint
--Setparametervalues
EXEC@RC=[U-M].[dbo].[EuclideanDistance]1,2
EXEC@RC=[U-M].[dbo].[EuclideanDistance]1,3
EXEC@RC=[U-M].[dbo].[EuclideanDistance]1,4
EXEC@RC=[U-M].[dbo].[EuclideanDistance]1,5
EXEC@RC=[U-M].[dbo].[EuclideanDistance]2,5
执行结果截图如下:
但是当评价结果中,评价者的评价相对于平均水平偏离很大的时候欧几里德距离不能很好的揭示出真实的相似度.还有一种评价方法就是使用皮尔逊相关系数,它可以完成"夸大值纠偏":
皮尔逊相关度系数
两个变量之间的相关系数越高,从一个变量去预测另一个变量的精确度就越高,这是因为相关系数越高,就意味着这两个变量的共变部分越多,所以从其中一个变量的变化就可越多地获知另一个变量的变化。如果两个变量之间的相关系数为1或-1,那么你完全可由变量X去获知变量Y的值。
· 当相关系数为0时,X和Y两变量无关系。
· 当X的值增大,Y也增大,正相关关系,相关系数在0.00与1.00之间
· 当X的值减小,Y也减小,正相关关系,相关系数在0.00与1.00之间
· 当X的值增大,Y减小,负相关关系,相关系数在-1.00与0.00之间
当X的值减小,Y增大,负相关关系,相关系数在-1.00与0.00之间
相关系数的绝对值越大,相关性越强,相关系数越接近于1和-1,相关度越强,相关系数越接近于0,相关度越弱。
PerasonRxy
<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->下面就是把这个算法用在我们的数据上了,我们创建一个存储过程PerasonRxy:
SETQUOTED_IDENTIFIEROFF
GO
SETANSI_NULLSOFF
GO
CREATEPROCEDURE[dbo].[PerasonRxy]
@useridaint,@useridbint
AS
selectsum(L1)SumA,sum(L2)SumB,sum(power(L1,2))SumA2,
sum(power(L2,2))SumB2,sum(result)Sum_Sqrt,
sum([Cross])Sum_Corss,(sum([Cross])-sum(L1)*sum(L2)/10),
sqrt((sum(power(L1,2))-power(sum(L1),2)/10)*(sum(power(L2,2))-power(sum(L2),2)/10)),
sum([Cross])Sum_Corss,(sum([Cross])-sum(L1)*sum(L2)/10)/sqrt((sum(power(L1,2))-power(sum(L1),2)/10)*(sum(power(L2,2))-power(sum(L2),2)/10))
From
(
selectm1.levelL1,m2.levelL2,power(m1.level-m2.level,2)result,m1.level*m2.level[Cross]Frommoive_levelm1,moive_levelm2
wherem1.userid=@useridaandm2.userid=@useridbandm1.moiveid=m2.moiveid
)T
GO
SETQUOTED_IDENTIFIEROFF
GO
SETANSI_NULLSON
GO
通常情况下:
相关系数0.8-1.0为极强相关
0.6-0.8为强相关
0.4-0.6为中等程度相关
0.2-0.4为弱相关
0.0-0.2为极弱相关或无相关
我们可以看出哪些用户之间的距离比较接近了... ...
分享到:
相关推荐
K-means聚类算法的性能依赖于距离度量的选择,k-means算法将欧几里德距离作为最常用的距离度量方法。欧氏距离认为所有属性在聚类中作用是相同的,但是这种距离度量方法并不能准确反映样本间的相异性。针对这种不足,...
matlab开发-QAM的欧几里得距离最小值。基于最小欧氏距离的QAM检测方法
在有限的欧几里德时空中定义的单强子长距离矩阵元素与相应的无限量Minkowski振幅之间存在关系。 这种关系在运动学区域中是有效的,在运动学区域中,任何数量的双强子状态都可以同时在壳上进行,因此包括了强耦合中间...
使用行进抛物线对多标签3D各向异性图像进行欧几里德距离和符号距离变换_C++_Cython_下载.zip
基于系统过滤的推荐算法,实现user-user、item-item推荐,计算欧几里德距离、皮尔逊相关度。
5. 两点间的距离:两点间的距离是指两点之间的欧几里德距离。在本课件中,讲解了如何计算两点间的距离,并提供了相关的计算示例。 6. 高中数学中的应用:本课件还讲解了高中数学中的应用,例如计算三角形的周长、...
提出了一个新的基于分布式EI Gamal加密的计算两个向量欧几里德距离的安全协议,并在混合模型下给出了协议的安全性证明。与原来的方案比较,该协议的计算和通信复杂度都较低,适用于计算和通信能力都有限的应用环境。
本文通过cuda实现计算向量a(n维)到矩阵b(n*n)的欧式距离,将结果输出到向量c(n维)中。本文主要采用cuda+c语言实现,代码经过调试。
此函数通过使用欧几里得距离变换来计算轮廓到轮廓的距离。 [MeanDist, StdevDist, MaxDist]= DistC2C( GTfilename, Inputfilename) == 输入参数 == GTfilename:ground-truth 的文件名输入文件名:待比较图像的...
欧几里德C语言算法
欧几里德算法 欧几里德算法 欧几里德算法 欧几里德算法欧几里德算法欧几里德算法欧几里德算法欧几里德算法欧几里德算法欧几里德算法欧几里德算法
适合初学者适合初学者 欧几里德算法 适合初学者适合初学者 欧几里德算法 适合初学者适合初学者 欧几里德算法
欧几里德算法和扩展欧几里德算法.doc
个人初学C++,小试身手,供参考,网上有很多,我的是原创,但不是最好的
欧几里德算法和扩展欧几里德算法--透彻理解 模P乘法逆元 对于整数a、p,如果存在整数b,满足a×b mod p =1,则说,b是a的模p乘法逆元。
实现扩展欧几里得算法的代码,很简单,能够成功运行。
欧几里德算法
使用PCL实现的欧几里德聚类ROS节点,配合地面过滤可实现较为理想的激光雷达障碍物检测,具体见博客链接:https://blog.csdn.net/AdamShan/article/details/83015570
在传统的基于欧几里德距离函数的轨迹相似性计算过程中,要求轨迹等长且时间点对应,无法度量不等长且有局部时间偏移的轨迹相似性。因此在构造同步轨迹集合过程中产生信息损失较大,影响轨迹数据的可用性。为此,通过...
欧几里德算法和扩展欧几里德算法,经典算法系列