Polars中列表列的余弦相似度计算与矩阵生成教程

Polars中列表列的余弦相似度计算与矩阵生成教程

本教程详细介绍了如何在polars dataframe中对列表(list)类型的列进行两两余弦相似度计算,并将结果整理成一个对称的相似度矩阵。通过利用polars的内置表达式、join_where生成组合以及pivot操作,我们能够高效地处理列表数据并避免使用性能较低的python udfs,从而实现类似于相关性矩阵的输出。

在数据分析和机器学习领域,计算向量之间的相似度是常见的任务。当数据存储在Polars DataFrame的列表(List)类型列中时,我们可能需要计算这些列表值之间的两两余弦相似度,并以矩阵形式展示结果,类似于相关性矩阵。本教程将指导您如何高效地完成这一任务,避免直接使用Python用户定义函数(UDFs)可能带来的性能问题。

1. 数据准备

首先,我们创建一个包含列表类型数据的Polars DataFrame作为示例:

import polars as pldata = {    "col1": ["a", "b", "c", "d"],    "col2": [[-0.06066, 0.072485, 0.548874, 0.158507],             [-0.536674, 0.10478, 0.926022, -0.083722],             [-0.21311, -0.030623, 0.300583, 0.261814],             [-0.308025, 0.006694, 0.176335, 0.533835]],}df = pl.DataFrame(data)print("原始DataFrame:")print(df)

输出:

原始DataFrame:shape: (4, 2)┌──────┬─────────────────────────────────┐│ col1 ┆ col2                            ││ ---  ┆ ---                             ││ str  ┆ list[f64]                       │╞══════╪═════════════════════════════════╡│ a    ┆ [-0.06066, 0.072485, … 0.15850… ││ b    ┆ [-0.536674, 0.10478, … -0.0837… ││ c    ┆ [-0.21311, -0.030623, … 0.2618… ││ d    ┆ [-0.308025, 0.006694, … 0.5338… │└──────┴─────────────────────────────────┘

我们的目标是计算 col1 中每个唯一值(例如 ‘a’, ‘b’)对应的 col2 列表之间的余弦相似度,并最终生成一个4×4的相似度矩阵。

2. 生成所有组合

为了计算所有可能的两两相似度,我们需要将DataFrame与自身进行连接,以生成所有唯一的配对。这里我们将使用 with_row_index() 为每行添加一个索引,然后通过 join_where() 进行条件连接,确保只生成上三角矩阵(包括对角线)的组合,避免重复计算。

# 进入Lazy模式以提高性能df_lazy = df.with_row_index().lazy()# 使用join_where生成所有组合,只保留index <= index_right的部分combinations_df = df_lazy.join_where(df_lazy, pl.col.index <= pl.col.index_right).collect()print("n生成的组合DataFrame:")print(combinations_df)

输出:

生成的组合DataFrame:shape: (10, 6)┌───────┬──────┬─────────────────────────────────┬─────────────┬────────────┬─────────────────────────────────┐│ index ┆ col1 ┆ col2                            ┆ index_right ┆ col1_right ┆ col2_right                      ││ ---   ┆ ---  ┆ ---                             ┆ ---         ┆ ---        ┆ ---                             ││ u32   ┆ str  ┆ list[f64]                       ┆ u32         ┆ str        ┆ list[f64]                       │╞═══════╪══════╪═════════════════════════════════╪═════════════╪════════════╪═════════════════════════════════╡│ 0     ┆ a    ┆ [-0.06066, 0.072485, … 0.15850… ┆ 0           ┆ a          ┆ [-0.06066, 0.072485, … 0.15850… ││ 0     ┆ a    ┆ [-0.06066, 0.072485, … 0.15850… ┆ 1           ┆ b          ┆ [-0.536674, 0.10478, … -0.0837… ││ 0     ┆ a    ┆ [-0.06066, 0.072485, … 0.15850… ┆ 2           ┆ c          ┆ [-0.21311, -0.030623, … 0.2618… ││ 0     ┆ a    ┆ [-0.06066, 0.072485, … 0.15850… ┆ 3           ┆ d          ┆ [-0.308025, 0.006694, … 0.5338… ││ 1     ┆ b    ┆ [-0.536674, 0.10478, … -0.0837… ┆ 1           ┆ b          ┆ [-0.536674, 0.10478, … -0.0837… ││ 1     ┆ b    ┆ [-

以上就是Polars中列表列的余弦相似度计算与矩阵生成教程的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1376603.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月14日 16:02:48
下一篇 2025年12月14日 16:03:01

相关推荐

  • 如何用Golang实现端口扫描器 开发网络探测小工具

    %ignore_a_1%实现端口扫描器的核心在于利用其并发能力和网络库,通过并发尝试连接目标端口判断开放状态。1. 使用goroutine和sync.waitgroup管理并发任务,确保所有扫描完成后再退出;2. 引入工作池模式控制并发量,防止资源耗尽;3. 利用net.dialtimeout设置超…

    2025年12月15日 好文分享
    000
  • Golang如何优化正则匹配 编译正则表达式与避免回溯技巧

    在golang中优化正则表达式匹配的核心在于:1. 提前编译并复用正则对象以避免重复编译带来的性能损耗;2. 理解re2引擎特性,编写更高效的模式。go的regexp包基于re2引擎,天然避免了灾难性回溯,保证线性时间复杂度,因此无需像传统nfa引擎那样担心指数级性能下降。然而,开发者仍需遵循最佳实…

    2025年12月15日 好文分享
    000
  • Golang如何搭建GIS地理处理环境 集成PostGIS与GeoJSON支持

    golang是gis地理处理的理想选择,因其具备高效的并发模型、编译型语言的性能优势以及适合构建高性能后端服务的特点。1. go通过goroutine和channel机制轻松应对高并发场景,适合处理大量实时地理位置请求;2. go编译为单一静态二进制文件,部署便捷,适合容器化环境;3. go的强类型…

    2025年12月15日 好文分享
    000
  • Golang微服务中的RPC框架如何选择 Golang微服务RPC框架的对比与选型建议

    grpc适合多语言、标准化场景;thrift适合协议定制和兼容旧系统;kitex适合go生态高性能需求。grpc基于http/2和protobuf,跨语言支持好、标准化程度高、流式支持完善,适合需多语言交互及重视接口规范的场景。thrift协议灵活,支持多种传输协议和序列化格式,适合对协议定制有需求…

    2025年12月15日 好文分享
    000
  • Golang的encoding库有哪些编码方式 对比Base64与Hex的实现差异

    golang的encoding库提供多种编码方式,适用于不同场景的数据转换需求。2. base64用于将二进制数据转换为文本形式,适合在http、邮件等文本协议中传输二进制内容。3. hex将字节转为十六进制字符串,便于调试、日志记录和显示哈希值。4. json是现代web服务中最常用的数据交换格式…

    2025年12月15日 好文分享
    000
  • 系统级编程语言:定义、特性与应用

    系统级编程语言是专为开发底层软件、操作系统、设备驱动程序以及编译器等工具而设计的语言。它们通常提供对硬件的直接访问能力、内存管理控制,并倾向于编译成原生机器码,以实现高性能和资源效率。与面向特定业务领域的应用编程语言不同,系统级语言旨在解决计算领域自身的问题,是构建软件基础设施的关键。 系统级编程语…

    2025年12月15日
    000
  • 探索系统级编程语言的本质

    系统级编程语言旨在开发底层软件和编程工具,而非面向终端用户的业务应用。它们通常用于操作系统内核、设备驱动、编译器等领域。这类语言常具备直接编译为机器码、允许低级内存访问和灵活的类型操作等特性,使得开发者能更精细地控制硬件资源,如C、C++和Go等。与此相对的是Java、C#等主要用于业务应用开发的语…

    2025年12月15日
    000
  • 使用SWIG将C/C++ GUI框架移植到Go:可行性、挑战与实践考量

    使用SWIG将C/C++ GUI框架(如GTK)移植到Go语言在技术上是可行的,但面临多重挑战。当前SWIG对Go的支持有限,且直接生成的接口会暴露底层C/C++的复杂细节。为了实现Go语言的惯用行为,尤其是在垃圾回收和接口设计方面,必须在SWIG生成的绑定之上构建一个额外的Go层。这使得移植工作远…

    2025年12月15日
    000
  • 怎样用Golang构建可观测性平台 集成Metrics/Tracing/Logging方案

    要构建一个基于golang的可观测性平台,核心在于整合metrics、tracing和logging三大支柱。1. 指标采集与暴露:使用prometheus go客户端库定义并暴露http请求总量、延迟等指标,通过/metrics端点供prometheus抓取;2. 分布式追踪实现:采用opente…

    2025年12月15日 好文分享
    000
  • Golang中的装饰器模式如何实现 解析函数包装与中间件技术

    装饰器模式是一种设计模式,允许在不修改原有对象的前提下动态添加新功能,在go语言中通过函数包装和中间件技术实现。1. 函数包装是核心方式,利用go的函数作为一等公民特性,将函数作为参数或返回值进行封装,例如通过withlogging函数为sayhello添加日志功能而不改动其内部逻辑;2. 中间件技…

    2025年12月15日 好文分享
    000
  • 深入理解“系统级语言”:定义、特性与应用场景

    系统级语言(Systems Language)是一种主要用于开发底层软件和工具的编程语言,如操作系统内核、设备驱动、编译器等。与面向特定业务领域的应用编程语言不同,系统级语言更侧重于计算机领域本身的编程,常具备直接编译为原生代码、灵活的类型系统和手动内存管理等特性。Go语言的出现背景也提及了对新一代…

    2025年12月15日
    000
  • 系统编程语言:核心概念与特性解析

    系统编程语言是专为开发底层软件和工具而设计的语言,例如操作系统内核、设备驱动、编译器等。它们通常具备直接操作硬件、高效管理内存以及生成原生二进制代码的能力,与面向业务应用开发的语言形成鲜明对比,旨在为计算领域本身提供强大的编程工具。 什么是系统编程语言? “系统编程语言”并非一个严格的学术定义,而更…

    2025年12月15日
    000
  • 为什么Golang成为云原生Wasm运行时首选 对比wasmtime与wasmer性能

    golang成为云原生wasm运行时首选的原因有三:1.其并发模型(goroutines和channels)适合高并发场景,结合wasm的轻量级特性可构建高性能应用;2.golang标准库和第三方库丰富,便于快速开发wasm应用;3.静态编译特性使wasm应用可打包为独立可执行文件,易于部署。在wa…

    2025年12月15日 好文分享
    000
  • Golang在DevOps流水线中的测试自动化 分享Mock框架与集成测试方案

    golang在测试自动化中的独特优势包括编译速度快、执行效率高、并发模型优秀、语法简洁、标准库强大、静态类型安全和跨平台能力。这些特性使其在devops流水线中能高效支撑单元测试、集成测试和mocking,加速反馈循环并提升测试稳定性。1. go的并发模型(goroutines和channels)让…

    2025年12月15日 好文分享
    000
  • Golang如何支持量子计算模拟 安装QEMU和量子算法库环境

    golang可通过第三方工具和接口支持量子计算模拟。1.可尝试使用定制版qemu进行量子模拟,但需下载源码、编译启用插件并配置虚拟机环境;2.更主流方式是用go调用量子云服务api,如ibm、rigetti等平台,通过http请求上传电路数据并处理结果;3.可安装实验性go量子库如qcgpu-go,…

    2025年12月15日 好文分享
    000
  • 使用 SWIG 将 GUI 函数移植到 Go 的可能性

    SWIG (Simplified Wrapper and Interface Generator) 是一种软件开发工具,用于连接用 C 和 C++ 等语言编写的程序与各种高级编程语言,如 Python、Java、Go 等。 理论上,使用 SWIG 将 GTK 等 GUI 框架移植到 Go 是可行的。…

    2025年12月15日
    000
  • 使用SWIG将C/C++ GUI库封装到Go语言:技术可行性与实践考量

    本文探讨了使用SWIG将C/C++ GUI框架(如GTK)移植到Go语言的技术可行性。尽管理论上可行,但SWIG对Go的支持目前仍有限。核心挑战在于,直接的SWIG封装会暴露底层细节,生成的Go接口不够Go语言化,尤其是在垃圾回收和接口处理方面。因此,为了提供符合Go语言习惯的API,需要在SWIG…

    2025年12月15日
    000
  • Golang环境如何集成机器学习库 配置Gorgonia和GoML支持

    golang集成机器学习能力可通过gorgonia和goml实现。1. gorgonia适合构建计算图和深度学习模型,使用go get安装后可编写线性回归等模型并进行自动微分和张量运算;2. goml专注于传统机器学习算法,安装后可快速实现线性回归、决策树等功能;3. 注意依赖版本冲突、性能考量及生…

    2025年12月15日 好文分享
    000
  • Go语言中集成C/C++信号处理库的策略

    本文探讨了在Go语言中进行音频信号处理时,如何克服原生库缺失的挑战。针对Go语言缺乏成熟的信号处理包的现状,文章详细介绍了两种主要的解决方案:利用SWIG#%#$#%@%@%$#%$#%#%#$%@_20dc++e2c6fa909a5cd62526615fe2788a集成C++库,以及通过cgo手动…

    2025年12月15日
    000
  • Go语言中通过字符串名称获取reflect.Type的策略与实践

    在Go语言中,直接通过字符串名称在运行时查找并获取reflect.Type并非标准功能,这主要受限于Go的编译和链接机制。本文将探讨为何此操作不直接可行,并提供一种常用且实用的解决方案:通过预先注册类型映射来模拟实现此功能,同时提供示例代码和注意事项,帮助开发者在特定场景下有效管理和使用类型信息。 …

    2025年12月15日
    000

发表回复

登录后才能评论
关注微信