Skip to main content

使用 Eigen 在 C++ 中实现的用于 python 的快速 nnls 求解器

项目描述

fnnls特征

皮皮

fnnlsEigen 实现了快速非负约束最小二乘算法(fnnls,链接到文章)。该算法使用 Eigen ( Link ) 在 C++ 中实现,并且可以使用 Cython 接口从 Python 调用。

nnls 和 fnnls 算法

非负最小二乘算法解决了给定矩阵Z和向量的以下问题x

哪里d是解向量。

这个存储库中的 fnnls 算法针对中间稀疏矩阵进行了优化,并且比 SciPy 的大型矩阵的 nnls 算法快得多。

安装

$ python3 -m pip install fnnlsEigen

API

直接使用

fnnls 求解器同时接受np.float32np.float64精度;dtype通过fnnlsfnnlsf分别。

>>> import numpy as np
>>> import fnnlsEigen as fe

>>> Z = np.array([[1.0, 0.0], [0.0, 1.0], [0.5, 0.5]], dtype=np.float64)
>>> x = np.array([1.0, 1.0, 0.0], dtype=np.float64)
>>> d = fe.fnnls(Z, x)
>>> d
array([0.66666667, 0.66666667])

可选地,可以调整破坏容差 ( tolerance) 和最大迭代次数 ( max_iterations)。

    max_iterations : int
        Defaults to 3 * array_Z.shape[1].
    tolerance : float32 / float64
        Defaults to machine epsilon of float32 / float64 times #columns in the given matrix.

批量使用

在对求解器的调用之间,提供的矩阵是否应该Z变化很小或根本没有变化;Z.transpose() * Z由于该产品价格昂贵,因此可以通过缓存产品来提高性能。提供了两个类(float32 / float64)以启用 Z.transpose() * Z产品的内存映射:

CachePreComputeNNLS
>>> import numpy as np
>>> import fnnlsEigen as fe

>>> pc = fe.CachePreComputeNNLS()

>>> Z = np.abs(np.random.rand(500, 1000))

>>> for _ in range(0, 100):
>>>     x = np.abs(np.random.rand(500))
>>>     d = pc.fnnls(Z, x)

贡献

从 github 克隆项目。创建一个主题分支并为该分支发出拉取请求。等待审核。

设置 - Linux

在 Linux 平台上,环境可以很容易的设置如下(进入克隆目录后):

$ ./install_setup.sh

这将创建一个虚拟环境并安装 python 依赖项。

启用环境:

$ source env.sh

编译项目:

$ make build

可以通过以下方式访问测试和样式检查:

$ make test

$ make check

设置 - Windows

Windows shell 脚本和设置环境是一个受欢迎的贡献。

项目详情


下载文件

下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。

源分布

fnnlsEigen-1.0.1.tar.gz (1.0 MB 查看哈希

已上传 source

内置发行版

fnnlsEigen-1.0.1-cp38-cp38-manylinux_2_24_x86_64.whl (3.8 MB 查看哈希

已上传 cp38

fnnlsEigen-1.0.1-cp37-cp37m-win_amd64.whl (81.1 kB 查看哈希

已上传 cp37