getrow() 的 Scipy 稀疏矩阵替代方案

2023-12-28

我正在处理大型稀疏二进制矩阵。我已经用它们压缩了Scipy稀疏矩阵的实现。的计算Jaccard distance from scipy.spatial.distance不支持稀疏矩阵上的直接运算,因此:

  1. 将整个稀疏矩阵转换为稠密矩阵,然后将每一行作为向量进行操作,即内存饥饿

    or

  2. 循环稀疏,使用抓取每一行getrow()并进行操作。

    or

  3. 编写我们自己的实现来处理稀疏矩阵。

为了直观地说明问题,这里是示例代码:

import scipy.spatial.distance as d
import numpy as np
from scipy.sparse import csr_matrix

# benchmark performance 
X = np.random.random((3000, 3000))
# binarize
X[X > 0.3] = 0
X[X>0] = 1
mat =  csr_matrix(X)

a = np.zeros(3000)
a[4] = a[100] = a[22] =1
a = csr_matrix(a)

def jaccard_fast(v1,v2):
    common = v1.dot(v2.T)
    dis = (v1 != v2).getnnz()
    if common[0,0]:
        return 1.0-float(common[0,0])/float(common[0,0]+dis)
    else:
        return 0.0
    
def benchmark_jaccard_fast():
    for i in range(mat.shape[0]):
        jaccard_fast(mat.getrow(i),a)
        
def benchmark_jaccard_internal_todense():
    for v1,v2 in zip(mat.todense(),a.todense()):
         d.jaccard(v1,v2)
        
def benchmark_jaccard_internal_getrow():
    for i in range(mat.shape[0]):
        d.jaccard(mat.getrow(i),a)
        

print "Jaccard Fast:"
%time benchmark_jaccard_fast()
print "Jaccard Scipy (expanding to dense):"
%time benchmark_jaccard_internal_todense()
print "Jaccard Scipy (using getrow):"
%time benchmark_jaccard_internal_getrow()

where jaccard_fast是我自己的实现。然而,在 scipy 稀疏矩阵上,我的实现似乎比内部实现更快getrow()似乎减慢了我的实施速度。当我进行基准测试时jaccard_fast反对scipy.spatial.distance.jaccard,结果是:

Jaccard Fast:
CPU times: user 1.28 s, sys: 0 ns, total: 1.28 s
Wall time: 1.28 s
Jaccard Scipy (expanding to dense):
CPU times: user 28 ms, sys: 8 ms, total: 36 ms
Wall time: 37.2 ms
Jaccard Scipy (using getrow):
CPU times: user 1.82 s, sys: 0 ns, total: 1.82 s
Wall time: 1.81 s

有关如何避免的任何帮助getrow瓶颈将不胜感激。我无法使用扩展我的稀疏矩阵todense()由于内存限制。


稀疏索引以速度较慢而闻名,例如如何更快地读取/遍历/切片 Scipy 稀疏矩阵(LIL、CSR、COO、DOK)? https://stackoverflow.com/questions/37013115/how-to-read-traverse-slice-scipy-sparse-matrices-lil-csr-coo-dok-faster/37015740#37015740

In [33]: timeit for row in mat: x=row  # sparse iteration
1 loops, best of 3: 510 ms per loop

In [35]: timeit for row in mat.todense(): x=row  # dense iteration
10 loops, best of 3: 175 ms per loop

但我发现你的d.jacard使用稀疏矩阵时也更慢

In [36]: ad=a.todense()

In [37]: timeit for row in mat.todense(): d.jaccard(row,ad) # all dense
1 loops, best of 3: 734 ms per loop

In [38]: timeit for row in mat: d.jaccard(row.todense(),ad) # inner dense
1 loops, best of 3: 1.69 s per loop

In [39]: timeit for row in mat: d.jaccard(row,a) # all sparse
1 loops, best of 3: 4.61 s per loop

消除getrow factor

In [40]: mrow=mat.getrow(0)

In [41]: mrowd=mrow.todense()

In [42]: timeit d.jaccard(mrow, a)  # one sparse row
1000 loops, best of 3: 1.32 ms per loop

In [43]: timeit d.jaccard(mrow.todense(), a.todense())  # with conversion
1000 loops, best of 3: 539 µs per loop

In [44]: timeit d.jaccard(mrowd, ad)  #  dense
10000 loops, best of 3: 173 µs per loop

=====================

我需要重新运行这些测试,因为d.jaccard不适用于稀疏(并且jaccard_fast不适用于密集)。因此,将稀疏行迭代问题与jaccard计算将需要更多的工作。

我已经重做了jaccard_fast a bit:

def my_jaccard(mat, a):
    common = mat*a.T # sparse does the large matrix product well 
    dis=np.array([(row!=a).getnnz() for row in mat]) # iterative
    cA = common.A.ravel()
    return 1 - cA/(cA + dis)

它返回匹配的值d.jaccard在密集的行上运行。d.jaccard回报1对于其中的行common是 0。我似乎不需要cA测试(除非两者都可能cA and dis在同一槽位均为 0)。

In [141]: r=np.array([d.jaccard(row,ad) for row in mat.todense()])

In [142]: r1=my_jaccard(mat,a)

In [143]: np.allclose(r,r1)
Out[143]: True

而且速度只有一半。如果我可以重做discalc 应该有类似的速度。

In [144]: timeit r=np.array([d.jaccard(row,ad) for row in mat.todense()])
1 loops, best of 3: 783 ms per loop

In [145]: timeit r1=my_jaccard(mat,a)
1 loops, best of 3: 1.29 s per loop

对计算的进一步调整。我掩盖了common值为 0。这有 2 个目的 - 它确保我们不会出现除以 0 的问题,并且减少了dis迭代,速度略有提高。

def my_jaccard(mat, a):
    common=mat*a.T
    cA = common.A.ravel()
    mask = cA!=0
    cA = cA[mask]
    dis = np.array([(row!=a).getnnz() for row, b in zip(mat,mask) if b])
    ret = np.ones(mat.shape[0])
    ret[mask] = 1 - cA/(cA+dis)
    return ret

这样时间就减少了一点。

In [188]: timeit my_jaccard(mat,a)
1 loops, best of 3: 1.04 s per loop

=================

问题有重叠Python - 具有 scipy 稀疏矩阵的高效函数 https://stackoverflow.com/questions/37056258/python-efficient-function-with-scipy-sparse-matrices

在那个问题中,我研究了稀疏矩阵与 1 行矩阵的比较,发现使用sparse.kron复制行,是最快的复制方法numpy广播。

使用这个想法jaccard来计算dis array

def my_jaccard1(mat, a):
    common = mat*a.T
    cA = common.A.ravel()
    aM = sparse.kron(a,np.ones((mat.shape[0],1),int))
    dis = (mat!=aM).sum(1)
    ret = 1-cA/(cA+dis.A1)
    return ret    

这样,时间显着改善(10 倍):

In [318]: timeit my_jaccard1(mat,a)
1 loops, best of 3: 97.1 ms per loop

我可以像以前一样应用屏蔽来防止被零除;但它实际上减慢了计算速度(至 140 毫秒)。

def my_jaccard3(mat, a):
    common = mat*a.T
    cA = common.A.ravel()
    mask = cA!=0
    cA = cA[mask]
    aM = sparse.kron(a,np.ones((len(cA),1),int))
    dis = (mat[mask,:]!=aM).sum(1)
    ret = np.ones(mat.shape[0])
    ret[mask] = 1 - cA/(cA+dis.A1) 
    return ret  

=======================

编辑-疑似病例的测试

In [75]: x,y= np.array([1,1,0,0,1,0]), np.array([0,0,1,0,1,0])

In [76]: d.jaccard(x,y)
Out[76]: 0.75

In [78]: jaccard_fast(sparse.csr_matrix(x),sparse.csr_matrix(y))
Out[78]: 0.75

我的版本:

In [79]: my_jaccard(sparse.csr_matrix(x),sparse.csr_matrix(y))
Out[79]: array([ 0.75])
...
In [82]: my_jaccard3(sparse.csr_matrix(x),sparse.csr_matrix(y))
Out[82]: array([ 0.75])

(编辑-明确使用sparse.kron)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

getrow() 的 Scipy 稀疏矩阵替代方案 的相关文章

  • 无法“安装”plpython3u - postgresql

    我正在尝试在 postgresql 中使用 python 语言 像这样的事情 create or replace function test a integer returns integer as if a 2 0 return even
  • 通过 Scrapy 抓取 Google Analytics

    我一直在尝试使用 Scrapy 从 Google Analytics 获取一些数据 尽管我是一个完全的 Python 新手 但我已经取得了一些进展 我现在可以通过 Scrapy 登录 Google Analytics 但我需要发出 AJAX
  • 使用带有关键字参数的 map() 函数

    这是我尝试使用的循环map功能于 volume ids 1 2 3 4 5 ip 172 12 13 122 for volume id in volume ids my function volume id ip ip 我有办法做到这一点
  • 使用 matplotlib 绘制时间序列数据并仅在年初显示年份

    rcParams date autoformatter month b n Y 我正在使用 matpltolib 来绘制时间序列 如果我按上述方式设置 rcParams 则生成的图会在每个刻度处标记月份名称和年份 我怎样才能将其设置为仅在每
  • Flask 会话变量

    我正在用 Flask 编写一个小型网络应用程序 当两个用户 在同一网络下 尝试使用应用程序时 我遇到会话变量问题 这是代码 import os from flask import Flask request render template
  • 是否可以忽略一行的pyright检查?

    我需要忽略一行的pyright 检查 有什么特别的评论吗 def create slog group SLogGroup data Optional dict None SLog insert one SLog group group da
  • 基于代理的模拟:性能问题:Python vs NetLogo & Repast

    我正在 Python 3 中复制一小段 Sugarscape 代理模拟模型 我发现我的代码的性能比 NetLogo 慢约 3 倍 这可能是我的代码的问题 还是Python的固有限制 显然 这只是代码的一个片段 但 Python 却花费了三分
  • OpenCV 无法从 MacBook Pro iSight 捕获

    几天后 我无法再从 opencv 应用程序内部打开我的 iSight 相机 cap cv2 VideoCapture 0 返回 并且cap isOpened 回报true 然而 cap grab 刚刚返回false 有任何想法吗 示例代码
  • 如何使用 OpencV 从 Firebase 读取图像?

    有没有使用 OpenCV 从 Firebase 读取图像的想法 或者我必须先下载图片 然后从本地文件夹执行 cv imread 功能 有什么办法我可以使用cv imread link of picture from firebase 您可以
  • AWS EMR Spark Python 日志记录

    我正在 AWS EMR 上运行一个非常简单的 Spark 作业 但似乎无法从我的脚本中获取任何日志输出 我尝试过打印到 stderr from pyspark import SparkContext import sys if name m
  • 绘制方程

    我正在尝试创建一个函数 它将绘制我告诉它的任何公式 import numpy as np import matplotlib pyplot as plt def graph formula x range x np array x rang
  • 从 Flask 访问 Heroku 变量

    我已经使用以下命令在 Heroku 配置中设置了数据库变量 heroku config add server xxx xxx xxx xxx heroku config add user userName heroku config add
  • Pandas:merge_asof() 对多行求和/不重复

    我正在处理两个数据集 每个数据集具有不同的关联日期 我想合并它们 但因为日期不完全匹配 我相信merge asof 是最好的方法 然而 有两件事发生merge asof 不理想的 数字重复 数字丢失 以下代码是一个示例 df a pd Da
  • Jupyter Notebook 内核一直很忙

    我已经安装了 anaconda 并且 python 在 Spyder IPython 等中工作正常 但是我无法运行 python 笔记本 内核被创建 它也连接 但它始终显示黑圈忙碌符号 防火墙或防病毒软件没有问题 我尝试过禁用两者 我也无法
  • Fabric env.roledefs 未按预期运行

    On the 面料网站 http docs fabfile org en 1 10 usage execution html 给出这个例子 from fabric api import env env roledefs web hosts
  • 如何在seaborn displot中使用hist_kws

    我想在同一图中用不同的颜色绘制直方图和 kde 线 我想为直方图设置绿色 为 kde 线设置蓝色 我设法弄清楚使用 line kws 来更改 kde 线条颜色 但 hist kws 不适用于显示 我尝试过使用 histplot 但我无法为
  • Scrapy:如何使用元在方法之间传递项目

    我是 scrapy 和 python 的新手 我试图将 parse quotes 中的项目 item author 传递给下一个解析方法 parse bio 我尝试了 request meta 和 response meta 方法 如 sc
  • 发送用户注册密码,django-allauth

    我在 django 应用程序上使用 django alluth 进行身份验证 注册 我需要创建一个自定义注册表单 其中只有一个字段 电子邮件 密码将在服务器上生成 这是我创建的表格 from django import forms from
  • Python 类继承 - 诡异的动作

    我观察到类继承有一个奇怪的效果 对于我正在处理的项目 我正在创建一个类来充当另一个模块的类的包装器 我正在使用第 3 方 aeidon 模块 用于操作字幕文件 但问题可能不太具体 以下是您通常如何使用该模块 project aeidon P
  • NotImplementedError:无法将符号张量 (lstm_2/strided_slice:0) 转换为 numpy 数组。时间

    张量流版本 2 3 1 numpy 版本 1 20 在代码下面 define model model Sequential model add LSTM 50 activation relu input shape n steps n fe

随机推荐

  • 数字输入 - 始终显示旋转按钮

    在谷歌浏览器中 input type number 旋转按钮仅在悬停时显示 这是我使用的代码
  • Azure 模拟器/IIS Express 和 SSL 客户端证书身份验证出现 web.config 错误

    在任何人感到困惑之前 这是为了IIS 快递 不是 IIS 我们有一个需要 SSL 客户端证书身份验证的 MVC5 应用程序 在开发过程中 它在 VS2013 中的 Azure 模拟器中运行 该模拟器在管理员权限下运行 针对端口 80 443
  • 是否有一个 JavaScript 库可以用来过滤 XSS 攻击的字符串?

    是否有类似 HTMLPurifier 等库的 Javascript 等效项 可以从字符串中删除 XSS 代码 一般来说 当 Javascript 代码运行时 要保护自己免受 XSS 攻击就为时已晚了 您需要在服务器而不是客户端防范它
  • “stoi”未在此范围内声明[重复]

    这个问题在这里已经有答案了 所以这个错误已经被解决了好几次 但没有答案对我有帮助 我在 Windows 10 上使用 Notepad 和 Cygwin 我的代码如下 来自Derek Banas 的 1 小时 C 教程 https www y
  • 如何以右对齐方式打印数字? [复制]

    这个问题在这里已经有答案了 所以我正在尝试一次代码评估的简单问题乘法表 https www codeeval com open challenges 23 其中一项要求是 数字右对齐并去掉前导 尾随空格 每行 我不确定如何做到这一点 我当前
  • 运行schedule时获取laravel环境

    我在 Laravel 5 时间表中设置了一些命令 输出存储在文件中并通过电子邮件发送给我 由于该项目有多个 副本 我想使用环境名称来区分电子邮件来自哪个副本 我尝试使用app gt environment 在时间表描述中 它抛出一个错误 F
  • ASP.NET MVC:视图引擎无法找到使用 MEF 加载的模型类型的视图

    我正在尝试创建一个框架 允许将控制器和视图动态导入到 MVC 应用程序中 到目前为止它的工作原理如下 我正在使用 NET 4 ASP NET MVC 3 RC 和 Razor ViewEngine 每个项目使用 MEF 导出和导入控制器 我
  • *最快*目录列表

    我有大量目录 我想尽快读取所有文件 我的意思是 不是 DirectoryInfo GetFiles 快 而是 从磁盘低级获取集群 快 当然 NET 2 0 c 类似的问题在这里 但这种方法没有任何好处 C 目录列出海量目录 https st
  • jQuery - 触发后面元素的点击事件

    我的问题是我有这个盒子又名容器 该容器内有用户可以单击的框 为了在视觉上帮助用户 我制作了带有灰色淡出颜色的覆盖框 这告诉他们可以使用这里的盒子 但我的问题是点击事件位于覆盖框后面的框上 那么有没有办法忽略一个元素的 click 并使用下一
  • Symfony2 中的 Doctrine2:如何查看哪个对象调用导致查询?

    我正在使用 Symfony2 和 Doctrine2 对于我的项目 我制作了具有不同关联映射的实体 首先 我确实看到了大约 7 个请求一个对象的查询 所以我决定进行 热切加载 并将其减少到三个查询 但其中两个在symfony工具栏 Prof
  • 通过 Node.js 使用 HTML 5 进行视频流传输

    我正在尝试设置一个 Web 服务器 该服务器支持使用 node js 将视频流式传输到 HTML5 视频标记 到目前为止 这是我的代码 var range request headers range var total file lengt
  • 如何仅针对特定规则抑制代码块内的检查样式检查? [复制]

    这个问题在这里已经有答案了 可能的重复 如何禁用特定代码行的特定检查样式规则 http stackoverflow com questions 4023185 how to disable a particular checkstyle r
  • 如何通过 XML 中的 id 删除节点元素?

    Using javax xml and org w3c public void removeNodeFromXML File xmlfile String uuid DocumentBuilderFactory factory Docume
  • Xamarin.iOS 在 Visual Studio 2019、2022 中找不到配置文件

    Visual Studio 2019 或 2022 无法识别 Xamarin iOS 的活动预配配置文件 我解决该问题的活动 删除了 Visual Studio 项目中的 bin 和 obj 文件夹 从此处删除了 Windows 上的旧配置
  • 如何从底部对齐 UILabel 文本?

    How the UILabel可以从底部对齐 假设我的标签可以容纳三行文本 如果输入文本是单行 那么这一行应该位于标签的底部 请参考下图以更好地理解 橙色区域是标签的全框 目前只有一行 居中对齐 所以我想要的是 无论有多少行 它都应该始终对
  • 如何在android中使用IntentService重新启动服务

    我能够停止我的 ServiceA 它开始使用AlarmManager 当IntentService正在通过发送广播来运行IntentService到广播接收器 我想在我之后再次启动相同的 ServiceAIntentService完成了他的
  • 如何在apexCharts上实现点击事件或数据点选择?

    我正在尝试使用apexChartsjavascript 库并在实现点击事件时遇到问题我已阅读文档 但没有关于如何实现它的明确示例 到目前为止我有这段代码 var options chart height 350 type bar plotO
  • 我如何在水豚中点击这个按钮

    请帮我解决水豚的这个问题 我在水豚中有一个这样的按钮
  • Idris 可以推断顶级常量类型中的索引吗?

    例如 Agda 允许我这样写 open import Data Vec open import Data Nat myVec Vec myVec 0 1 2 3 and myVec将有类型Vec 4正如预期的那样 但如果我在伊德里斯尝试同样
  • getrow() 的 Scipy 稀疏矩阵替代方案

    我正在处理大型稀疏二进制矩阵 我已经用它们压缩了Scipy稀疏矩阵的实现 的计算Jaccard distance from scipy spatial distance不支持稀疏矩阵上的直接运算 因此 将整个稀疏矩阵转换为稠密矩阵 然后将每