线性代数于工程应用中的实践:以代码实例拆解相似性度量问题的求解逻辑

news/2025/2/8 20:12:26/

 相似性度量


 目录

 相似性度量

1.欧氏距离

2.余弦相似度

3.两者区别

4.应用实例

(1)评估用户消费能力(欧式距离)

(2)人群聚类(余弦相似度)


1.欧氏距离

       欧氏距离是一种常用的距离度量方法,适用于衡量多维空间中各个点之间的绝对距离。它通过计算两点之间的直线距离来衡量它们的距离。在多维空间中,欧氏距离可以通过对每个坐标维度上的差值进行平方求和后再开方得到。这种方法可以有效地衡量多维空间中点之间的距离,并可用于各种应用场景中:

图一

        同理推导:

图二

2.余弦相似度

        向量夹角越大,即方向差异越大,余弦值cosθ就会越小,即相似度越小;向量夹角越小,即方向差异越小,余弦值cosθ就会越大,即相似度越大:

图三

3.两者区别

        欧式距离和余弦相似度使用的场景不同:

        (1)欧氏距离是一种常用的距离度量方法,特别适用于衡量多维空间中各个点之间的绝对差异。它通过计算两点之间的直线距离来衡量它们的距离。在数值特征的分析中,欧氏距离可以用来比较个体之间的差异,尤其适用于需要从维度的数值大小中体现差异的情况。

例如,在用户行为指标分析中,欧氏距离可以用来衡量不同用户之间在各个行为指标上的差异,从而判断他们的用户价值差异。通过计算用户在各个行为指标上的数值差异,可以使用欧氏距离来度量不同用户之间的相似性或差异性。这可以帮助我们进行用户细分、推荐系统、个性化定制等方面的工作。

        (2)余弦相似度主要用于比较向量之间的方向差异,而对于绝对数值并不敏感。它通常被用来分析用户对不同内容的评分,从而理解他们的兴趣差异。此外,余弦相似度还可以解决用户之间度量标准不一致的问题,从而提高分析结果的准确性。       

4.应用实例

(1)评估用户消费能力(欧式距离)

**示例**

某月用户消费数据:

张三

李四

王五

消费次数

2

20

3

总消费额

10

100

15

将这些数据工程化为向量:

      ①张三、李四之间的余弦相似度:sim=cosθ=1

         张三、王五之间的余弦相似度:sim=cosθ=1

         李四、王五之间的余弦相似度:sim=cosθ=1

         由于余弦相似度无法评估用户的消费能力,我们在使用余弦相似度进行分析时需要注意其局限性。余弦相似度主要用于比较向量之间的方向差异,而无法准确地衡量绝对的数值差异。

      ②张三、李四之间的欧式距离:dist=91.8

         张三、王五之间的欧式距离:dist=5.1

         李四、王五之间的欧式距离:dist=86.7

         通过欧式距离的测量,可以得出在数值特征上张三与王五之间的差距最小,而与李四之间的差距较大。这可以暗示李四在数值特征上具有较高的消费能力。

**代码及运行结果**

python">import numpy as np
import matplotlib.pyplot as plt#欧式距离
def calculate_EuclideanDistance(vec1,vec2):return np.sqrt(np.sum(np.square(vec1-vec2)))#余弦相似度
def calculate_CosinSim(vec1,vec2):return (np.dot(vec1,vec2))/(np.linalg.norm(vec1)*np.linalg.norm(vec2))#创建三个一维向量
a_1=np.array([2,10])    #[ 2 10]
b_1=np.array([20,100])  #[ 20 100]
c_1=np.array([3,15])    #[ 3 15]#求取欧式距离
print("distance ab:",calculate_EuclideanDistance(a_1,b_1))
print("distance ac:",calculate_EuclideanDistance(a_1,c_1))
print("distance bc:",calculate_EuclideanDistance(b_1,c_1))
# distance ab: 91.78235124467012
# distance ac: 5.0990195135927845
# distance bc: 86.68333173107735print("sim ab:",calculate_CosinSim(a_1,b_1))
print("sim ac:",calculate_CosinSim(a_1,c_1))
print("sim bc:",calculate_CosinSim(b_1,c_1))
# sim ab: 1.0
# sim ac: 1.0
# sim bc: 1.0#绘制三个向量的图相
plt.xlim(0,30)
plt.ylim(0,110)
plt.grid(color='#A9A9A9')
plt.plot(a_1[0],a_1[1],'ro')
plt.plot(b_1[0],b_1[1],'go')
plt.plot(c_1[0],c_1[1],'bo')
plt.show()
图四

(2)人群聚类(余弦相似度)

**示例**

某月用户对某手机商品的评分数据:

张三

李四

王五

华为手机

1.0

5.0

5.0

苹果手机

1.0

5.0

0

 将这些数据工程化为向量:

      ①张三、李四之间的欧式距离:dist=5.7

         张三、王五之间的欧式距离:dist=4.1

         李四、王五之间的欧式距离:dist=5.0

         由于三者之间的欧氏距离差异不明显,使用欧式距离无法有效对人群进行聚类。

      ②张三、李四之间的余弦相似度:sim=cosθ=1

         张三、王五之间的余弦相似度:sim=cosθ=0.71

         李四、王五之间的余弦相似度:sim=cosθ=0.71

         因为张三和李四之间的余弦相似度达到最大值,可以得出他们两人的兴趣相似度较高。然而,根据王五与张三、李四之间的余弦相似度较低,可以推断他们之间的兴趣相似度较低。

**代码及运行结果**

python">import numpy as np
import matplotlib.pyplot as plt#欧式距离
def calculate_EuclideanDistance(vec1,vec2):return np.sqrt(np.sum(np.square(vec1-vec2)))#余弦相似度
def calculate_CosinSim(vec1,vec2):return (np.dot(vec1,vec2))/(np.linalg.norm(vec1)*np.linalg.norm(vec2))#创建三个一维向量
a_2=np.array([1,1])    #[ 1 1]
b_2=np.array([5,5])  #[ 5 5]
c_2=np.array([5,0])    #[ 5 0]#求取欧式距离
print("distance ab:",calculate_EuclideanDistance(a_2,b_2))
print("distance ac:",calculate_EuclideanDistance(a_2,c_2))
print("distance bc:",calculate_EuclideanDistance(b_2,c_2))
# distance ab: 5.656854249492381
# distance ac: 4.123105625617661
# distance bc: 5.0print("sim ab:",calculate_CosinSim(a_2,b_2))
print("sim ac:",calculate_CosinSim(a_2,c_2))
print("sim bc:",calculate_CosinSim(b_2,c_2))
# sim ab: 0.9999999999999998
# sim ac: 0.7071067811865475
# sim bc: 0.7071067811865475#绘制三个向量的图相
plt.xlim(0,10)
plt.ylim(0,20)
plt.grid(color='#A9A9A9')
plt.plot(a_2[0],a_2[1],'ro')
plt.plot(b_2[0],b_2[1],'go')
plt.plot(c_2[0],c_2[1],'bo')
plt.show()



http://www.ppmy.cn/news/1570400.html

相关文章

QT:图像上绘制图形

需求描述 1、展示一张图像 2、在图像上可以使用数据绘制图像:矩形、不规则图形、线条 3、有按键可以选择 概要设计 规划布局如下 1、左边是Qlabel 用于展示图片 2、右边是三个按钮 具体实现 1、 首先设计 UI 界面,对控件进行布局 在 mainwindow.u…

AI大模型评测对比2—ChatGPT对比DeepSeek

近期,DeepSeek 凭借其超高的性价比与卓越性能,在国内外各大社交媒体平台上赚足了眼球。令人瞩目的是,它仅耗费 2048 块显卡, 600 亿美元的成本,便成功训练出了可与顶级模型比肩的 Deepseek - V3 模型。这与美国公布的一…

计算机网络之数据链路层(数据链路层的功能)

帧同步: 数据链路层将网络层传下来的数据报封装成帧,为了区分不同的帧,需要在每个帧的开头和结尾添加特殊的标记,以实现帧的定界和同步。这样,接收方就能准确地识别出一个帧的开始和结束。 差错控制: 在…

GoFrame 微服务脚手架模块 (v2.8.x)

概述 GoFrame 框架提供了丰富的微服务组件和易用的 GRPC 脚手架模块。脚手架由 grpcx 社区包实现,包含多个核心模块。 服务端 (Server) 基本使用 服务端由 grpcx.Server 模块维护,用于创建和管理服务端对象。 package mainimport ("github.com…

使用 TensorRT 和 Python 实现高性能图像推理服务器

在现代深度学习和计算机视觉应用中,高性能推理是关键。本文将介绍如何使用 TensorRT 和 Python 构建一个高性能的图像推理服务器。该服务器能够接收客户端发送的图像数据,使用 TensorRT 进行推理,并将结果返回给客户端。 1. 概述 1.1 项目目…

大模型做导师之方案版本比较

背景: 在阅读lightRAG项目时,利用LLM辅助进行理解,当询问LLM如何自定义一个符合项目要求的大模型调用函数时,LLM给出了两个不同的版本。借此想提升一下自己的编程质量,于是让LLM对两个版本进行点评比较。 实现建议 基础…

2. 【.NET Aspire 从入门到实战】--理论入门与环境搭建--.NET Aspire 概览

在当今快速发展的软件开发领域,构建高效、可靠且易于维护的云原生应用程序已成为开发者和企业的核心需求。.NET Aspire 作为一款专为云原生应用设计的开发框架,旨在简化分布式系统的构建和管理,提供了一整套工具、模板和集成包,帮…

maven不能导入依赖和插件Cannot resolve plugin org.apache.maven.plugins:maven-xxx

新建了个工程,新设置了一个仓库地址,maven导入报错: 连最基础的maven自带的插件都无法导入: Cannot resolve plugin org.apache.maven.plugins:maven-install-plugin:2.4Try to run Maven import with -U flag (force update sna…