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

余弦相似度是一种用来确定两个向量之间相似性的度量。它在数据科学、信息检索和自然语言处理(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更加接近。

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

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

相关文章

前端页面显示时间与数据库时间差8小时

环境 jdk11mysql 8.0docker部署的 问题 突然发现页面上的数据比数据库的时间差了八个小时,然后我就开始排查问题。 首先看数据库的信息,发现时间都是没错的。 然后看一下ymal文件,是否是数据源链接写的有问题。 spring:datasource:url:…

攻防世界---misc---Wire1

1.下载题目链接是一个流量包 2.在Wireshark中分析,发现可疑流量 3.过滤http并且是get方式的,使用命令:http.request.methodGET 4.导出http对象 5.注意观察会发现,每隔一段会出现704,我们从上到下把704后面对应的ASCII码…

外卖电商抖客返利CPS公众号+小程序+APP+发单电商平台,知识产权,网站建设。

随着互联网的快速发展,电商和外卖业务日益繁荣,消费者对便捷、优惠的购物体验需求也在不断提升。为了满足这一需求,外卖电商CPS返利系统应运而生,成为了一种新型的消费模式。本文将详细介绍外卖电商CPS返利系统的功能及其优势&…

【vue】defineProps 传数据 父传子

先行知识 【vue】导入组件 传值过程 App.vue <template><Header name"1234567890" url"https://www.1234567890.com" /><hr><!-- <Footer v-bind"propsWeb" /> --><Footer :"propsWeb" /><h…

Linux下使用C语言实现线程池---代码及分析

线程池 相关文章 协议 Socket编程 高并发服务器实现 线程池 如果一个客户端建立连接使用创建一个线程用于处理这一个线程, 处理结束的时候把这一个线程删除, 这个时候会导致线程的创建以及销毁会消耗大量的时间 这时候可以一次性创建多个线程, 这几个线程统称线程池, 如果客户…

10分钟1000台虚机 云安全效能双升 亚信安全新信舱无代理云平台快速适配版正式发布

新信舱 亚信安全新信舱无代理云平台快速适配版正式发布。在云平台依赖性、无代理部署速度、宿主机无代理AV防护和虚拟机缓存扫描性能等方面&#xff0c;新信舱无代理版本提供了无缝的可扩展性、低资源消耗并降低管理复杂性&#xff0c;让安全防护真正做到了 多快好省&#xff…

LeetCode_丑数

题目&#xff1a; 题解&#xff1a; 由题&#xff0c;我们知道丑数大于0&#xff0c;丑数都可以写成2*2*...*2*3*3...*3*5*5...*5&#xff0c;有了这个基础就很好写代码了。 用三个while循环将前面的2 3 5全部除掉如果这个数是丑数&#xff0c;最后n是等于1的&#xff0c;反之…

【Web】WUSTCTF 2020 部分题解

目录 [WUSTCTF 2020]朴实无华 [WUSTCTF 2020]CV Maker [WUSTCTF 2020]颜值成绩查询 [WUSTCTF 2020]朴实无华 访问/robots.txt 访问/fAke_f1agggg.php 抓包看响应头看到/f14g.php 访问/f14g.php 简单的bypass&#xff0c;不解释了 payload: ?num2019e1&md50e2159620…

PINet车道线检测+YOLOv8视频目标检测

前言&#xff1a; 本文主要目的是实现在PINet车道线检测的代码中嵌入YOLOv8的目标检测模块&#xff0c;具体效果如图所示&#xff1a; 在学习和使用YOLOv8进行目标检测时&#xff0c;感觉可以和最近研究的车道线检测项目结合起来&#xff0c;形成一套如上图所示的视频效…

打破常规:AI如何帮助从业者规避营销活动风险

人工智能时代&#xff1a;如何利用AI提升营销效果 在当今商界&#xff0c;市场策划活动对于企业来说至关重要&#xff0c;它们不仅可以吸引消费者的注意&#xff0c;还可以扩大企业的市场份额。然而&#xff0c;这些活动本身带来的风险也不容忽视。为了帮助企业在策划活动时做出…

推荐一个免费使用Claude 3, GPT4和Gemini 1.5 Pro的网站

在探索人工智能的广阔天地时,我偶然间发现了You AI这一平台,它不仅更新了大量的模型,还慷慨地提供了免费的使用机会。兴奋之余,我迅速开始尝试这些新功能,并决定将我的体验分享给大家。以下是我试用的流程: 打开网站:点击左下角的Sign in蓝色框 https://you.comhttps://…

C# 关于进程回收管理的一款工具设计与分享

目录 设计初衷 开发运行环境 Craneoffice ProcessGC 运行主界面 管理任务与策略 其它设置 移动存储设备管理 核心代码-计时器监控 小结 设计初衷 在使用 COM 模式操作 OFFICE 组件的开发过程中&#xff0c;当操作完相关文档后&#xff0c;在某些情况下仍然无法释放掉…

【C++】数据结构的恶龙set和map来了~

下一篇AVL树难点中的难点~ 文章目录 前言一、set的介绍二、map的介绍 题目练习总结 前言 1.关联式容器 在初阶阶段&#xff0c;我们已经接触过STL中的部分容器&#xff0c;比如&#xff1a;vector、list、deque、 forward_list(C11)等&#xff0c;这些容器统称为序列式容…

【C++】3.类和对象(中)

一、类的6个默认成员函数 在上一篇博客中&#xff0c;我们计算了空类的大小为 1 。那么空类中真的什么东西都没有吗&#xff1f;其实不是的&#xff0c;当一个类在什么都不写的时候就会自动生成6个默认的成员函数&#xff08;用户没有写&#xff0c;但是编译器自动生成的成员函…

AI在运维实践中的价值提升

在2024年的AI赛道上&#xff0c;利用大数据 、机器学习算法、人工智能来改善运维效率已成为软件运营商发展的新主张&#xff0c;通过AI在运维流程的洞察、决策和执行&#xff0c;从而提升效率、减少故障时间&#xff0c;优化用户体验。通过分析大量数据来识别趋势和模式&#x…

C ++ 和 C语言的优缺点分别是什么?

C语言&#xff0c;它简直就是编程世界的一块磐石。简洁、直接&#xff0c;让人一眼就能明白它想干嘛。它的运行速度快&#xff0c;接近硬件操作&#xff0c;特别适合那些需要直接与硬件打交道的场景。但就是因为这种接近硬件的特性&#xff0c;C语言在抽象层次上就显得有点捉襟…

科技感画册制作方法,视觉效果直接拉满

随着科技的不断进步&#xff0c;科技感画册制作也变得更加精彩和引人注目。通过巧妙地运用先进的设计工具和技术&#xff0c;以及结合创新的视觉元素&#xff0c;可以轻松地将画册的视觉效果直接拉满。 那你想知道怎么制作吗&#xff1f;现在我来教你这个方法吧&#xff0c;方法…

第九届少儿模特明星盛典 全球赛首席体验官『彭禹锦』精彩回顾

2024年1月30日-2月1日&#xff0c;魔都上海迎来了龙年第一场“少儿形体行业美育春晚”&#xff01;由IPA模特委员会主办的第九届少儿模特明星盛典全球总决赛圆满收官&#xff01;近2000名少儿模特选手从五湖四海而来&#xff0c;决战寒假这场高水准&#xff0c;高人气&#xff…

docker安装并跑通跑通QQ机器人实践(1)-前言及展示

随着大模型技术的迅猛发展&#xff0c;行业应用日益丰富且专业化。为了有效利用大模型的强大功能&#xff0c;建立与之紧密互动的应用接口至关重要。在此背景下&#xff0c;QQ、微信、钉钉等主流即时通讯工具凭借其广泛的用户覆盖和便捷的通信特性&#xff0c;成为连接用户与大…

CompletableFuture 处理异步异常

1、自定义线程池 Configuration public class ThreadPoolConfig {public static ThreadPoolExecutor getThreadPoolExecutor() {int availableProcessors Runtime.getRuntime().availableProcessors();return new ThreadPoolExecutor(availableProcessors,availableProcessor…