当前位置: 首页 > 面试题库 >

如何在numpy中有效地计算高斯核矩阵?

孙阳旭
2023-03-14
问题内容
def GaussianMatrix(X,sigma):
    row,col=X.shape
    GassMatrix=np.zeros(shape=(row,row))
    X=np.asarray(X)
    i=0
    for v_i in X:
        j=0
        for v_j in X:
            GassMatrix[i,j]=Gaussian(v_i.T,v_j.T,sigma)
            j+=1
        i+=1
    return GassMatrix
def Gaussian(x,z,sigma):
    return np.exp((-(np.linalg.norm(x-z)**2))/(2*sigma**2))

这是我目前的方式。有什么办法可以使用矩阵运算吗?X是数据点。


问题答案:

您是否要使用高斯核进行图像平滑?如果是这样,则gaussian_filter()scipy中有一个函数:

更新的答案

这应该可以工作-
尽管仍不能100%准确,但它会尝试考虑网格每个像元内的概率质量。我认为在每个像元的中点使用概率密度的准确性稍差,尤其是对于小内核。有关示例,请参见https://homepages.inf.ed.ac.uk/rbf/HIPR2/gsmooth.htm。

import numpy as np
import scipy.stats as st

def gkern(kernlen=21, nsig=3):
    """Returns a 2D Gaussian kernel."""

    x = np.linspace(-nsig, nsig, kernlen+1)
    kern1d = np.diff(st.norm.cdf(x))
    kern2d = np.outer(kern1d, kern1d)
    return kern2d/kern2d.sum()

通过链接在图3的示例中对其进行测试:

gkern(5, 2.5)*273

array([[ 1.0278445 ,  4.10018648,  6.49510362,  4.10018648,  1.0278445 ],
       [ 4.10018648, 16.35610171, 25.90969361, 16.35610171,  4.10018648],
       [ 6.49510362, 25.90969361, 41.0435344 , 25.90969361,  6.49510362],
       [ 4.10018648, 16.35610171, 25.90969361, 16.35610171,  4.10018648],
       [ 1.0278445 ,  4.10018648,  6.49510362,  4.10018648,  1.0278445 ]])

下面接受的原始(接受)答案是错误的 。平方根是不必要的,并且间隔的定义不正确。

import numpy as np
import scipy.stats as st

def gkern(kernlen=21, nsig=3):
    """Returns a 2D Gaussian kernel array."""

    interval = (2*nsig+1.)/(kernlen)
    x = np.linspace(-nsig-interval/2., nsig+interval/2., kernlen+1)
    kern1d = np.diff(st.norm.cdf(x))
    kernel_raw = np.sqrt(np.outer(kern1d, kern1d))
    kernel = kernel_raw/kernel_raw.sum()
    return kernel


 类似资料:
  • 问题内容: 我在二维空间中有一组点,需要计算每个点到另一个点的距离。 我的点数相对较少,最多不超过100个。但是,由于我需要经常快速地确定这些移动点之间的关系,并且因为我知道遍历这些点可能同样糟糕由于O(n ^ 2)的复杂性,我正在寻找利用numpy矩阵魔术(或scipy)的方法。 就象我的代码中所说的那样,每个对象的坐标都存储在其类中。但是,当我更新类坐标时,也可以用numpy数组更新它们。 我

  • 问题内容: 假设我有以下由四行三列组成的2D numpy数组: 生成包含所有列之和的一维数组的有效方法是什么(如)?无需遍历所有列就能做到这一点吗? 问题答案: 请查看的文档,特别注意该参数。汇总列: 或者,总结行: 其他聚合函数一样,并且,例如,也采取了参数。 从暂定NumPy的教程: 许多一元运算(例如计算数组中所有元素的总和)都作为该类的方法实现。默认情况下,这些操作适用于数组,就好像它是数

  • 问题内容: 在MATLAB中,您可以使用函数来计算矩阵的Jordan范式。 在NumPy和SciPy中有可用的等效功能吗? 问题答案: MATLAB jordan函数来自Symbolic Math Toolbox,因此从SymPy库中获取Python替代品似乎并不合理。具体来说,该类具有method 。创建sympy矩阵时,可以将numpy数组作为参数传递。例如,以下摘自Jordan标准格式的Wi

  • 我想计算一个二次形式:朱莉娅中的。 对于这种情况,最有效的计算方法是什么: 没有假设 是对称的 和是相同的() 和都是对称的 我知道朱莉娅有。但是我想知道它是否比BLAS呼叫更快。

  • 我现在正在研究一个 c 代码库,它使用矩阵库来计算各种东西。其中一件事是计算矩阵的逆。它使用高斯消除来实现这一点。但结果非常不准确。如此之多,以至于将逆矩阵与原始矩阵相乘甚至不会接近单位矩阵。 下面是用于计算逆矩阵的代码,矩阵以数字类型以及行和列为模板: 现在我已经做了一个单元测试,使用预先计算的值来测试逆是否正确。我尝试了两个矩阵,一个3x3,一个4x4。我用这个网站来计算逆:https://m

  • 正如您所看到的,瓶颈是由3个循环给出的,这些循环使应用程序变慢;此外,对本体的每一类都执行计算分离过程。 是否有更有效的方法来获得不交点,并检查公理是否被断言或派生?