思想
- 先根据所有用户的历史行为,计算物品相似性。
- 把某用户喜欢物品相似的类型推给该用户。
例子
- 想知道alice对物品5是否喜欢,想找到物品1、2、3、4和物品5最相关的,然后根据alice的打分情况对物品5进行打分。
- 根据皮卡尔相关系数计算。
public static void main(String[] args) {
// 物品1(3,4,3,1),物品5(3,5,4,1)
// 计算皮尔逊相关系数
double[] nums1 = {3,4,3,1};
double[] nums2 = {3,5,4,1};
double avg1 = (nums1[0] + nums1[1] + nums1[2] + nums1[3])/4;
double avg2 = (nums2[0] + nums2[1] + nums2[2] + nums2[3])/4;
for(int i = 0; i < nums1.length; i++){
nums1[i] = nums1[i] - avg1;
nums2[i] = nums2[i] - avg2;
System.out.println(nums1[i]+" " + nums2[i]);
}
double fenzi = 0;
double fenmu1 = 0;
double fenmu2 = 0;
for(int i = 0; i < nums1.length; i++){
fenzi += nums1[i] * nums2[i];
fenmu1 += nums1[i] * nums1[i];
fenmu2 += nums2[i] * nums2[i];
}
double fenmu = Math.sqrt(fenmu1) * Math.sqrt(fenmu2);
System.out.println(fenzi);
System.out.println(fenmu);
double result = fenzi / fenmu;
System.out.println(result);
}
物品1和物品5相关系数约为0.97(0.9694584179118515)
- 最终得分
13/4 :物品5平均分
0.97 0.58 :相关系数
3.2 : 物品1的平均分
算法权重改进方法
-
基本公式:
-
对热门物品进行惩罚
-
控制热门物品惩罚力度
-
对活跃用户进行惩罚
问题
协同过滤算法存在的问题之一就是泛化能力弱:
- 即协同过滤无法将两个物品相似的信息推广到其他物品的相似性上。
- 导致的问题是热门物品具有很强的头部效应, 容易跟大量物品产生相似, 而尾部物品由于特征向量稀疏, 导致很少被推荐。