几个简单的参数,实现计算特征向量的余弦相似度(java实现,纯手撸)

几个简单的参数,实现计算特征向量的余弦相似度(java实现,纯手撸)

太狂喽!突然高级起来🧠🧠🧠🧠🧠🧠🧠🧠🧠🧠

1.导入

什么事相似度?
例1:
苹果和桃子?
毛桃和油桃?
明显是毛桃和油桃相似度高。

例1:
小明、小红、小亮衣服喜好分布:(1为喜欢,0为排斥

人名红色黄色蓝色绿色紫色黑色白色
小明1111000
小红1000011
小亮1111010

那么我们是不是通过肉眼可分析出:
小明和小亮两人喜好相似度十分接近!因为他们喜好基本相同,只要一个不同。

😀那么我们怎么让就计算机知道他们之间的关联关系呢?

2.余弦相似度

实在不理解的同学可以看一下这个两个文章,参考一下。

链接: 余弦相似度讲解
链接: 算法实现

为什么?
其实呢~
我们只要在几何中描述出,小明的爱好的向量,小红的爱好的向量,小亮爱好的向量。
然后用小明的向量分别和小红、小亮的向量计算出余弦相似度然后哪个接近1就是更加相似。

🤒那么有聪明的小伙伴要问了,为什么是向量?为什么是余弦值?不是正弦值?

想让我们回忆一下,勾股定理!
勾股定理是什么?a²+b²=c²?是不是一秒就想到了。
在这里插入图片描述
那么a勾 作为一个向量 b作为一个向量,他们的余弦值是不是就是0了
额~回忆一下?
在这里插入图片描述
没错当x为π/2的时候也就是90°,这是的余弦值为0。
所以可以得出这两个向量的相似度非常低,当然-1的活就完全不同了,这是他的几何意义上的。

在这里插入图片描述
因为:

所以余弦值是对两个夹角大小的形容,所以靠近,夹角越小。

因为向量是通过多个特征值描述出来的一个多维度的东西。
x(红色) y(绿色) z(红色)q(黑色)p(白色)……

这样不管多少个特征值,我们都可以用向量描述出来。我们计算出夹角值就可以描述出两个向量的接近程度。

3.计算实现:

好了,终于可以计算两个向量的相似度了,拿我们上面的爱好的举例子。

例1:
小明、小红、小亮衣服喜好分布:(1为喜欢,0为排斥

人名红色黄色蓝色绿色紫色黑色白色
小明1111000
小红1000011
小亮1111010

怎么计算出小明和小红的相似度呢?
在这里插入图片描述
那么计算向量的点积
在这里插入图片描述
如此计算小明和小红的相似度。
在这里插入图片描述
同理计算小明和小亮的相似度。
那么我们用代码实现一下
大家有其他设计上好的建议,可以在评论区回复。🫰🫰🫰🫰🫰

在这里插入图片描述

这里可以看到,通过计算,我们算出
小明和小红对衣服颜色的喜好相似度是0.2777777778
小明和小亮对衣服颜色的喜好相似度是0.8000000000
是不是很厉害!不愧是我🤓🤓🤓🤓🤓🤓🤓🤓🤓🤓🤓

直接给兄弟们上代码,其实大家都会写,就是懒罢了。

@Test
    public void similarityBall(){
        //计算新的小球和存量小球的余弦值,排序,取出最靠近1的。(最大的)
        SimilarityParam param = new SimilarityParam();
        param.setParam1(new BigDecimal(1));
        param.setParam2(new BigDecimal(1));
        param.setParam3(new BigDecimal(1));
        param.setParam4(new BigDecimal(1));
        param.setParam5(new BigDecimal(0));
        param.setParam6(new BigDecimal(0));
        param.setParam7(new BigDecimal(0));
        List<BigDecimal> newParam = new ArrayList<>();
        newParam.add(param.getParam1() == null ? new BigDecimal(0) : param.getParam1());
        newParam.add(param.getParam2() == null ? new BigDecimal(0) : param.getParam2());
        newParam.add(param.getParam3() == null ? new BigDecimal(0) : param.getParam3());
        newParam.add(param.getParam4() == null ? new BigDecimal(0) : param.getParam4());
        newParam.add(param.getParam5() == null ? new BigDecimal(0) : param.getParam5());
        newParam.add(param.getParam6() == null ? new BigDecimal(0) : param.getParam6());
        newParam.add(param.getParam7() == null ? new BigDecimal(0) : param.getParam7());
        List<SimilarityParam> oldAsk = getNewAsk();
        for (SimilarityParam productAskSimilarityParam : oldAsk) {
            List<BigDecimal> oldParam = new ArrayList<>();
            oldParam.add(productAskSimilarityParam.getParam1() == null ? new BigDecimal(0) : productAskSimilarityParam.getParam1());
            oldParam.add(productAskSimilarityParam.getParam2() == null ? new BigDecimal(0) : productAskSimilarityParam.getParam2());
            oldParam.add(productAskSimilarityParam.getParam3() == null ? new BigDecimal(0) : productAskSimilarityParam.getParam3());
            oldParam.add(productAskSimilarityParam.getParam4() == null ? new BigDecimal(0) : productAskSimilarityParam.getParam4());
            oldParam.add(productAskSimilarityParam.getParam5() == null ? new BigDecimal(0) : productAskSimilarityParam.getParam5());
            oldParam.add(productAskSimilarityParam.getParam6() == null ? new BigDecimal(0) : productAskSimilarityParam.getParam6());
            oldParam.add(productAskSimilarityParam.getParam7() == null ? new BigDecimal(0) : productAskSimilarityParam.getParam7());

            //分子
            BigDecimal numerator = new BigDecimal(0);
            BigDecimal denominatorBF = new BigDecimal(0);
            BigDecimal denominatorAF = new BigDecimal(0);
            BigDecimal denominator = new BigDecimal(0);
            //分母前半部分
            for (int i = 0; i < newParam.size(); i++) {
                numerator = numerator.add(newParam.get(i).multiply(oldParam.get(i)));
                denominatorBF = denominatorBF.add(newParam.get(i).multiply(newParam.get(i)));
            }

            for (int i = 0; i < oldParam.size(); i++) {
                denominatorAF = denominatorAF.add(oldParam.get(i).multiply(oldParam.get(i)));
            }
            MathContext mc = new MathContext(2, RoundingMode.HALF_UP);
            denominator = sqrt(denominatorBF, mc).multiply(sqrt(denominatorAF, mc));
            productAskSimilarityParam.setSimilarity(numerator.divide(denominator,10, RoundingMode.HALF_UP));
        }
        System.out.println("123");
    }

实体类

package com.example.dfademo.pojos;

import lombok.Data;

import java.math.BigDecimal;

@Data
public class SimilarityParam {
    private BigDecimal param1;
    private BigDecimal param2;
    private BigDecimal param3;
    private BigDecimal param4;
    private BigDecimal param5;
    private BigDecimal param6;
    private BigDecimal param7;
    private BigDecimal similarity;
}

那么我们总结一下,
其实我们只要解决,如何定义特征向量,并且量化他就行了。
大家有其他设计上好的建议,可以在评论区回复。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/484767.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于图的在线社区假新闻检测建模

论文原文&#xff1a;Graph-based Modeling of Online Communities for Fake News Detection 论文代码&#xff1a;GitHub - shaanchandra/SAFER: Repository containing the official code for the paper Graph-based Modeling of Online Communities for Fake News Detectio…

这个国产原型设计工具,建议PM新人一定要用!

Hello小伙伴们&#xff01;我是榛妮&#xff0c;原BAT大厂女产品经理一枚&#xff0c;目前在香港创业。 一转眼&#xff0c;做产品经理已经8年&#xff0c;想想入行时的种种往事&#xff08;尴尬情况&#xff09;&#xff0c;至今仍然历历在目。 说起刚入行时遇到的那些问题&a…

判断链表是否为环形链表

目录 一、题目 二、代码 三、疑点代码解析 1.初始化 2.循环 3.if判断 4. 需要注意的是 一、题目 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为…

Python综合实战案例-数据清洗分析

写在前面&#xff1a; 本次是根据前文讲解的爬虫、数据清洗、分析进行的一个纵隔讲解案例&#xff0c;也是对自己这段时间python爬虫、数据分析方向的一个总结。 本例设计一个豆瓣读书数据⽂件&#xff0c;book.xlsx⽂件保存的是爬取豆瓣⽹站得到的图书数据&#xff0c;共 6067…

python—接口编写部分

最近准备整理一下之前学过的前端小程序知识笔记&#xff0c;形成合集。顺便准备学一学接口部分&#xff0c;希望自己能成为一个全栈嘿嘿。建议关注收藏&#xff0c;持续更新技术文档。 目录 前端知识技能树http请求浏览器缓存 后端知识技能树python_api&#xff1a;flaskflask…

WebClient 同步、异步调用实现对比

文章目录 一、概述二、pom依赖三、代码结构四、源码传送1、异步代码2、同步代码3、完整代码 一、概述 WebClient是Spring WebFlux模块提供的一个非阻塞的基于响应式编程的进行Http请求的客户端工具&#xff0c;从Spring5.0开始WebClient作为RestTemplete的替代品&#xff0c;有…

Programming Abstractions in C阅读笔记:p331-p337

《Programming Abstractions in C》学习第79天&#xff0c;p331-p337&#xff0c;总计7页。 一、技术总结 /** File: stack.h* -------------* This interface defines an abstraction for stacks. In any* single application that uses this interface, the values in* the…

银行5G短消息应用架构设计

&#xff08;一&#xff09;RCS简介 1.1 RCS的提出与标准制定 RCS(Rich Communication Services & Suite&#xff0c;富媒体通信)是GSMA(Groupe Speciale Mobile Association&#xff0c;全球移动通信系统协会)在2008年提出的一种通讯方式&#xff0c;RCS融合了语音、消息…

Django(一)- 环境搭建和快速入门

一、搭建环境 1、创建Python虚拟环境 (base) C:\Users\35351>conda create -n django_study python3.9 2、安装Django (django_study) C:\Users\35351>pip install Django >> 查看安装版本 (django_study) C:\Users\35351>python -m django --version 3、安…

计算机毕业设计无从下手?学长带你从零开始,三天搞定!

嘿&#xff0c;各位朋友们&#xff0c;我是小新&#xff01;&#x1f44b; 研究生的日子就像过山车一样&#xff0c;一转眼就快到终点站了。目前也是在面临着毕业论文的压力&#xff0c;好在前期付出的时间和努力比较多&#xff0c;现阶段只剩下一些小问题了&#xff0c;相对来…

n维数字图像欧氏距离变换算法

算法简介 该算法主要用于在三维图像中计算有效体素之间的最短欧几里得距离。 算法出处&#xff1a;NEW ALGORITHMS FOR EUCLIDEAN DISTANCE TRANSFORMATION OF AN n-DIMENSIONAL DIGITIZED PICTURE WITH APPLICATIONS 算法在体渲染加速中的应用&#xff1a;Accelerated Volum…

[Halcon学习笔记]在Qt上实现Halcon窗口的字体设置颜色设置等功能

1、 Halcon字体大小设置在Qt上的实现 在之前介绍过Halcon窗口显示文字字体的尺寸和样式&#xff0c;具体详细介绍可回看 &#xff08;一&#xff09;Halcon窗口界面上显示文字的字体尺寸、样式修改 当时介绍的设定方法 //Win下QString Font_win "-Arial-10-*-1-*-*-1-&q…

忘记密码找回流程请求拦截器-前端

目录 设置找回密码请求拦截器 1.相关参数 2.约定 代码实现 1. 实现思路 2. 实现代码 校园统一身份认证系统&#xff1a; 基于网络安全&#xff0c;找回密码、重新设置密码的流程和正常登录流程中密钥等请求头不一致。 设置找回密码请求拦截器 1.相关参数 clientId 应…

明日周刊-第3期

第3期&#xff0c;分享自己最近的感悟和实用工具。 文章目录 1. 一周热点2. 资源分享3. 言论4. 歌曲推荐 1. 一周热点 国内生产总值持续增长&#xff1a;统计局最新数据显示&#xff0c;2023年全年国内生产总值&#xff08;GDP&#xff09;超过126万亿元&#xff0c;比上年增长…

提升质量透明度,动力电池企业的数据驱动生产实践 | 数据要素 × 工业制造

系列导读 如《“数据要素”三年行动计划&#xff08;2024—2026年&#xff09;》指出&#xff0c;工业制造是“数据要素”的关键领域之一。如何发挥海量数据资源、丰富应用场景等多重优势&#xff0c;以数据流引领技术流、资金流、人才流、物资流&#xff0c;对于制造企业而言…

4 Spring IOC/DI配置管理第三方bean

文章目录 1&#xff0c;IOC/DI配置管理第三方bean1.1 案例:数据源对象管理1.1.1 环境准备1.1.2 思路分析1.1.3 实现Druid管理步骤1:导入druid的依赖步骤2:配置第三方bean步骤3:从IOC容器中获取对应的bean对象步骤4:运行程序 1.1.4 实现C3P0管理步骤1:导入C3P0的依赖步骤2:配置第…

DBO优化GRNN回归预测(matlab代码)

DBO-GRNN回归预测matlab代码 蜣螂优化算法(Dung Beetle Optimizer, DBO)是一种新型的群智能优化算法&#xff0c;在2022年底提出&#xff0c;主要是受蜣螂的的滚球、跳舞、觅食、偷窃和繁殖行为的启发。 数据为Excel股票预测数据。 数据集划分为训练集、验证集、测试集,比例…

博途建立S7-1200PLC与HMS AB7013Profinet通讯

1、新建一个博图项目1200PLC .CPU 1214C ACDC/RIY 6ES7 214-1BG31-0x80 2、安装GSD文件 Install general station description fle (GsD) GSDMLV2.3-HMS-ABC PROFINET GSD 3、连接PLC 4、在线访问 5、增加访问子网络 </

FPGA 以太网传输ov5640视频

1 实验任务 使用 DFZU4EV MPSoC 开发板及双目 OV5640 摄像头其中一个摄像头实现图像采集&#xff0c;并通过开发板上的以太网接口发送给上位机实时显示。 2 系统框架 时钟模块用于为 I2C 驱动模块、以太网顶层模块和开始传输控制模块提供驱动时钟&#xff1b;I2C 驱动模块…

用最小堆实现通用的高效定时器组件

用最小堆实现通用的高效定时器组件 文章目录 用最小堆实现通用的高效定时器组件开篇解决方案类图源码实现测试总结 开篇 在程序开发过程中&#xff0c;定时器会经常被使用到。而在Linux应用开发中&#xff0c;系统定时器资源有限&#xff0c;进程可创建的定时器数量会受到系统限…