余弦相似度计算
余弦相似度用向量空间中两个向量夹角的余弦值作为衡量两个个体间差异的大小。余弦值越接近1,就表明夹角越接近0度,也就是两个向量越相似,这就叫"余弦相似性"。
公式不作推导,直接列出最终公式
先定义一个数据体
data class TestBean(
val age : Int
)
计算一个list里的平均值函数:
fun averageRss(data : List<TestBean>):Double =
if(data.isEmpty()) {
0.0
} else {
var sum =0
data.forEach {
sum += it.age
}
(sum.toDouble()/data.size.toDouble())
}
最终的余弦相似度计算函数
入参为对比的两个list
/**
* 余弦相似度算法
*/
fun calculateCosineSimilarity(l1 : List<TestBean>, l2 : List<TestBean>) : Double {
//Xi
//Xi = 值和平均值的差
val avg1 = averageRss(l1)
var lengthSquared1 = 0.0
//Exi=差的平方之和
l1.forEach {
lengthSquared1 += ((it.age- avg1) * (it.age- avg1))
}
if(lengthSquared1 == 0.0) return 0.0
//Yi
//Yi = 值和平均值的差
val avg2 = averageRss(l2)
var lengthSquared2 = 0.0
//Eyi=差的平方之和
l2.forEach {
lengthSquared2 += ((it.age- avg2) * (it.age- avg2))
}
if(lengthSquared2 == 0.0) return 0.0
//分子上的值
var innerProduct = 0.0
l1.forEach {l1data ->
innerProduct += ((l1data.age- avg1)*(l2data.age- avg2))
}
return innerProduct/(Math.sqrt(lengthSquared1)*Math.sqrt(lengthSquared2))
}
前提是对比的两个list长度一致