scipy.sparse使用简例

2023-11-09

CDIMC-Net[1] 中有个对整个数据集求 kNN 图的函数 get_kNNgraph2[2],是用 dense 的 numpy.ndarray 存的,空间复杂度 O ( n 2 ) O(n^2) O(n2),大数据集很吃内存,但其实 kNN 图很稀疏。这里用 scipy.sparse 的 API 改写。

Code

  • csr_matrix:row slicing 高效,因为一行对应一个 datum 的邻接链表,取 batch 是对行取,所以用它。
  • lil_matrix:说是「改变稀疏结构很高效」,用在图的构造时,构造完再转 csr_matrix(本来直接用 csr_matrix 构造,然后它建议用 lil_matrix)。
import numpy as np
from scipy.sparse import csr_matrix, lil_matrix
# import torch


def get_kNNgraph2(data,K_num):
    """原来的构图函数
    https://github.com/DarrenZZhang/CDIMC-Net/blob/main/CDIMC-net-handwritten_final.py#L46
    """
    # each row of data is a sample

    x_norm = np.reshape(np.sum(np.square(data), 1), [-1, 1])  # column vector
    x_norm2 = np.reshape(np.sum(np.square(data), 1), [1, -1])  # column vector
    dists = x_norm - 2 * np.matmul(data, np.transpose(data))+x_norm2
    num_sample = data.shape[0]
    graph = np.zeros((num_sample,num_sample),dtype = np.int)
    for i in range(num_sample):
        distance = dists[i,:]
        small_index = np.argsort(distance)
        graph[i,small_index[0:K_num]] = 1
    graph = graph-np.diag(np.diag(graph))
    resultgraph = np.maximum(graph,np.transpose(graph))
    return resultgraph


def get_kNNgraph2_sparse(X, K_num, batch_size=256):
    """sparse version of kNN graph calculation"""
    n = X.shape[0]  # full size
    # `(n, n)`  NOT `[n, n]`
    G = lil_matrix((n, n), dtype=np.int8)
    x_norm_all = np.sum(np.square(X), axis=1, keepdims=True).T  # [1, n]
    for _begin in range(0, n, batch_size):
        _end = min(_begin + batch_size, n)
        X_batch = X[_begin: _end]
        # euclidean distance
        x_norm = np.sum(np.square(X_batch), axis=1, keepdims=True)  # [batch_size, 1]
        D = x_norm - 2 * np.matmul(X_batch, np.transpose(X)) + x_norm_all  # [batch_size, n]
        small_index = np.argsort(D, axis=1)[:, :K_num]  # [batch_size, K_num]
        # mask the kNN
        for i in range(small_index.shape[0]):
            _row_id = _begin + i
            _small_idx = small_index[i]
            G[_row_id, _small_idx] = 1

    # no self-loop
    G.setdiag(0)
    # symmetrize
    G = G.maximum(G.transpose())
    # convert to `csr_matrix` for fast row slicing
    G = G.tocsr()
    return G


"""验证一致性"""
N = 6  # num of data
D = 3  # data dim
K = N // 2
for i in range(150):
    # print(i)
    X = np.random.permutation(N * D).reshape(N, D)

    G1 = get_kNNgraph2(X, K)
    G2 = get_kNNgraph2_sparse(X, K).todense()

    diff = (G1 != G2).sum()
    if diff != 0:
        print("diff:", i, diff)  # 无输出

    # print("PyTorch sparse matrix")
    # x_nz, y_nz = G2.nonzero()
    # I = torch.cat([
        # torch.from_numpy(x_nz),
        # torch.from_numpy(y_nz),
    # ], 0).long()
    # V = torch.ones(x_nz.shape[0]).float()
    # break

print("DONE")

References

  1. DarrenZZhang/CDIMC-Net
  2. get_kNNgraph2
  3. Sparse matrices (scipy.sparse)
  4. scipy.sparse.csr_matrix
  5. scipy.sparse.lil_matrix
  6. torch.sparse
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

scipy.sparse使用简例 的相关文章

随机推荐

  • 优质数对的数目[位运算特点+抽象能力考察+分组快速统计]

    位运算特点 抽象能力考察 分组快速统计 前言 一 优质数对的数目 二 思路与优化过程 总结 参考文献 前言 位运算是计算机最基本的计算 是最快的运算方式 与或非各有特点 抽象能力考察我理解成一种 拿核心去累赘 的能力 分组快速统计 我们不必
  • 1Python入门小结(1)

    Python入门小结 1 万丈高楼平地起 简介 Python是一种通用编程语言 其在科学计算和机器学习领域具有广泛的应用 本小节包含的内容 变量 运算符与数据类型 位运算 条件语句 循环语句 异常处理 变量 运算符与数据类型 注释 Pyth
  • 我使用过的Linux命令之stty - 显示和修改终端行设置

    原文链接 http codingstandards iteye com blog 826924 用途说明 stty命令用于显示和修改终端行设置 change and print terminal line settings 常用参数 stt
  • 【Linux学习】虚拟机VMware 安装Qt5 一条龙讲解

    如何在Linux下安装Qt5呢 若已在Linux下载好安装包 可直接从第三步进行阅读 目录 第一步 下载所需版本Qt 第二步 将Qt安装包传输到Linux 第三步 Linux下安装Qt 第四步 配置 Qt 环境 本文安装版本 linux上的
  • 浅谈软件构件和软件构件测试

    什么是构件 构件也称为组件 是一个独立发布的功能部分 通过接口可以访问它的服务 其特点是 l 软件系统中具有相对独立功能 可以明确辨识 接口由契约指定 和语境有明显依赖关系 可独立部署 且多由第三方提供的可组装软件实体 l 软件构件须承载有
  • 前端导出后端文件的方法

    一般存在两种方式 1 请求接口之后 后端返回文件路径 前端直接下载 2 请求接口之后 后端以文件流的形式返回给前端 前端再下载到本地 第一种方式 window location href res request responseURL 直接
  • CVPR 2017论文

    近期在看CVPR2017的文章 顺便就把CVPR2017整理一下 分享给大家 更多的 Computer Vision的文章可以访问Computer Vision Foundation open access CVPapers Machine
  • Vue实现给按钮的点击事件绑定id参数

    当我们需要给按钮所绑定的值做出判断并记录时 eg 为答题的正确以及题号做判断 第一种情况 使用v for循环 div div 我是id div div 1 2 3 然后在 vue 的实例中就可以拿到对应的 id b index this l
  • 持久化数据&缓存数据双写一致性

    背景 缓存中数据更新一般有两个入口 数据缓存过期 数据在访问时发现缓存中无数据时重新查库然后更新至缓存 场景和问题等同于缓存查询 相关solution参考 缓存数据查询的注意事项 缓存未过期 数据库数据有变动主动更新至缓存 比较常见的场景
  • Windows+Ubuntu 22.04.1 LTS 64bit 双系统配置

    为了开发linux下的软件 花了半天的时间安装了双系统 记录一下过程方便以后重装 帮同学装 安装尽量使用官网教程 一 提前准备 1 确保硬盘有足够空余空间 2 关闭windows快速启动 会影响开机进入多系统引导 windows 10如何关
  • 函数栈帧的创建与销毁

    目录 引言 基础知识 内存模型 寄存器的种类与功能 常用的汇编指令 函数栈帧创建与销毁 main 函数栈帧的创建 NO1 NO2 NO3 NO4 NO5 NO6 main 函数栈帧变量的创建 调用Add 函数栈帧的预备工作 传参 NO1 N
  • 小蜜团队万字长文《读后简略概括》

    1 对话系统主要分为三类 闲聊型 任务导向型 问答型 闲聊型 就是瞎聊 想聊啥就 聊啥 任务导向型 考虑多轮对话 根据对话的不同状态和槽位值进行回复策略的选择 问答型 一问一答 识别询问者的意图 从知识库中选取答案进行返回 2 任务导向型
  • perl编写之前的一些习惯细节

    变量 环境变量的传递 文件 文件目录文件名路径的解析操作 命令行参数 调用shell命令 变量的debug 主体结构的划分 编写简单package的模板 脚本执行的关键信息保存在日志里 代码整理 下述信息 仅供自己编写新脚本之前的回顾内容
  • web前端html+css基础 项目实例

  • 【C++笔记】数据结构栈、堆,内存占用中栈区、堆区的区别和理解

    在计算机领域 堆栈是一个不容忽视的概念 我们编写的C语言程序基本上都要用到 但对于很多的初学着来说 堆栈是一个很模糊的概念 堆栈 一种数据结构 一个在程序运行时用于存放的地方 这可能是很多初学者的认识 因为我曾经就是这么想的和汇编语言中的堆
  • matlab机器人工具箱(1)

    1 机器人工具箱 2 Figure的基本组成 figure和axes的概念 在实际绘图中 一张图可能会有好几个子图 这时axes表示生成的各个小图 而figure则是绘制各图的大画布 所以 在之后设置图形属性时 有时用到gca Axes 有
  • Python爬虫自动刷“问卷网”问卷(不锁IP)

    大学很多项目都会要求征集问卷 但很难找到渠道迅速收集大量样本 如果是自己通过 问卷网 设计的问卷可以在设置不锁IP 默认情况 下用本方法快速刷取大量样本 且能保证问卷结果满足自身项目需求 即使没有了解过爬虫 稍有python基础看过本程序后
  • C++后台开发之我见

    C 后台开发之我见 2017 2 6 工作也快两年了 偶然看到自己以前写过的一些技术博客 发现自己自毕业后一直没有更新过自己的技术博客 趁现在是刚过完春节快要回公司工作之际 谈谈我个人对后台开发的一些个人见解 希望能够对在校的学生或者刚刚接
  • Python爬虫从入门到精通:今日作业_requests基础04_爬取药监总局中的企业详情数据_Python涛哥

    今日作业 爬取药监总局中的企业详情数据 爬取药监总局中的企业详情数据 url http scxk nmpa gov cn 81 xk 需求 将首页中每一家企业详情页对应的数据 每一家企业详情页对应的数据 将前5页企业的数据爬取即可 难点 用
  • scipy.sparse使用简例

    CDIMC Net 1 中有个对整个数据集求 kNN 图的函数 get kNNgraph2 2 是用 dense 的 numpy ndarray 存的 空间复杂度 O n 2 O n 2