本文使用基于偏置项的svd,对评分矩阵进行矩阵分解,实现用户内容推荐的评分计算。如有错误的地方,希望大家指正。
package com.rec.SVDModel;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
public class SVDBasic {
//用户评分偏置
private double[] bu;
//物品评分偏置
private double[] bi;
//用户向量
private double[][] pu;
//物品向量
private double[][] qi;
//超参数
//循环迭代次数
private int iteration = 100;
//学习率
private double learningrate = 0.005;
//正则系数
private double coff = 0.02;
//维度,隐向量的维度,m*k,k*n的k
private int dimNum = 0;
//通过构造函数传入超参数
public SVDBasic(int iter,int dim,double lr,double cf){
iteration = iter;
learningrate = lr;
coff = cf;
dimNum = dim;
}
//对变量内存空间进行初始化
public void init(){
bu = new double[userNum];
pu = new double[userNum][dimNum];
for(int i = 0; i < userNum; i++){
pu[i] = new double[dimNum];
}
bi = new double[itemNum];
qi = new double[itemNum][dimNum];
for(int i = 0; i < itemNum; i++){
qi[i] = new double[dimNum];
}
//对pu和qi赋初值
for(int i = 0; i < userNum; i++){