这是一个相当理论上的问题,但我对它很感兴趣,并且如果有人对他或她愿意分享的一些专业知识感到高兴.
我有一个具有2000行和600列的浮点矩阵,并希望从每行中减去列的平均值.我测试了以下两行并比较了它们的运行时间:
MatrixXf centered = data.rowwise() - (data.colwise().sum() / data.cols());
MatrixXf centered = data.rowwise() - data.colwise().mean();
Run Code Online (Sandbox Code Playgroud)
我想,mean()
除了将每列的总和除以行数之外不会做一些不同的事情,但是当我的计算机上第一行的执行需要12.3秒时,第二行在0.09秒内完成.
我正在使用Eigen version 3.2.6
,目前是最新版本,我的矩阵按行主要顺序存储.
有人知道一些内部因素Eigen
可以解释这种巨大的性能差异吗?
编辑:我应该补充说data
,上面的代码实际上是类型,Eigen::Map< Eigen::MatrixXf<Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor> >
并将Eigen的功能映射到原始缓冲区.
编辑2:根据GuyGreer的建议,我将提供一些示例代码来重现我的发现:
#include <iostream>
#include <chrono>
#include <Eigen/Core>
using namespace std;
using namespace std::chrono;
using namespace Eigen;
int main(int argc, char * argv[])
{
MatrixXf data(10000, 1000), centered;
data.setRandom();
auto start = high_resolution_clock::now();
if (argc > 1)
centered = data.rowwise() - data.colwise().mean();
else …
Run Code Online (Sandbox Code Playgroud) 我注意到使用Eigen库进行Cholesky分解时,性能存在显着差异。
我正在使用具有以下基准代码的最新版本的Eigen(3.2.1):
#include <iostream>
#include <chrono>
#include <Eigen/Core>
#include <Eigen/Cholesky>
using namespace std;
using namespace std::chrono;
using namespace Eigen;
int main()
{
const MatrixXd::Index size = 4200;
MatrixXd m = MatrixXd::Random(size, size);
m = (m + m.transpose()) / 2.0 + 10000 * MatrixXd::Identity(size, size);
LLT<MatrixXd> llt;
auto start = high_resolution_clock::now();
llt.compute(m);
if (llt.info() != Success)
cout << "Cholesky decomposition failed!" << endl;
auto stop = high_resolution_clock::now();
cout << "Cholesky decomposition in "
<< duration_cast<milliseconds>(stop - start).count()
<< " …
Run Code Online (Sandbox Code Playgroud) 我将liblinear与我的程序一起使用,以通过L2R_L2LOSS_SVC_DUAL
求解器执行多类分类。在当前的测试设置中,我有来自总共 9 个类的 1600 个实例,每个类有 1000 个特征。
我正在尝试通过 5 倍交叉验证确定用于训练的最佳 C 参数,但即使使用 1.0 liblinear 的小 C 也能达到最大迭代次数:
................................................................................
....................
optimization finished, #iter = 1000
WARNING: reaching max number of iterations
Using -s 2 may be faster (also see FAQ)
Objective value = -637.100923
nSV = 783
Run Code Online (Sandbox Code Playgroud)
该FAQ网站提到了这两个可能的原因:
L2R_L2LOSS_SVC
可能会更快。没有一个适用于我的情况。因为我的特征向量是某种直方图,所以有一个自然最大值,我用它来将特征缩放到 [0,1]。
我为 liblinear 设置了参数,如下所示:
struct parameter svmParams;
svmParams.solver_type = L2R_L2LOSS_SVC_DUAL;
svmParams.eps = 0.1;
svmParams.nr_weight = 0;
svmParams.weight_label = NULL; …
Run Code Online (Sandbox Code Playgroud) 我编写了一个调用的多线程模块fast_nn
,Cython
并使用以下内容编译它setup.py
:
from distutils.core import setup
from distutils.extension import Extension
from Cython.Build import cythonize
import numpy
setup(
ext_modules = cythonize([
Extension("fast_nn", ["fast_nn.pyx"], language = 'c++', extra_compile_args = ['-O3', '-fopenmp'], extra_link_args = ['-fopenmp'], include_dirs = [numpy.get_include()])
])
)
Run Code Online (Sandbox Code Playgroud)
另外,我使用了caffe
框架的python 绑定。
如果我单独或pycaffe
单独使用我的模块,一切都很好。但是,以下组合是有问题的:
import caffe.io
import fast_nn
Run Code Online (Sandbox Code Playgroud)
在一台机器上,它不会导致任何问题。在另一台机器上,我收到以下异常:
Traceback (most recent call last):
File "test.py", line 2, in <module>
import fast_nn
ImportError: dlopen: cannot load any more object with static TLS
Run Code Online (Sandbox Code Playgroud)
从这个线程我了解到有太多带有初始执行静态 …
我想为X
具有n
行和d
列的数据矩阵计算RBF或"高斯"内核.得到的方形核矩阵由下式给出:
K[i,j] = var * exp(-gamma * ||X[i] - X[j]||^2)
Run Code Online (Sandbox Code Playgroud)
var
并且gamma
是标量.
在python中执行此操作的最快方法是什么?
我正在使用 Eigen 3 的 Cholesky 模块来求解线性方程组。Eigen 文档指出,为此目的使用LDLT
而不是LLT
会更快,但我的基准测试显示了不同的结果。
我使用以下代码进行基准测试:
#include <iostream>
#include <chrono>
#include <Eigen/Core>
#include <Eigen/Cholesky>
using namespace std;
using namespace std::chrono;
using namespace Eigen;
int main()
{
MatrixXf cov = MatrixXf::Random(4200, 4200);
cov = (cov + cov.transpose()) + 1000 * MatrixXf::Identity(4200, 4200);
VectorXf b = VectorXf::Random(4200), r1, r2;
r1 = b;
LLT<MatrixXf> llt;
auto start = high_resolution_clock::now();
llt.compute(cov);
if (llt.info() != Success)
{
cout << "Error on LLT!" << endl;
return 1;
}
auto middle …
Run Code Online (Sandbox Code Playgroud)