上一篇我们已经将内容属性提取出来,本篇将考虑过滤,即通过余弦相似度的计算将所有的音频作品分为可推荐和不可推荐两类。
这里我们 先自定义了一个8维向量类,用来计算向量的模、向量的点积、向量夹角的余弦:
public class Vector8D { public Vector8D(double a, double b, double c, double d, double e, double f, double g, double h) { this.a = a; this.b = b; this.c = c; this.d = d; this.e = e; this.f = f; this.g = g; this.h = h; } private final double a; private final double b; private final double c; private final double d; private final double e; private final double f; private final double g; private final double h; public double getA() { return a; } public double getB() { return b; } public double getC() { return c; } public double getD() { return d; } public double getE() { return e; } public double getF() { return f; } public double getG() { return g; } public double getH() { return h; } public double getNorm() { return FastMath.sqrt(a * a + b * b + c * c + d * d + e * e + f * f + g * g + h * h); } public static double dotProduct(Vector8D v1, Vector8D v2) { return v1.getA() * v2.getA() + v1.getB() * v2.getB() + v1.getC() * v1.getC() + v1.getD() * v2.getD() + v1.getE() * v2.getE() + v1.getF() * v2.getF() + v1.getG() * v2.getG() + v1.getH() * v2.getH(); } public static double angle(Vector8D v1, Vector8D v2) { return dotProduct(v1, v2) / (v1.getNorm() * v2.getNorm()); } }
无偏好时,假定一个产品
初始情况下用户无偏好,我们定义余弦值大于0即可推荐。