- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我想为具有 n
行和 d
列的数据矩阵 X
计算 RBF 或“高斯”内核。得到的方核矩阵由下式给出:
K[i,j] = var * exp(-gamma * ||X[i] - X[j]||^2)
var
和 gamma
是标量。
在 python 中执行此操作的最快方法是什么?
最佳答案
我将介绍四种不同的方法来计算这种内核,然后比较它们的运行时间。
在这里,我使用了 ||x-y||^2 = ||x||^2 + ||y||^2 - 2 * x^T * y
这一事实。
import numpy as np
X_norm = np.sum(X ** 2, axis = -1)
K = var * np.exp(-gamma * (X_norm[:,None] + X_norm[None,:] - 2 * np.dot(X, X.T)))
numexpr
是一个 python 包,允许对 numpy 数组进行高效和并行的数组操作。我们可以按如下方式使用它来执行与上面相同的计算:
import numpy as np
import numexpr as ne
X_norm = np.sum(X ** 2, axis = -1)
K = ne.evaluate('v * exp(-g * (A + B - 2 * C))', {
'A' : X_norm[:,None],
'B' : X_norm[None,:],
'C' : np.dot(X, X.T),
'g' : gamma,
'v' : var
})
scipy.spatial.distance.pdist
我们也可以使用 scipy.spatial.distance.pdist
要计算成对平方欧氏距离的非冗余数组,请计算该数组上的内核,然后将其转换为方矩阵:
import numpy as np
from scipy.spatial.distance import pdist, squareform
K = squareform(var * np.exp(-gamma * pdist(X, 'sqeuclidean')))
K[np.arange(K.shape[0]), np.arange(K.shape[1])] = var
sklearn.metrics.pairwise.rbf_kernel
sklearn
提供了一个 built-in method直接计算 RBF 内核:
import numpy as np
from sklearn.metrics.pairwise import rbf_kernel
K = var * rbf_kernel(X, gamma = gamma)
我使用 25,000 个 512 维的随机样本进行测试,并在 Intel Core i7-7700HQ(4 核 @ 2.8 GHz)上进行实验。更准确地说:
X = np.random.randn(25000, 512)
gamma = 0.01
var = 5.0
每种方法运行 7 次,并报告每次执行时间的平均值和标准差。
| Method | Time |
|-------------------------------------|-------------------|
| numpy | 24.2 s ± 1.06 s |
| numexpr | 8.89 s ± 314 ms |
| scipy.spatial.distance.pdist | 2min 59s ± 312 ms |
| sklearn.metrics.pairwise.rbf_kernel | 13.9 s ± 757 ms |
首先,scipy.spatial.distance.pdist
出奇地慢。
numexpr
几乎比纯 numpy
方法快 3 倍,但这个加速因子会随着可用 CPU 的数量而变化。
sklearn.metrics.pairwise.rbf_kernel
不是最快的方法,但只比 numexpr
慢一点。
关于python - 在 python 中计算 RBF 内核的最快方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47271662/
我想应用 RBF 神经网络来教授我的系统。我有一个带有输入的系统: | 1 2 3 4 5 6 ... 32 | 33 | | 1000 0001 001
我是数据科学领域的新手,我知道如何使用 sklearn 库以及如何自定义 RBF 内核,但我想从头开始实现 SVM-RBF 内核以用于学习目的以及如何在不使用的情况下手动实现拟合和预测sklearn
我正在使用 RBF 内核 matlab 函数。 在几个数据集上,随着我继续增加 sigma 值,支持向量的数量增加并且准确性增加。 而在一个数据集的情况下,当我增加 sigma 值时,支持向量会减少并
我想实现一个 RBFN 并在 StackOverflow 上找到了这段代码。虽然我明白一些代码,但我不明白什么 gamma , kwargs ,以及整个 call功能。 有人可以向我解释一下吗? fr
非常类似于RBF interpolation fails: LinAlgError: singular matrix但我认为问题不同,因为我没有重复的坐标。 玩具示例: import numpy as
我正在尝试寻找以高斯函数作为径向基函数的神经网络代码。我想使用反向传播学习规则。 我拥有所有数据,所以我只需要 RBF 神经网络。谢谢! 最佳答案 Encog 库(C# 和 Java)具有以下功能:
我想问一下 SVM 上的 RBF 内核。 在 sklearn 的文档中:http://scikit-learn.org/stable/modules/generated/sklearn.svm.SVR
我正在使用 sklearn.svm.SVC (kernel='rbf') 对图像数据进行分类,效果很好。线性 SVM 通过在两个类之间放置一个超平面来对数据进行分类。在 rbf SVM 的情况下,平面
使用 RBF 进行插值时出现一些错误。这是一维的示例。我认为这与我的 y 值彼此之间的接近程度有关。有什么办法可以解决这个问题吗? import numpy as np from scipy.inte
我有类似这个问题的答案分别是这个问题的答案:RBF interpolation: LinAlgError: singular matrix 但是我想用rbf做概率分布。 到目前为止我的代码: from
当我使用 SVM 的 trainAuto 方法时,我得到 getKernelType() 的值 2 但是当我在我的代码中使用 RBF 时,它训练我的文件并输出 XML 文件。 svm = cv2.ml
当我执行下面的代码时 import matplotlib.pyplot as plt import numpy as np from scipy.interpolate import Rbf x_co
如果给我训练数据集和未标记的数据集,Matlab 的 RBF 核矩阵算法是什么? 最佳答案 这应该是您要查找的内容。它取自 here % With Fast Computation of the RB
我对 svm 分类有点陌生。我正在尝试使用 opencv svm 分类器进行一些人脸识别。输入特征参数是归一化的局部二进制模式。所以所有的值都是从0-1。我首先尝试使用线性核来训练分类器,然后使用训练
我想为我的非线性可分离数据实现 SVM RBF 内核。我将我的内核定义为: def rbf(va, vb): gamma = 0.7 return exp(-gamma * linal
如何在 Neupy 或 Theano 中实现自定义激活函数(通过梯度下降调整均值和方差的 RBF 核)以在 Neupy 中使用。 {快速背景:梯度下降适用于网络中的每个参数。我想创建一个专门的特征空间
from sklearn.model_selection import GridSearchCV from sklearn import svm params_svm = {
我想像这里一样用 rbf 函数绘制一些点以获得点的密度分布: 如果我运行下面的代码,它工作正常: from scipy.interpolate.rbf import Rbf # radial bas
我在 3 维空间中有几个数据点 (x, y, z) 并使用 scipy.interpolate.Rbf 对它们进行插值。这给了我一个很好地代表 3D 对象表面的样条线。我现在想确定几个具有相同的任意
我使用 scipy.interpolate 插值数据集,它给出了热图(z 值作为 x、y 的函数): rbf = scipy.interpolate.Rbf(x, y, z, function='cu
我是一名优秀的程序员,十分优秀!