标题相似度算法_推荐算法⼊门(1)相似度计算⽅法⼤全⼀.协同过滤算法简介
在推荐系统的众多⽅法之中,基于⽤户的协同过滤是诞最早的,原理也⽐较简单。基于协同过滤的推荐算法被⼴泛的运⽤在推荐系统中,⽐如影视推荐、猜你喜欢等、邮件过滤等。该算法1992年提出并⽤于邮件过滤系统,两年后1994年被 GroupLens ⽤于新闻过滤。⼀直到2000年,该算法都是推荐系统领域最著名的算法。
当⽤户A需要个性化推荐的时候,可以先到和他兴趣详细的⽤户集G,然后把G喜欢的并且A没有的物品推荐给A,这就是基于⽤户的协同过滤。
根据上述原理,我们可以将算法分为两个步骤:
1. 到与⽬标兴趣相似的⽤户集
2. 到这个集合中⽤户喜欢的、并且⽬标⽤户没有听说过的物品推荐给⽬标⽤户。
⼆、常⽤的相似度计算⽅法
下⾯,简单的举例⼏个机器学习中常⽤的样本相似性度量⽅法:欧式距离(Euclidean Distance)
余弦相似度(Cosine)
⽪尔逊相关系数(Pearson)
修正余弦相似度(Adjusted Cosine)
汉明距离(Hamming Distance)
曼哈顿距离(Manhattan Distance)
python新手代码大全pdf1、 欧式距离(Euclidean Distance)
欧式距离全称是欧⼏⾥距离,是最易于理解的⼀种距离计算⽅式,源⾃欧式空间中两点间的距离公式。平⾯空间内的
间的欧式距离:
2. 三维空间⾥的欧式距离:
3. Python 代码简单实现:
def EuclideanDistance(x,y):
d = 0
for a,b in zip(x,y):
d += (a-b)**2
return d**0.5
4. 使⽤ numpy 简化:
import numpy as np
def EuclideanDistance(dataA,dataB):
# ⽤于范数计算,默认是⼆范数,相当于平⽅和开根号
return 1.0/(1.0 + (dataA - dataB))
2、余弦相似度(Cosine)
⾸先,样本数据的夹⾓余弦并不是真正⼏何意义上的夹⾓余弦,只不过是借了它的名字,实际是借⽤了它的概念变成了是代数意义上的“夹
⾓余弦”,⽤来衡量样本向量间的差异。⼏何意义上的夹⾓余弦
夹⾓越⼩,余弦值越接近于1,反之则趋于-1。我们假设有x1与x2两个向量:
Python 代码的简单按公式还原:
def Cosine(x,y):
sum_xy = 0.0;
normX = 0.0;
normY = 0.0;
for a,b in zip(x,y):
sum_xy += a*b
normX += a**2
normY += b**2
if normX == 0.0 or normY == 0.0:
return None
else:
return sum_xy / ((normX*normY)**0.5)
2. 使⽤ numpy 简化夹⾓余弦
def Cosine(dataA,dataB):
sumData = dataA *dataB.T # 若列为向量则为 dataA.T * dataB
denom = (dataA) * (dataB)
# 归⼀化
return 0.5 + 0.5 * (sumData / denom)
我们引⼊⼀组特殊数据进⾏测试:
dataA = np.mat([1,2,3,3,2,1])
dataB = np.mat([2,3,4,4,3,2])
print(EuclideanDistance(dataA,dataB)) # 0.28
print(Cosine(dataA,dataB)) # 0.99
欧式距离和夹⾓余弦的区别:
对⽐以上的结果的 dataA 与 dataB 这两组数据,会发现 dataA 与 dataB 的欧式距离相似度⽐较⼩,⽽夹⾓余弦相似度⽐较⼤,即夹⾓余弦更能反映两者之间的变动趋势,两者有很⾼的变化趋势相似度,⽽欧式距离较⼤是因为两者数值有很⼤的区别,即两者拥有很⾼的数值差异。
3、⽪尔逊相关系数(Pearson Correlation Coefficient)如何理解⽪尔逊相关系数(Pearson Correlation Coefficient)?w ww.zhihu
假如之不先介绍夹⾓余弦的话,第⼀次接触你绝对会对⽪尔逊相关系数⼀脸懵逼。那么现在,让我们再来理解⼀下⽪尔逊相关系数的公式:* 这⾥减去的
每个item被打分的均值
⽪尔逊相关系数公式实际上就是在计算夹⾓余弦之前将两个向量减去各个样本的平均值,达到中⼼化的⽬的。从知友的回答可以明⽩,⽪尔逊相关函数是余弦相似度在维度缺失上⾯的⼀种改进⽅法。
1.Python 代码实现⽪尔逊相关系数:
def Pearson(x,y):
sum_XY = 0.0
sum_X = 0.0
sum_Y = 0.0
normX = 0.0
normY = 0.0
count = 0
for a,b in zip(x,y):
count += 1
sum_XY += a * b
sum_X += a
sum_Y += b
normX += a**2
normY += b**2
if count == 0:
return 0
# denominator part
denominator = (normX - sum_X**2 / count)**0.5 * (normY - sum_Y**2 / count)**0.5
if denominator == 0:
return 0
return (sum_XY - (sum_X * sum_Y) / count) / denominator
2. numpy 简化实现⽪尔逊相关系数
def Pearson(dataA,dataB):
# ⽪尔逊相关系数的取值范围(-1 ~ 1),0.5 + 0.5 * result 归⼀化(0 ~ 1)
return 0.5 + 0.5 * np.corrcoef(dataA,dataB,rowvar = 0)[0][1]
⽤余弦相似度相同的⽅法实现⽪尔逊:
# 余弦相似度、修正余弦相似度、⽪尔逊相关系数的关系
# Pearson 减去的是每个item i 的被打分的均值
def Pearson(dataA,dataB):
avgA = np.mean(dataA)
avgB = np.mean(dataB)
sumData = (dataA - avgA) * (dataB - avgB).T # 若列为向量则为 dataA.T * dataB
denom = (dataA - avgA) * (dataB - avgB)
# 归⼀化
return 0.5 + 0.5 * (sumData / denom)
4、修正余弦相似度
1. 为什么需要在余弦相似度的基础上使⽤修正余弦相似度X和Y两个⽤户对两个内容的评分分别为(1,2)和(4,5),使⽤余弦相似度得到的结果是0.98,两者极为相似。但从评分上看X似乎不喜欢2这个 内容,⽽Y则⽐较喜欢,余弦相似度对数值的不敏感导致了结果的误差,需要修正这种不合理性
# 修正余弦相似度
# 修正cosine 减去的是对item i打过分的每个user u,其打分的均值
data = np.mat([[1,2,3],[3,4,5]])
avg = np.mean(data[:,0]) # 下标0表⽰正在打分的⽤户
def AdjustedCosine(dataA,dataB,avg):
sumData = (dataA - avg) * (dataB - avg).T # 若列为向量则为 dataA.T * dataB
denom = (dataA - avg) * (dataB - avg)
return 0.5 + 0.5 * (sumData / denom)
print(AdjustedCosine(data[0,:],data[1,:],avg))
5、汉明距离(Hamming distance)
汉明距离表⽰的是两个字符串(相同长度)对应位不同的数量。⽐如有两个等长的字符串 str1 = "11111" 和 str2 = "10001" 那么它们之间的汉明距离就是3(这样说就简单多了吧。哈哈)。汉明距离多⽤于图像像素的匹配(同图搜索)。
1.Python 的矩阵汉明距离简单运⽤:
def hammingDistance(dataA,dataB):
distanceArr = dataA - dataB
return np.sum(distanceArr == 0)# 若列为向量则为 shape[0]
6.曼哈顿距离(Manhattan Distance)
没错,你也是会曼哈顿计量法的⼈了,现在开始你和秦风只差⼀张刘昊然的脸了。想象你在曼哈顿要从⼀个⼗字路⼝开车到另外⼀个⼗字路⼝,那么驾驶的最近距离并不是直线距离,因为你不可能横穿房屋。所以,曼哈顿距离表⽰的就是你的实际驾驶距离,即两个点在标准坐标
系上的绝对轴距总和。曼哈顿距离
# 曼哈顿距离(Manhattan Distance)
def Manhattan(dataA,dataB):
return np.sum(np.abs(dataA - dataB))
print(Manhattan(dataA,dataB))
⼆、了解数据结构
以下题⽬和数据均来⾃于千⾥码,⼀个优质的程序员答题⽹站,由于站长⾷年常年失踪,于是我就⽆
耻的分享出来啦。
现在从⾖瓣的⽤户中抽取了500左右个⽐较活跃的⽤户,这些⽤户都是忠实的电影迷,⼤部分⼈涉猎了上百部电影。
这⾥有个80多万⾏的⽂本⽂件,⽂件的每⾏是三个数字,分别是 userid,movieid,rating。代表⼀个⽤户对⼀部电影的评分。rating代表评分的星级,如上图中的红框所⽰,星级从低到⾼依次是1-5。
接下来有个⾏数为10001的⽂本⽂件(第⼀⾏为title),⽂件的每⾏为2个数字,分别代表userid和movieid,请你预测如果该⽤户观看了这部电影,会给该电影打多少分,你的预测值为1个⼤⼩为1-5的整数。
本题的答案是⼀个长度为1万的字符串,字符串的第k位代表你对第k⾏的预测结果。
如果你的预测结果和实际答案的差值的绝对值的和⼩于6000,通过该题。
简单来说就是:(80w 12M) --- userid, movieid, rate
<(1w 360KB) --- userid, movieid
你要为 中的⽤户预测当前电影的打分,你可以在以下地址提交你的答案。协同过滤w ww.qlcoder
持续更新的github仓库链接:NoisyWinds/Recommend g ithub
欢迎点赞,欢迎评论⼀起交流学习,感谢⽀持。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。