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

news2024/11/18 21:50:20

几个简单的参数,实现计算特征向量的余弦相似度(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;
}

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【大模型】在VS Code(Visual Studio Code)上安装中文汉化版插件

文章目录 一、下载安装二、配置显示语言&#xff08;一&#xff09;调出即将输入命令的搜索模式&#xff08;二&#xff09;在大于号后面输入&#xff1a;Configure Display Language&#xff08;三&#xff09;重启 三、总结 【运行系统】win 11 【本文解决的问题】 1、英文不…

Linux 文件探秘:检查文件大小的四种神器

Linux 文件探秘&#xff1a;检查文件大小的四种神器 Linux 文件探秘&#xff1a;检查文件大小的四种神器摘要引言正文内容&#x1f6e0;️ 方法一&#xff1a;使用ls命令详细步骤示例 &#x1f6e0;️ 方法二&#xff1a;使用du命令详细步骤示例 &#x1f6e0;️ 方法三&#…

C语言笔记:指针与数组

ACM金牌带你零基础直达C语言精通-课程资料 本笔记属于船说系列课程之一&#xff0c;课程链接&#xff1a;ACM金牌带你零基础直达C语言精通https://www.bilibili.com/cheese/play/ep159068?csourceprivate_space_class_null&spm_id_from333.999.0.0 你也可以选择购买『船说…

通过dbeaver链接dm8数据库

一、环境说明 windows 11 vmware 17 ubuntu 22 tt:~$ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 22.04.3 LTS Release: 22.04 Codename: jammytt:~$ docker info Client:Version: 24.0.5Context: d…

【进程概念】环境变量PATH(结合代码,超极容易理解)

文章目录 什么叫环境变量常见环境变量查看环境变量测试PATH修改PATH HOME和环境变量相关的命令环境变量是如何被组织的解释main函数里的参数如何在程序中获得环境变量1.命令行第三个参数2.通过第三方变量environ获取 通过系统调用putenv和getenv获取或设置环境变量环境变量通常…

带3090显卡的Linux服务器上部署SDWebui

背景 一直在研究文生图&#xff0c;之前一直是用原始模型和diffuser跑SD模型&#xff0c;近来看到不少比较博主在用 SDWebui&#xff0c;于是想着在Linux服务器上部署体验一下&#xff0c;谁知道并没有想象的那么顺利&#xff0c;还是踩了不少坑。记录一下过程&#xff0c;也许…

画架构图实践技巧

画架构图是架构师的一门必修功课。 对于架构图是什么这个问题&#xff0c;我们可以按以下等式进行概括&#xff1a; 架构图 架构的表达 架构在不同抽象角度和不同抽象层次的表达&#xff0c;这是一个自然而然的过程。 不是先有图再有业务流程、系统设计和领域模型等&#…

ForkJoinPool在生产环境中使用遇到的一个问题

1、背景 在我们的项目中有这么一个场景&#xff0c;需要消费kafka中的消息&#xff0c;并生成对应的工单数据。早些时候程序运行的好好的&#xff0c;但是有一天&#xff0c;我们升级了容器的配置&#xff0c;结果导致部分消息无法消费。而消费者的代码是使用CompletableFutur…

P8623 [蓝桥杯 2015 省 B] 移动距离 Python

[蓝桥杯 2015 省 B] 移动距离 题目描述 X 星球居民小区的楼房全是一样的&#xff0c;并且按矩阵样式排列。其楼房的编号为 $1,2,3, \cdots $ 。 当排满一行时&#xff0c;从下一行相邻的楼往反方向排号。 比如&#xff1a;当小区排号宽度为 6 6 6 时&#xff0c;开始情形如…

echarts 折线图 数据点过密,显示重叠该如何解决

echarts 折线图 数据点过密&#xff0c;显示重叠该如何解决 有这样一个图表&#xff0c;显示的数据比较多&#xff0c; 当把 label 显示出来的时候&#xff0c;这些 label 重叠了&#xff0c;我想让它间隔一下。 结果是这样的&#xff1a; 只需要在 label.formatter 上处理 …

Go 限流器-漏桶 VS 令牌桶 常用包原理解析

本文主要介绍两个包Uber漏桶&#xff0c;time/rate令牌桶 可以了解到&#xff1a; 使用方法漏桶/令牌桶 两种限流思想 and 实现原理区别及适用场景应用Case 背景 我们为了保护系统资源&#xff0c;防止过载&#xff0c;常常会使用限流器。 使用场景&#xff1a; API速率限制…

clickhouse突然启动不起来问题排查

场景&#xff1a; 在实现postgreql数据迁移到clickhouse中&#xff0c;想使用MaterializedPostgreSQL的功能实现&#xff0c;但是中途clickhouse突然挂了&#xff0c;就再启动不了了。 现象&#xff1a; systemctl start clcikhouse-server启动报错 [rootlocalhost clickhous…

spring注解驱动系列--AOP探究二

上篇中记录了AnnotationAwareAspectJAutoProxyCreator的创建以及注册&#xff0c;主要是 1、EnableAspectJAutoProxy 注解会开启AOP功能 2、然后这个注解会往容器中注册一个AnnotationAwareAspectJAutoProxyCreator组件。 3、之后在容器创建过程中&#xff0c;注册后置处理器&a…

反序列化漏洞简单知识

目录&#xff1a; 一、概念&#xff1a; 二、反序列化漏洞原因 三、序列化漏洞的魔术方法&#xff1a; 四、反序列化漏洞防御&#xff1a; 一、概念&#xff1a; 序列化&#xff1a; Web服务器将HttpSession对象保存到文件系统或数据库中&#xff0c;需要采用序列化的…

基于java+springboot+vue实现的研究生志愿填报辅助系统(文末源码+Lw+ppt)23-600

摘 要 二十一世纪我们的社会进入了信息时代&#xff0c;信息管理系统的建立&#xff0c;大大提高了人们信息化水平。传统的管理方式对时间、地点的限制太多&#xff0c;而在线管理系统刚好能满足这些需求&#xff0c;在线管理系统突破了传统管理方式的局限性。于是本文针对这…

java 实现发送邮件功能

今天分享一篇 java 发送 QQ 邮件的功能 环境&#xff1a; jdk 1.8 springboot 2.6.3 maven 3.9.6 邮件功能依赖&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId>&…

深度学习pytorch——多层感知机反向传播(持续更新)

在讲解多层感知机反向传播之前&#xff0c;先来回顾一下多输出感知机的问题&#xff0c;下图是一个多输出感知机模型&#xff1a; 课时44 反向传播算法-1_哔哩哔哩_bilibili 根据上一次的分析深度学习pytorch——感知机&#xff08;Perceptron&#xff09;&#xff08;持续更新…

pytorch 实现多层神经网络MLP(Pytorch 05)

一 多层感知机 最简单的深度网络称为多层感知机。多层感知机由 多层神经元 组成&#xff0c;每一层与它的上一层相连&#xff0c;从中接收输入&#xff1b;同时每一层也与它的下一层相连&#xff0c;影响当前层的神经元。 softmax 实现了 如何处理数据&#xff0c;如何将 输出…

【Godot4.2】基础知识 - Godot中的2D向量

概述 在Godot中&#xff0c;乃至一切游戏编程中&#xff0c;你应该都躲不开向量。这是每一个初学者都应该知道和掌握的内容&#xff0c;否则你将很难理解和实现某些其实原理非常简单的东西。 估计很多刚入坑Godot的小伙伴和我一样&#xff0c;不一定是计算机专业或编程相关专…

WSL使用

WSL使用 WSL安装和使用 Termianl和Ubuntu的安装 打开Hype-V虚拟化配置Microsoft Store中搜索Window Terminal并安装Microsoft Store中搜索Ubuntu, 选择安装Ubuntu 22.04.3 LTS版本打开Window Terminal选择Ubuntu标签栏, 进入命令行 中文输入法安装 查看是否安装了fcitx框架…