[推荐算法]基于JACCARD推荐(0,1推荐)
2015-10-12 14:51
246 查看
基于JACCARD推荐(0,1推荐)
1、什么是jaccard?
杰卡德相似系数(Jaccard similarity coefficient),也称杰卡德指数(Jaccard Index),是用来衡量两个集合相似度的一种指标。Jaccard相似指数用来度量两个集合之间的相似性,它被定义为两个集合交集的元素个数除以并集的元素个数。
在我们项目中对于新闻的推荐,每个用户对新闻的浏览可以看做是一个集合。这样就可以使用jaccard算法实现用户之间的相似度计算;
公式如下:
给定两个n维二元向量A、B,A、B的每一维都只能是0或者1,利用Jaccard相似系数来计算二者的相似性:
1)
代表向量A与向量B都是0的维度个数;
2)
代表向量A是0而向量B是1的维度个数;
3)
代表向量A是1而向量B是0的维度个数;
4 )
代表向量A和向量B都是1的维度个数。
n维向量的每一维都会落入这4类中的某一类,因此:
(目前我们的推荐只涉及到二维)
则Jaccard相似系数为:
在二维里面其实就是
AB的一个交集数量/整体元素数量;
2、jaccard举例?
比如我们的用户对新闻的一个浏览数据如下:
ABCD 代表的四个用户 ;1,2,3,4 代表的是四个新闻;1代表看过该新闻,0代表没有看过该新闻;下面简单计算一下相似度:
用户A 和 用户B 的相似度计算: M11 就是1 M01+M10+M11 = 4 所以J(A,B) = 1/4 = 25%
用户A 和 用户C 的相似度计算: M11 就是3 M01+M10+M11 = 4 所以J(A,B) = 3/4 = 75%
用户A 和 用户D 的相似度计算: M11 就是2 M01+M10+M11 = 4 所以J(A,B) = 2/4 = 50%
由此可见A跟用户的相似度排名从高到低就是 C D B ;
时间复杂度分析
1. 假设数据已经存在 A
[m] 二维数组 n代表用户 m代表商品 nm的值就是某个用户是否看过某个商品 值用0,1 标示。0没看过,1看过。
2.使用jaccard算法比较每个用户 循环 A
[m] ,依次比较从0到n的用户 ; 形成数组B[n1][n2] 存放的数据代表每个用户n1和用户n2的相似度;
for (int i = 0; i < [b]USERCOUNT; i++) {[/b]
for (int j = 0; j < USERCOUNT; j++) {
if (i == j) {//自己跟自己的相似度 1
similarityMatrix[i][j] = 1;
}else {
similarityMatrix[i][j] = computeSimilarity(preference[i], preference[j]);
}
}
时间复杂度为O2
3.进行评分预测
A 遍历用户 for
B1相似度排序(array)
for (int j = 0; j < temp.length; j++) {
temp[j] = similarity[j];
}
B2获取近邻
for (int m = temp.length - 1; m >= temp.length - [b]KNEIGHBOUR; m--) {[/b]
for(int j = 0; j < similarity.length; j++) {
if (similarity[j] == temp[m] && similarity[j] != 0.0 && j!=i)
neighborSerial.add(new Integer(j));/*添加一个整型数据对象 用户id-1*/
}
}
B3遍历商品
C1遍历近邻 获取评分
时间复杂度为 O2+ O3+O3 = O2 + 2O3 最终近似为O3
1、什么是jaccard?
杰卡德相似系数(Jaccard similarity coefficient),也称杰卡德指数(Jaccard Index),是用来衡量两个集合相似度的一种指标。Jaccard相似指数用来度量两个集合之间的相似性,它被定义为两个集合交集的元素个数除以并集的元素个数。
在我们项目中对于新闻的推荐,每个用户对新闻的浏览可以看做是一个集合。这样就可以使用jaccard算法实现用户之间的相似度计算;
公式如下:
给定两个n维二元向量A、B,A、B的每一维都只能是0或者1,利用Jaccard相似系数来计算二者的相似性:
1)
代表向量A与向量B都是0的维度个数;
2)
代表向量A是0而向量B是1的维度个数;
3)
代表向量A是1而向量B是0的维度个数;
4 )
代表向量A和向量B都是1的维度个数。
n维向量的每一维都会落入这4类中的某一类,因此:
(目前我们的推荐只涉及到二维)
则Jaccard相似系数为:
在二维里面其实就是
AB的一个交集数量/整体元素数量;
2、jaccard举例?
比如我们的用户对新闻的一个浏览数据如下:
ABCD 代表的四个用户 ;1,2,3,4 代表的是四个新闻;1代表看过该新闻,0代表没有看过该新闻;下面简单计算一下相似度:
用户A 和 用户B 的相似度计算: M11 就是1 M01+M10+M11 = 4 所以J(A,B) = 1/4 = 25%
用户A 和 用户C 的相似度计算: M11 就是3 M01+M10+M11 = 4 所以J(A,B) = 3/4 = 75%
用户A 和 用户D 的相似度计算: M11 就是2 M01+M10+M11 = 4 所以J(A,B) = 2/4 = 50%
由此可见A跟用户的相似度排名从高到低就是 C D B ;
时间复杂度分析
1. 假设数据已经存在 A
[m] 二维数组 n代表用户 m代表商品 nm的值就是某个用户是否看过某个商品 值用0,1 标示。0没看过,1看过。
2.使用jaccard算法比较每个用户 循环 A
[m] ,依次比较从0到n的用户 ; 形成数组B[n1][n2] 存放的数据代表每个用户n1和用户n2的相似度;
for (int i = 0; i < [b]USERCOUNT; i++) {[/b]
for (int j = 0; j < USERCOUNT; j++) {
if (i == j) {//自己跟自己的相似度 1
similarityMatrix[i][j] = 1;
}else {
similarityMatrix[i][j] = computeSimilarity(preference[i], preference[j]);
}
}
时间复杂度为O2
3.进行评分预测
A 遍历用户 for
B1相似度排序(array)
for (int j = 0; j < temp.length; j++) {
temp[j] = similarity[j];
}
B2获取近邻
for (int m = temp.length - 1; m >= temp.length - [b]KNEIGHBOUR; m--) {[/b]
for(int j = 0; j < similarity.length; j++) {
if (similarity[j] == temp[m] && similarity[j] != 0.0 && j!=i)
neighborSerial.add(new Integer(j));/*添加一个整型数据对象 用户id-1*/
}
}
B3遍历商品
C1遍历近邻 获取评分
时间复杂度为 O2+ O3+O3 = O2 + 2O3 最终近似为O3
相关文章推荐
- 苦读心理骗女友:丑男苦读心理学骗十几个女友 最惨的被骗50万
- WEB-INFO目录的作用
- asp.net repeater控件操作
- SIP输入面板
- Android应用接第三方Android聚合支付
- js正则表达式验证
- Android控件动态用法实例分析
- 重学statistics,Cha3 Descriptive Statistics: numerical measures
- 视频文件的容器格式和编码格式
- PHP JSON_ENCODE 不转义中文汉字的方法
- Common Lisp
- c#之结构体
- Thrift在 Java中的简单实例(-)
- 框架培训-第二日
- MFC搭建OpenGL框架示例
- 基于RXNetty client给server 发消息 获取回调方法
- 不做只会切图的切图仔
- 提高面试代码质量的三要素
- 我的MYSQL学习心得 mysql的权限管理
- poj_3352 连通图的桥