JAVA实现余弦相似度算法
余弦相似度算法:
余弦相似性通过测量两个向量的夹角的余弦值来度量它们之间的相似性。0度角的余弦值是1,而其他任何角度的余弦值都不大于1;并且其最小值是-1。从而两个向量之间的角度的余弦值确定两个向量是否大致指向相同的方向。两个向量有相同的指向时,余弦相似度的值为1;两个向量夹角为90°时,余弦相似度的值为0;两个向量指向完全相反的方向时,余弦相似度的值为-1。这结果是与向量的长度无关的,仅仅与向量的指向方向相关。余弦相似度通常用于正空间,因此给出的值为-1到1之间。
坐标系表示:
具体公式:
具体实现(Java):
import java.util.ArrayList;public class SimilarityUtil {public static double similarity(ArrayList va, ArrayList vb) {if (va.size() > vb.size()) {int temp = va.size() - vb.size();for (int i = 0; i < temp; i++) {vb.add(0);}} else if (va.size() < vb.size()) {int temp = vb.size() - va.size();for (int i = 0; i < temp; i++) {va.add(0);}}int size = va.size();double simVal = 0;double num = 0;double den = 1;double powa_sum = 0;double powb_sum = 0;for (int i = 0; i < size; i++) {double a = Double.parseDouble(va.get(i).toString());double b = Double.parseDouble(vb.get(i).toString());num = num + a * b;powa_sum = powa_sum + (double) Math.pow(a, 2);powb_sum = powb_sum + (double) Math.pow(b, 2);}double sqrta = (double) Math.sqrt(powa_sum);double sqrtb = (double) Math.sqrt(powb_sum);den = sqrta * sqrtb;simVal = num / den;return simVal;}
}
案例分析:
姓名/兴趣 |
吃苹果 |
逛商店 |
看电视剧 |
打羽毛球 |
吃桔子 |
小红 |
3.5 |
5 |
5 |
5 |
0 |
xxx |
3.5 |
5 |
5 |
0 |
0 |
分别以小红和xxx的兴趣评分组成向量va和vb,运用多维余弦相似公式,设向量 A =
(A1,A2,...,An),B = (B1,B2,...,Bn) :
计算得相似度为:0.9954774432988771
具体实现代码:
import java.util.ArrayList;public class SimilarityMain {public static double similarity(ArrayList va, ArrayList vb) {if (va.size() > vb.size()) {int temp = va.size() - vb.size();for (int i = 0; i < temp; i++) {vb.add(0);}} else if (va.size() < vb.size()) {int temp = vb.size() - va.size();for (int i = 0; i < temp; i++) {va.add(0);}}int size = va.size();double simVal = 0;double num = 0;double den = 1;double powa_sum = 0;double powb_sum = 0;for (int i = 0; i < size; i++) {double a = Double.parseDouble(va.get(i).toString());double b = Double.parseDouble(vb.get(i).toString());num = num + a * b;powa_sum = powa_sum + (double) Math.pow(a, 2);powb_sum = powb_sum + (double) Math.pow(b, 2);}double sqrta = (double) Math.sqrt(powa_sum);double sqrtb = (double) Math.sqrt(powb_sum);den = sqrta * sqrtb;simVal = num / den;return simVal;}public static void main(String[] args) {String item[] = {"吃苹果", "逛商店", "看电视剧", "打羽毛球", "吃桔子"};float a[] = {(float) 4.5, 5, 5, 5,0};float b[] = {(float) 3.5, 5, 5, 5,0};ArrayList vitem = new ArrayList();ArrayList<Float> va = new ArrayList();ArrayList<Float> vb = new ArrayList();for (int i = 0; i < a.length; i++){vitem.add(item[i]);va.add(new Float(a[i]));vb.add(new Float(b[i]));}System.out.print("兴趣");System.out.println(vitem);System.out.print("小红");System.out.println(va);System.out.print("xxx");System.out.println(vb);SimilarityMain sim = new SimilarityMain();double simVal = sim.similarity(va, vb);System.out.println("The sim value is:" + simVal);}}
源码gitee地址:
https://gitee.com/jockhome/
JAVA实现余弦相似度算法相关推荐
- 基于协同过滤推荐+余弦相似度算法实现新闻推荐系统
针对海量的新闻资讯数据,如何快速的根据用户的检索需要,完成符合用户阅读需求的新闻资讯推荐?本篇文章主要采用余弦相似度及基于用户协同过滤算法实现新闻推荐,通过余弦相似度算法完成针对不同新闻数据之间的相似 ...
- 基于大数据分析架构设计采用基于协同过滤推荐+余弦相似度算法+springboot+vue.js 实现新闻推荐系统
针对海量的新闻资讯数据,如何快速的根据用户的检索需要,完成符合用户阅读需求的新闻资讯推荐?本篇文章主要采用余弦相似度及基于用户协同过滤算法实现新闻推荐,通过余弦相似度算法完成针对不同新闻数据之间的相似 ...
- 文本相似度计算——HanLP分词+余弦相似度算法
一.余弦相似度简介 余弦相似度(又称为余弦相似性):是通过测量两个向量的夹角的余弦值来度量它们之间的相似性.余弦值接近1,夹角趋于0,表明两个向量越相似:余弦值接近于0,夹角趋于90度,表明两个向量越 ...
- 使用余弦相似度算法计算文本相似度-数学
20211201 也就是效果 皮尔逊>余弦>欧式 余弦相似度的局限 皮尔逊的优势,相当于是改进版余弦相似度 欧式与 余弦 欧式侧重于直线距离 归一化之后的欧式和余弦的效果也不同 比如 0, ...
- php数据分析引擎,PHP数据分析引擎计算余弦相似度算法示例
php 的 PHP数据分析引擎计算余弦相似度算法示例 本文实例讲述了PHP数据分析引擎计算余弦相似度算法.分享给大家供大家参考,具体如下: 关于余弦相似度的相关介绍可参考百度百科: /** * 数据分 ...
- ML之Cosin:基于输入图片RGB均值化转为单向vector利用Cosin(余弦相似度)算法进行判别
ML之Cosin:基于输入图片RGB均值化转为单向vector利用Cosin(余弦相似度)算法进行判别 目录 输出结果 代码实现 相关文章 ML之相似度计算:图像数据.字符串数据等计算相似度常用的十种 ...
- 使用余弦相似度算法计算文本相似度
在求相似度的时候经常会有以下一些方法, 1.基于词向量 余弦相似度 曼哈顿距离 欧几里得距离 明式距离(是前两种距离测度的推广),在极限情况下的距离是切比雪夫距离 2.基于字符的 编辑距离 simha ...
- simhash算法和余弦相似度算法哪种更适合微博文本的相似度计算
对于微博文本的相似度计算,simhash算法可能更适合. 余弦相似度算法是一种常见的文本相似度计算方法,它可以计算两个文本向量之间的夹角余弦值,用于衡量它们的相似度.但是,当面对大量文本时,计算文本向 ...
- 相似度算法 php,PHP计算余弦相似度算法
这篇文章主要介绍了PHP数据分析引擎计算余弦相似度算法,结合具体实例形式分析了php计算余弦相似度的操作步骤与相关实现技巧,需要的朋友可以参考下 本文实例讲述了PHP数据分析引擎计算余弦相似度算法.分 ...
最新文章
- listview winfrom 表头_winform ListView点击行表头,排序
- mysql数据库修改编码
- php curl ajax get请求,PHP的curl的get,post请求-Fun言
- Linux安装setuptools
- 蚂蚁集团上市 员工身价暴涨人均一套房?支付宝:没有 但会努力的
- css position理解
- docker 部分常用镜像下载及安装
- 评价——秩和比综合评价
- java封装 继承 多态 的概念和作用
- Flash背景透明(透明背景)设置方法
- H3C WA4320H-ACN 无线AP硬改支持集客256M内存启动
- java课程设计 博客园_201521123098 JAVA课程设计
- from scipy.misc import comb ImportError: cannot import name comb
- 一杯凉茶 mysql_那一杯凉茶
- 微信小程序系列(7)如何用微信小程序写一个论坛?贴心代码详解(五)删帖页【完结篇】
- Python四行代码实现的猜数字小游戏,基于thinker,带GUI界面
- C# 对JS解析AJX请求JSON并绑定到html页面的一些心得
- ArcGIS10.2打开ArcToolbox闪退解决方法
- Ubuntu18 安装98五笔
- 手机网站支付宝接入iframe无法唤醒支付宝app
热门文章
- 【CIPS 2016】(13-14章)自动问答、机器翻译 (研究进展、现状趋势)
- Markdown语法中输入数学公式(MathJax)及特殊符号
- Niagara内容示例 4.1 Play Audio Per Paticle
- 织梦开启错误提示方法
- word分页码简化设置
- 图像类型的转换(matlab)
- 华为android贡献度,Android8.0系统占比大幅提升,华为、荣耀、小米成为主要贡献...
- VCEG-AE07计算BD-BR和BD-PSNR
- Linux shell脚本IO重定向
- datatables动态表头ajax,jQuery Datatables - 来自AJAX响应的表头