【大语言模型】基础:余弦相似度(Cosine similarity)

news2024/11/15 13:35:16

余弦相似度是一种用来确定两个向量之间相似性的度量。它在数据科学、信息检索和自然语言处理(NLP)等多个领域被广泛使用,用于度量在多维空间中两个向量之间角度的余弦。这个指标捕捉的是方向上的相似性而非大小,使其非常适合比较长度不同或需要归一化的文档或向量。

定义

余弦相似度使用两个向量的点积及各自向量的大小来计算。余弦相似度的公式是:

其中:

  • A 和 B 是您正在计算相似度的两个向量。
  • A⋅B 是向量 A 和 B 的点积。
  • ∥A∥ 和 ∥B∥ 分别是向量 A 和 B 的欧几里得范数(或大小)。

属性

  • 范围:余弦相似度的值范围从 -1 到 1。

    • 1 表示两个向量在方向上完全相同。
    • 0 表示正交(无相似性)。
    • -1 表示两个向量方向完全相反。
  • 规模不变性:余弦相似度对乘以常数(规模不变)是不变的。这在比较不同规模的出现频率时特别有用。

简单例子:

from sklearn.metrics.pairwise import cosine_similarity
import numpy as np

# 定义两个向量
vector_a = np.array([[1, 2, 3]])
vector_b = np.array([[4, 5, 6]])

# 计算余弦相似度
similarity = cosine_similarity(vector_a, vector_b)
print("余弦相似度:", similarity[0][0])

我们下面从视觉化的角度,感觉Cosin Simiarity。

首先,我们定义三个向量,并且将它们显示在二维坐标系中。

import numpy as np
import matplotlib
import matplotlib.pyplot as plt

A = [1, 4]
B = [3, 3]
C = [2, 3]

#colors数组为每个向量定义颜色,以便视觉区分。
colors = ['r', 'g', 'b']

#V是从向量A、B和C创建的NumPy数组。
V = np.array([A, B, C])

#向量的起点设置为一个2x3的全零数组。这允许所有向量都从点(0, 0)开始。
origin = np.array([[0, 0, 0],[0, 0, 0]]) # origin point

plt.figure(figsize=(9, 9))

#使用plt.quiver函数绘制向量。参数确保向量从x和y方向的原点绘制。scale_units='xy'和scale=1确保
#向量在x和y方向上按1:1的比例绘制。
plt.quiver(*origin, V[:,0], V[:,1], color=colors, angles='xy', scale_units='xy', scale=1)

for letter, x, y, color in zip('ABC', V[:, 0], V[:, 1], colors):
    plt.text(x / 2., y / 2., letter, fontdict={'size': 20, 'color': color, 'weight': 'bold'}, verticalalignment='top')

plt.xlim(0, 5)
plt.ylim(0, 5)
plt.grid()
plt.show()

那么问题来了,在向量A和向量C中,哪个与向量B最相似?

为了回答这个问题,我们需要一个衡量相似性的框架。我们可以使用向量之间的夹角作为相似性的衡量标准。它们的角度表明了它们指向类似方向的事实,并且与它们的相对长度无关。

我们倾向于向量指向的方向。角度是两个方向之间差异的衡量标准 我们可以使用这个角度的余弦值:

  • 0.0 表示这是一个90度角(垂直):最不相似
  • 1.0 表示这是一个平角(平行):最相似

我们通过热力图展示相似度:

from sklearn.metrics.pairwise import cosine_similarity

sims = cosine_similarity([A, B, C])
# from https://matplotlib.org/3.1.1/gallery/images_contours_and_fields/image_annotated_heatmap.html

from mpl_toolkits.axes_grid1 import make_axes_locatable


def heatmap(data, row_labels, col_labels, ax=None,
            cbar_kw={}, cbarlabel="", **kwargs):
    """
    Create a heatmap from a numpy array and two lists of labels.

    Parameters
    ----------
    data
        A 2D numpy array of shape (N, M).
    row_labels
        A list or array of length N with the labels for the rows.
    col_labels
        A list or array of length M with the labels for the columns.
    ax
        A `matplotlib.axes.Axes` instance to which the heatmap is plotted.  If
        not provided, use current axes or create a new one.  Optional.
    cbar_kw
        A dictionary with arguments to `matplotlib.Figure.colorbar`.  Optional.
    cbarlabel
        The label for the colorbar.  Optional.
    **kwargs
        All other arguments are forwarded to `imshow`.
    """

    if not ax:
        ax = plt.gca()

    # Plot the heatmap
    im = ax.imshow(data, **kwargs)

    # Create colorbar

    # We want to show all ticks...
    ax.set_xticks(np.arange(data.shape[1]))
    ax.set_yticks(np.arange(data.shape[0]))
    # ... and label them with the respective list entries.
    ax.set_xticklabels(col_labels, fontdict={'size': 20, 'weight': 'bold'})
    ax.set_yticklabels(row_labels, fontdict={'size': 20, 'weight': 'bold'})

    # Let the horizontal axes labeling appear on top.
    ax.tick_params(top=True, bottom=False,
                   labeltop=True, labelbottom=False)

    ax.set_xticks(np.arange(data.shape[1]+1)-.5, minor=True)
    ax.set_yticks(np.arange(data.shape[0]+1)-.5, minor=True)
    ax.grid(which="minor", linestyle='-', linewidth=1)
    ax.tick_params(which="minor", bottom=False, left=False)

    return im


def annotate_heatmap(im, data=None, valfmt="{x:.2f}",
                     textcolors=["black", "white"],
                     threshold=None, **textkw):
    """
    A function to annotate a heatmap.

    Parameters
    ----------
    im
        The AxesImage to be labeled.
    data
        Data used to annotate.  If None, the image's data is used.  Optional.
    valfmt
        The format of the annotations inside the heatmap.  This should either
        use the string format method, e.g. "$ {x:.2f}", or be a
        `matplotlib.ticker.Formatter`.  Optional.
    textcolors
        A list or array of two color specifications.  The first is used for
        values below a threshold, the second for those above.  Optional.
    threshold
        Value in data units according to which the colors from textcolors are
        applied.  If None (the default) uses the middle of the colormap as
        separation.  Optional.
    **kwargs
        All other arguments are forwarded to each call to `text` used to create
        the text labels.
    """

    if not isinstance(data, (list, np.ndarray)):
        data = im.get_array()

    # Normalize the threshold to the images color range.
    if threshold is not None:
        threshold = im.norm(threshold)
    else:
        threshold = im.norm(data.max())/2.

    # Set default alignment to center, but allow it to be
    # overwritten by textkw.
    kw = dict(horizontalalignment="center",
              verticalalignment="center")
    kw.update(textkw)

    # Get the formatter in case a string is supplied
    if isinstance(valfmt, str):
        valfmt = matplotlib.ticker.StrMethodFormatter(valfmt)

    # Loop over the data and create a `Text` for each "pixel".
    # Change the text's color depending on the data.
    texts = []
    for i in range(data.shape[0]):
        for j in range(data.shape[1]):
            kw.update(color=textcolors[int(im.norm(data[i, j]) > threshold)])
            text = im.axes.text(j, i, valfmt(data[i, j], None), **kw)
            texts.append(text)

    return texts

函数:heatmap

此函数从一个2D numpy数组和两个行和列标签列表创建热图。

参数:

  • data:形状为(N, M)的2D numpy数组,其中N是行数,M是列数。
  • row_labels:长度为N的行标签列表或数组。
  • col_labels:长度为M的列标签列表或数组。
  • ax:绘制热图的matplotlib.axes.Axes实例。如果未提供,则函数将使用当前轴或创建新的轴。
  • cbar_kw:字典,包含matplotlib.Figure.colorbar的参数。它是可选的。
  • cbarlabel:色标的标签。它是可选的。
  • **kwargs:额外的参数被转发给imshow,用于将数据显示为图像。

函数内的主要操作:

  • 检查是否传递了Axes实例;如果没有,则检索当前Axes。
  • 使用ax.imshow(data, **kwargs)绘制热图。
  • 调整刻度标记和标签以清晰显示。
  • 可选地创建色标并设置其标签。
  • 格式化次要刻度以在热图的单元格之间创建更好的视觉分隔线。

函数:annotate_heatmap

此函数向热图添加注释,提供数值或热图单元格内的其他文本。

参数:

  • im:要标记的AxesImage
  • data:用于注释的数据。如果为None,则使用AxesImage的数据。
  • valfmt:热图内部注释的格式。可以是字符串格式方法或matplotlib.ticker.Formatter
  • textcolors:两种颜色规格的列表或数组,第一种颜色用于低于阈值的值,第二种用于高于阈值的值。
  • threshold:数据单位中的值,根据此阈值确定如何应用文本颜色。
  • **textkw:额外的关键字参数被转发到创建文本标签的text调用。

函数内的主要操作:

  • 根据图像的颜色归一化将阈值归一化。
  • 遍历数据数组,并为热图中的每个单元格创建一个使用指定格式的文本标签。
  • 根据数据值是否超过阈值选择文本颜色。
fig, ax = plt.subplots(figsize=(9, 9))

im = heatmap(sims, list('ABC'), list('ABC'), ax=ax,
                   cmap="Greens", cbarlabel="Cosine Similarity", vmin=0.0, vmax=1.0)
texts = annotate_heatmap(im, valfmt="{x:.2f}")

divider = make_axes_locatable(ax)
cax = divider.append_axes("right", size="5%", pad=0.2)
fig.colorbar(im, cax=cax)

fig.tight_layout()
plt.show()

绘制结果为:

这是一个对称矩阵,对角线上的相似度值始终为1,因为一个向量与自身的相似度一定为1。

通过比较B和C的相似度为0.98,而A和C的相似度为0.94,C与B更加接近。

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

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

相关文章

专业SEO优化指南:设置网站关键词的详细步骤

在网站SEO优化的过程中,关键词的设置是提升网站排名的关键步骤之一。那么,作为一名专业的SEO人员,如何有效地进行关键词设置呢?以下是一些详细的步骤: 1. 确定网站的核心关键词。 这需要深入理解网站的主题或产品。通…

结合创新!ResNet+Transformer,高性能低参数,准确率达99.12%

今天给各位介绍一个发表高质量论文的好方向:ResNet结合Transformer。 ResNet因其深层结构和残差连接,能够有效地从图像中提取出丰富的局部特征。同时,Transformer的自注意力机制能够捕捉图像中的长距离依赖关系,为模型提供全局上…

GPT人工智能在线网页版大全

平民不参与内测,还能使用 ChatGPT 吗? 自去年 ChatGPT 爆红以来,关于它的消息铺天盖地。如果你真的想使用它,途径有很多。除了官方网站外国内还有许多 ChatGPT 的镜像网站,其中不乏免费的 3.5 版本。虽然有些网站需要…

byobu

byobu 终端多路复用器 一、byobu 安装二、byobu 使用三、其他终端多路复用器四、ssh byobu 远程协作 系统环境: linux(ubuntu,debian,kali) 一、byobu 安装 byobu 是包装过的tmux #sudo apt install tmux sudo apt install byobubyobu二、byobu 使用 创建窗口: Ctrl a c…

秋招复习笔记——八股文部分:网络基础

TCP/IP 网络模型 应用层 最上层的,也是我们能直接接触到的就是应用层(Application Layer),我们电脑或手机使用的应用软件都是在应用层实现。那么,当两个不同设备的应用需要通信的时候,应用就把应用数据传…

使用 Tranformer 进行概率时间序列预测实战

使用 Transformers 进行概率时间序列预测实战 通常,经典方法针对数据集中的每个时间序列单独拟合。然而,当处理大量时间序列时,在所有可用时间序列上训练一个“全局”模型是有益的,这使模型能够从许多不同的来源学习潜在的表示。…

写一个uniapp的登录注册页面

一、效果图 二、代码 1、登录 &#xff08;1&#xff09;页面布局代码 <template><view class"normal-login-container"><view class"logo-content align-center justify-center flex"><image class"img-a" src"/s…

Maven超详细使用

定义 是一款用于管理和构建java项目的工具 作用 1. 依赖管理 2. 统一项目结构 3. 项目构建 项目目录结构 POM 项目对象模型 (Project Object Model) POM (Project Object Model) &#xff1a;指的是项目对象模型&#xff0c;用来描述当前的maven项目。 仓库 本地仓库&#…

【深度学习|基础算法】3.VggNet(附训练|推理代码)

这里写目录标题 1.摘要2.Vgg的网络架构3.代码backbonetrainpredict 4.训练记录5.推理onnxruntime推理export_onnx openvino推理tensorrt推理 1.摘要 vgg是由牛津大学视觉几何组&#xff08;Visual Geometry Group&#xff09;的这篇论文中提出的模型&#xff0c;并且在2014年的…

C#版Facefusion ,换脸器和增强器

C#版Facefusion &#xff0c;换脸器和增强器 目录 说明 效果 项目 调用代码 说明 Facefusion是一款最新的开源AI视频/图片换脸项目。是原来ROOP的项目的延续。项目官方介绍只有一句话&#xff0c;下一代换脸器和增强器。 代码实现参考 https://github.com/facefusion/f…

Windows中通过cmd查看以保存的WiFi密码

1、要以管理员身份运行CMD 要以管理员身份运行CMD 2、查看以保存的所有WiFi 执行命令 netsh wlan show profiles 会显示所有已保存的wifi 3、这里查看已经保存的WiFi HLS_HMD 的密码 执行命令查看&#xff1a; netsh wlan show profile name"HLS_HMD&qu…

【Java开发指南 | 第四篇】Java常量、自动类型转换、修饰符

读者可订阅专栏&#xff1a;Java开发指南 |【CSDN秋说】 文章目录 Java常量自动类型转换Java修饰符 Java常量 常量在程序运行时是不能被修改的。 在 Java 中使用 final 关键字来修饰常量&#xff0c;声明方式和变量类似&#xff1a; final double PI 3.1415927;自动类型转换…

app证书在设置在哪

根据近日工业和信息化部发布的《工业和信息化部关于开展移动互联网应用程序备案工作的通知》&#xff0c;相信不少要进行IOS平台App备案的朋友遇到了一个问题&#xff0c;就是apple不提供云管理式证书的下载&#xff0c;也就无法获取公钥及证书SHA-1指纹。 已经上架的应用不想重…

ruoyi的一些gateway传token的一些问题

ruoyi的一些gateway传token的一些问题 1、gateway会处理授权信息 2、authorization: Bearer 253f2bd990754ca4aae22e1f755b17fe 是一个很简单的信息。 去授权信息&#xff0c;用这个token做验证。然后封装一个user在内部传递。 这个是不会暴露在最外面的请求中的。 还会放一…

RMAN数据迁移方案

数据迁移 Oracle环境检查 开启归档 1.首先关闭数据库 shutdown immediate; 2.打开mount状态 startup mount; 3.更改数据库为归档模式 alter database archivelog; 4.打开数据库 alter database open; 5.再次检查 archive log list; 查看构造的表和数据 由于数据会有中文&…

redis复习笔记08(小滴课堂)

案例实战需求之大数据下的用户画像标签去重 我们就简单的做到了去重了。 案例实战社交应用里面之关注、粉丝、共同好友案例 这就是我们set的一个应用。 案例实战之SortedSet用户积分实时榜单最佳实践 准备积分类对象&#xff1a; 我们加上构造方法和判断相等的equals和hascod…

C语言是不是要跟不上社会需求了?

C 语言是否已经难以跟上社会需求的步伐了呢&#xff1f;有这么一位网友曾提及&#xff0c;就在几天前&#xff0c;他遭受了老板的严厉批评&#xff0c;原因便是他仅仅精通 C 语言编程&#xff0c;已然无法满足老板的实际需求。事实上&#xff0c;C 语言在嵌入式领域仍旧拥有着极…

Depth maps转点云

前言 本文主要记录一下如何可视化相机位姿&#xff0c;如何用Blender得到的深度图反投影到3D空间&#xff0c;得到相应的点云。 Refernce https://github.com/colmap/colmap/issues/1106 https://github.com/IntelRealSense/librealsense/issues/12090 https://medium.com/yod…

图灵奖简介及2023年获奖者Avi Wigderson的贡献

No.内容链接1Openlayers 【入门教程】 - 【源代码示例300】 2Leaflet 【入门教程】 - 【源代码图文示例 150】 3Cesium 【入门教程】 - 【源代码图文示例200】 4MapboxGL【入门教程】 - 【源代码图文示例150】 5前端就业宝典 【面试题详细答案 1000】 文章目录 2023年的…

C语言基础入门案例(1)

目录 第一题&#xff1a;实现大衍数列的打印 第二题&#xff1a;生成所有由1、2、3、4组成的互不相同且无重复数字的三位数&#xff0c;并计算总数 第三题&#xff1a;整数加法计算器 第四题&#xff1a;实现一个范围累加和函数 第五题&#xff1a;编写一个函数计算整数的阶…