Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >python中快速逆平方根对向量的规范化

python中快速逆平方根对向量的规范化
EN

Stack Overflow用户
提问于 2022-06-18 09:12:43
回答 3查看 312关注 0票数 3

我想把向量归一化。最简单的方法就是

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import numpy as np
v = np.random.rand(3)
v /= np.linalg.norm(v)

但是我担心我的包的性能和平方(不可避免的)之和,取平方根,然后除以所有向量不是一个好主意。

然后我进入了这个问题,哪个解决方案使用sklearn.preprocessing.normalize来完成它。不幸的是,它为我的包增加了另一个需求/依赖。

这就是问题所在。

  1. 难道不应该有一个numpy函数来这样做吗?它使用快速逆平方根算法。还是它超出了numpy的范围,不应该有这样的函数?
  2. 我应该在cython/numba中实现自己的函数吗?
  3. 或者,如果我如此担心性能,我应该放弃python,开始用C/C++编写代码吗?
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-06-18 16:19:26

难道不应该有一个矮胖的函数来这样做吗?该算法采用快速逆平方根算法。或者是超出了numpy的范围,而不应该有这样的函数?

我不知道在Numpy中有什么功能能做到这一点。纯Numpy中需要多个函数调用。sklearn.preprocessing.normalize确实是一个很好的选择(而且AFAIK并不是唯一提供该功能的包)。

问题是,Numpy的设计并不是为了高效地计算小数组。对于小型数组(比如只有3个值),Numpy调用的开销很大。将多个函数调用组合在一起只会使情况更糟。造成这种开销的主要原因是类型/形状/值检查、内部函数调用、CPython解释器以及新数组的分配。因此,即使Numpy提供了您想要的函数,对于一个只有3项的数组来说,它也会很慢。

我应该在cython/numba中实现我的函数吗?

,这是一个很好的主意,,因为Numba可以用更小的开销来完成这个任务。注意,Numba函数调用的开销仍然很小,但是从Numba上下文调用它们非常便宜(本机调用)。

例如,您可以使用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# Note:
# - The signature cause an eager compilation
# - ::1 means the axis is contiguous (generate a faster code)
@nb.njit('(float64[::1],)')
def normalize(v):
    s = 0.0
    for i in range(v.size):
        s += v[i] * v[i]
    inv_norm = 1.0 / np.sqrt(s)
    for i in range(v.size):
        v[i] *= inv_norm

此函数不分配任何新数组,因为它可以就地工作。此外,Numba只能在包装功能中进行最小数量的检查。循环非常快,但是如果你用实际的大小代替v.size,它们可以变得更快。3)因为JIT可以展开循环并生成几乎最优的代码。np.sqrt将被内联,它应该生成一个快速平方根FP指令.如果使用标志fastmath=True,JIT甚至可以使用x86-64平台上的专用快速指令计算倒数平方根(请注意,如果您使用NaN之类的特殊值或关心FP的结合性,则fastmath是不安全的)。尽管如此,在主流机器上调用此函数的开销可能是100到300 ns,用于非常小的向量: CPython包装函数有很大的开销。删除它的唯一解决方案是在调用方函数中使用Numba/Cython。如果您需要在大多数项目中使用它们,那么直接编写C/C++代码当然更好。

或者,如果我如此担心性能,我应该放弃python,开始用C/C++编写代码吗?

--它取决于您的整个项目,但是您想要操作许多这样的小向量,直接使用C/C++要有效得多。另一种方法是将Numba或Cython用于当前速度较慢的内核。

优化良好的Numba代码或Cython代码的性能可以非常接近于本地编译的C/C++代码。例如,我成功地用Numba一次超过了经过高度优化的OpenBLAS代码(多亏了专门化)。Numba中开销的主要来源之一是数组绑定检查(通常可以针对循环进行优化)。C/C++是较低级别的,所以您不支付任何隐藏成本,但代码可能更难维护。此外,您还可以应用Numba/Cython中甚至不可能实现的低级优化(例如。直接使用SIMD内部指令或装配指令,生成带有模板的专用代码)。

票数 2
EN

Stack Overflow用户

发布于 2022-06-18 09:37:52

您可以获得的最佳解决方案是O(2n)的时间复杂度,它不是非常有效,而是线性的。下一步的办法如下:

1-首先计算向量的大小及其数值逆,这不可避免地会导致线性时间复杂度,而不管编程语言的性能如何。在此之前,我们有一个O(n)算法。

2-向量的所有分量与原向量的计算逆幅相乘,从而使其归一化。当我们再次遍历整个列表时,我们在算法的复杂性中添加了另一个O(n)项。最后,我们将这些时间复杂度项加起来,得到了O(n)+O(n)=O(2n)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import numpy as np
v = np.random.rand(3)
mod = (sum([i**2 for i in v]))**-0.5
print(v, mod)
v *= mod
print(v)

然而,这似乎不需要高度的优化和效率。不过,我会再看一看,以找出一个更好的方法来处理这个问题。也许其他编程资源,如递归或高级数据结构,可以稍微减少其运行时间。

票数 1
EN

Stack Overflow用户

发布于 2022-06-18 09:37:36

正如@mkrieger1 1所写的,首先编写代码,然后测试性能是否适合您的工作。如果没有,请开始尝试上述解决方案,并比较设备上的差异。通常,在代码上运行的硬件可能会对性能差异产生影响。这意味着并非所有库最终都优于其他所有设备。

如果您真的想全部执行,我建议并行执行您的代码。最终甚至在GPU上。您可以为此使用pytorch,也可以用C和CUDA (或类似的)编写代码,以最大限度地利用系统。然而,重要的是,总结这些要素也必须并行进行。

最后,如果您坚持使用python,请看一下python 11,因为这个版本在某些方面提高了python的性能。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72671213

复制
相关文章
简单理解向量对向量的求导
人生的跑道上,有人用心欣赏风景,有人努力让自己成为风景。人人都希望追求到美好,其实美好就是无止境的追求。
触摸壹缕阳光
2020/05/22
3.1K0
Python中的向量化编程
在Andrew Ng的<< Machine Learning >>课程中,多次强调了使用向量化的形式进行编码,在深度学习课程中,甚至给出了编程原则:尽可能避免使用for循环而采用向量化形式。该课程采用的是matlab/octave语言,所擅长的方向正是数值计算,语言本身内置了对矩阵/向量的支持,比如:
云水木石
2019/07/01
2.2K0
平方根倒数快速算法
单位向量时需要用到平方根倒数,而计算单位向量在游戏引擎中会大量使用,属于底层代码,因此其效率将会直接影响游戏体验。
DearXuan
2022/01/19
9440
平方根倒数快速算法
深度学习中的规范化
这篇文章介绍深度学习四种主流的规范化, 分别是Batch Normalization(BN[9]), Layer Normalization(LN[7]), Instance Normalization(IN[8])以及Group Normalization(GN[2])。
努力努力再努力F
2019/04/18
8660
深度学习中的规范化
Python中求数字的平方根和平方的几种
方法一: 使用内置模块 >>> import math >>> math.pow(12, 2) # 求平方 144.0 >>> math.sqrt(144) # 求平方根 12.0 >>> 方法二: 使用表达式 >>> 12 ** 2 # 求平方 144 >>> 144 ** 0.5 # 求平方根 12.0 >>> 方法三: 使用内置函数 >>> pow(12, 2) # 求平方 144 >>> pow(144, .
py3study
2020/01/09
2.1K0
矩阵求逆的快速算法[通俗易懂]
作者:龚敏敏
全栈程序员站长
2022/11/16
1.6K0
快速学习-JPA中的多对多
比如A同学,它是我的学生,其中有个身份就是学生,还是家里的孩子,那么他还有个身份是子女。
cwl_java
2020/04/01
1.6K0
快速学习-JPA中的多对多
Python使用numpy计算矩阵特征值、特征向量与逆矩阵
Python扩展库numpy.linalg的eig()函数可以用来计算矩阵的特征值与特征向量,而numpy.linalg.inv()函数用来计算可逆矩阵的逆矩阵。 >>> import numpy as np >>> x = np.matrix([[1,2,3], [4,5,6], [7,8,9]]) # 计算矩阵特征值与特征向量 >>> e, v = np.linalg.eig(x) # 根据特征值和特征向量得到原矩阵 >>> y = v * np.diag(e) * np.linalg.inv(v) >
Python小屋屋主
2018/04/16
10.1K0
python|对Python中函数的学习
在python中,定义一个函数需要使用def语句,依次写出函数名,括号,括号中的参数和冒号:,接着在缩进后编写函数,函数的返回值用return语句返回。定义函数的时候,我们把参数的名字和位置确定下来,函数的接口定义就完成了。对于函数的调用者来说,只需要知道如何传递正确的参数,以及函数将返回什么样的值就够了,函数内部的复杂逻辑被封装起来,调用者无需了解。Python的函数定义非常简单,但灵活度却非常大。除了正常定义的必选参数外,还可以使用默认参数、可变参数和关键字参数,使得函数定义出来的接口,不但能处理复杂的参数,还可以简化调用者的代码。
算法与编程之美
2019/12/16
6440
机器学习中的矩阵向量求导(五) 矩阵对矩阵的求导
    在矩阵向量求导前4篇文章中,我们主要讨论了标量对向量矩阵的求导,以及向量对向量的求导。本文我们就讨论下之前没有涉及到的矩阵对矩阵的求导,还有矩阵对向量,向量对矩阵求导这几种形式的求导方法。
刘建平Pinard
2019/05/31
3.1K0
快速理解 TypeScript 的逆变和协变
深入学习 TypeScript 类型系统的话,逆变、协变、双向协变、不变是绕不过去的概念。
神说要有光zxg
2022/06/06
1.8K1
快速理解 TypeScript 的逆变和协变
快速学习-JPA中的一对多
在一对多关系中,我们习惯把一的一方称之为主表,把多的一方称之为从表。在数据库中建立一对多的关系,需要使用数据库的外键约束。
cwl_java
2020/04/02
1.9K0
python求逆矩阵的方法,Python 如何求矩阵的逆「建议收藏」
kernel = np.array([1, 1, 1, 2]).reshape((2, 2))
全栈程序员站长
2022/09/25
5.5K0
python求逆矩阵的方法,Python 如何求矩阵的逆「建议收藏」
Python快速实战机器学习(5) 支持向量机
机器学习是如今人工智能时代背景下一个重要的领域。这个“Python快速实战机器学习”系列,用Python代码实践机器学习里面的算法,旨在理论和实践同时进行,快速掌握知识。
HuangWeiAI
2019/11/07
4910
Python快速实战机器学习(5) 支持向量机
用python实现支持向量机对婚介数据的用户配对预测
网上有人用libsvm2.89在Python2.6成功。(一定要libsvm2.89搭配python2.6,其他版本都不能成功,我就是浪费了大量时间在这里!) python 搭建libsvm方法。python版本和libsvm版本匹配很重要! 两步: 1.将libsvm-2.89\windows\python目录下的svmc.pyd文件复制到C:\Python26\DLLs; 2.将libsvm-2.89\python目录下的svm.py放到C:\Python26\Lib目录里。 from svm impo
机器学习AI算法工程
2018/03/14
1.3K0
用python实现支持向量机对婚介数据的用户配对预测
使用numpy对矩阵进行求逆
昨晚算一道线性代数的题目的时候,算了半天,答案错了。验算了一下,觉得错误应该是出在矩阵求逆的地方。但是真的求逆太慢了,(主要是头晕),那怎么办呢?
灯珑LoGin
2022/10/31
7930
Numpy 中的矩阵求逆
1. 矩阵求逆import numpy as npa = np.array([[1, 2], [3, 4]]) # 初始化一个非奇异矩阵(数组)print(np.linalg.inv(a)) # 对应于MATLAB中 inv() 函数# 矩阵对象可以通过 .I 更方便的求逆A = np.matrix(a)print(A.I)2. 矩阵求伪逆import numpy as np# 定义一个奇异阵 AA = np.zeros((4, 4))A[0, -1] = 1A[-1, 0] = -1A = np.m
狼啸风云
2020/12/29
4.9K0
机器学习算法中的向量机算法(Python代码)
掌握机器学习算法并不是一个不可能完成的事情。大多数的初学者都是从学习回归开始的。是因为回归易于学习和使用,但这能够解决我们全部的问题吗?当然不行!因为,你要学习的机器学习算法不仅仅只有回归!
商业新知
2019/06/28
1.5K0
机器学习算法中的向量机算法(Python代码)
学习笔记DL004:标量、向量、矩阵、张量,矩阵、向量相乘,单位矩阵、逆矩阵
利炳根
2017/11/20
2.8K0
【向量检索研究系列】快速入门
随着互联网的不断发展,产生了各种各样的海量数据,比如图片、文本、视频和语音等非结构化数据,这些数据可以通过人工智能技术提取出特征向量,然后通过对这些特征向量的计算和检索来实现对非结构化数据的分析和检索,如何对非结构化的向量数据进行高效检索即为向量检索技术的核心问题。
码之有理
2022/06/30
3.2K4
【向量检索研究系列】快速入门

相似问题

理解快速逆平方根中的指针语法

30

无平方根空间向量的规范化

13

逆平方根本质

12

python中的快速图像规范化

10

iPhone上最快逆平方根

24
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文