天道酬勤,学无止境

matrix-factorization

使用 Eigen 分解稀疏矩阵时避免动态内存分配(Avoiding dynamic memory allocation on factorizing sparse matrix with Eigen)

问题 在我的应用程序中,除了类构造函数之外,我需要避免动态内存分配(类似 malloc)。 我有一个稀疏的半定矩阵 M,其元素在程序执行期间会发生变化,但它保持固定的稀疏模式。 为了尽可能快地求解许多线性系统 M * x = b,想法是在我的类构造函数中使用原位分解,如原位矩阵分解中所述,然后在 M 发生变化时调用factorize方法: struct MyClass { private: SparseMatrix<double> As_; SimplicialLDLT<Ref<SparseMatrix<double>>> solver_; public: /** Constructor */ MyClass( const SparseMatrix<double> &As ) : As_( As ) , solver_( As_ ) // Inplace decomposition {} void assign( const SparseMatrix<double> &As_new ) { // Here As_new has the same sparsity pattern of As_ solver_.factorize( As_new ); } void solve( const VectorXd &b, VectorXd &x ) { x = solver_.solve(

2021-10-26 19:12:57    分类:技术分享    c++   sparse-matrix   eigen   eigen3   matrix-factorization

Vowpal Wabbit:无法从经过训练的 --rank 模型中使用 gd_mf_weights 检索潜在因素(Vowpal Wabbit: Cannot retrieve latent factors with gd_mf_weights from a trained --rank model)

问题 我在 movielens 数据上训练了一个等级为 40 的模型,但无法使用 gd_mf_weights 从训练后的模型中检索权重。 我正在遵循 VW 矩阵分解示例中的语法,但它给了我错误。 请指教。 模型训练调用: vw --rank 40 -q ui --l2 0.1 --learning_rate 0.015 --decay_learning_rate 0.97 --power_t 0 --passes 50 --cache_file movielens.cache -f movielens.reg -d train.vw 权重生成调用: library/gd_mf_weights -I train.vw -O '/data/home/mlteam/notebooks/Recommenders-master/notebooks/Outputs/movielens' --vwparams '-q ui --rank 40 -i movielens.reg' 错误: WARNING: model file has set of {-q, --cubic, --interactions} settings stored, but they'll be OVERRIDEN by set of {-q, --cubic, --interactions} settings from

2021-10-24 17:46:56    分类:技术分享    machine-learning   vowpalwabbit   matrix-factorization

Avoiding dynamic memory allocation on factorizing sparse matrix with Eigen

In my application I need to avoid dynamic memory allocation (malloc like) except in the class constructors. I have a sparse semidefinite matrix M whose elements change during the program execution but it mantains a fixed sparsity pattern. In order to solve many linear systems M * x = b as fast as possible, the idea is to use inplace decomposition in my class constructor as described in Inplace matrix decompositions, then call factorize method whenever M changes: struct MyClass { private: SparseMatrix<double> As_; SimplicialLDLT<Ref<SparseMatrix<double>>> solver_; public: /** Constructor */

2021-10-23 02:15:48    分类:问答    c++   sparse-matrix   eigen   eigen3   matrix-factorization

Vowpal Wabbit: Cannot retrieve latent factors with gd_mf_weights from a trained --rank model

I trained a rank 40 model on the movielens data, but cannot retrieve the weights from the trained model with gd_mf_weights. I'm following the syntax from the VW matrix factorization example but it is giving me errors. Please advise. Model training call: vw --rank 40 -q ui --l2 0.1 --learning_rate 0.015 --decay_learning_rate 0.97 --power_t 0 --passes 50 --cache_file movielens.cache -f movielens.reg -d train.vw Weights generating call: library/gd_mf_weights -I train.vw -O '/data/home/mlteam/notebooks/Recommenders-master/notebooks/Outputs/movielens' --vwparams '-q ui --rank 40 -i movielens.reg'

2021-10-22 10:36:24    分类:问答    machine-learning   vowpalwabbit   matrix-factorization

Julia:将 CHOLMOD 因子转换为稀疏矩阵并再次返回(Julia: converting CHOLMOD factor to sparse matrix and back again)

问题 我有一个稀疏矩阵H的 CHOLMOD 分解,我想编辑上、下和块对角线因子的稀疏表示。 我怎样才能做到这一点? 当我运行下面的时,最后一行不起作用。 H = sprand(10,10,0.5) fac = ldltfact(H; shift=0.0) fD = fac[:D] D = Base.SparseArrays.CHOLMOD.Sparse(fD) 有没有什么办法可以从稀疏矩阵到CHOLMOD.factor的相反方向? 回答1 提取ldltfact的相关分解矩阵可能有点乏味。 以下示例显示了一个与问题中的示例类似的示例,其中最终测试是提取的矩阵恢复了原始分解矩阵: srand(1) pre = sprand(10,10,0.5) H = pre + pre' + speye(10,10) fac = ldltfact(H; shift=0.0) P = sparse(1:size(H,1),fac[:p],ones(size(H,1))) LD = sparse(fac[:LD]) # this matrix contains both D and L embedded in it L = copy(LD) for i=1:size(L,1) L[i,i] = 1.0 end D = sparse(1:size(L,1),1:size(L,1),diag(LD))

2021-10-21 08:46:25    分类:技术分享    julia   sparse-matrix   matrix-factorization   suitesparse

非常大和非常稀疏的非负矩阵分解(Very Large and Very Sparse Non Negative Matrix factorization)

问题 我有一个非常大且稀疏的矩阵(531K x 315K),总单元数约为 1670 亿。 非零值仅为 1。 非零值的总数约为 45K。 有没有有效的 NMF 包来解决我的问题? 我知道有几个包,它们只适用于小规模的数据矩阵。 任何想法都有帮助。 提前致谢。 回答1 scikit-learn 可以轻松解决这个问题! 代码: from time import perf_counter as pc import numpy as np import scipy.sparse as sps from sklearn.decomposition import NMF """ Create sparse data """ nnz_i, nnz_j, nnz_val = np.random.choice(531000, size=45000), \ np.random.choice(315000, size=45000), \ np.random.random(size=45000) X = sps.csr_matrix((nnz_val, (nnz_i, nnz_j)), shape=(531000, 315000)) print('X-shape: ', X.shape, ' X nnzs: ', X.nnz) print('type(X): ', type(X)) # <class

2021-10-20 10:53:48    分类:技术分享    python   bigdata   sparse-matrix   matrix-factorization   nmf

评估 LightFM 推荐模型(Evaluating the LightFM Recommendation Model)

问题 我一直在玩 lightfm 很长一段时间,发现生成推荐非常有用。 但是,我想知道两个主要问题。 在推荐排名很重要的情况下评估 LightFM 模型,我是否应该更多地依赖precision@k或其他提供的评估指标(例如AUC score ? 与其他指标相比,在什么情况下我应该专注于提高我的precision@k ? 或者它们是否高度相关? 这意味着如果我设法提高我的precision@k分数,其他指标也会随之而来,我对吗? 如果使用WARP损失函数训练的模型的precision@5得分为 0.089,您将如何解释? AFAIK,Precision at 5 告诉我前 5 个结果中有多少是正面/相关的。 这意味着如果我的预测无法进入前 5 名,我将获得 0 precision@5或者如果我在前 5 名中只有一个预测正确,我将获得 0.2。但我无法解释 0.0xx 对precision@n意味着什么 谢谢 回答1 Precision@K 和 AUC 衡量不同的东西,并为您提供有关模型质量的不同观点。 一般来说,它们应该是相关的,但了解它们的不同之处可能有助于您选择对您的应用更重要的那个。 Precision@K 衡量 K 个排名最高的项目中正项目的比例。 因此,它非常关注列表顶部的排名质量:只要前 K 个项目大多是正面的,其余排名的好坏并不重要。 如果您只打算向用户显示列表的最顶部

2021-10-16 10:35:38    分类:技术分享    python   machine-learning   recommendation-engine   matrix-factorization

我的相关矩阵的 Cholesky 分解失败(Cholesky decomposition failure for my correlation matrix)

问题 我正在尝试使用chol()来找到下面相关矩阵的 Cholesky 分解。 是否有我可以使用该功能的最大尺寸? 我问是因为我得到以下信息: d <-chol(corrMat) Error in chol.default(corrMat) : the leading minor of order 61 is not positive definite 但是,我可以毫无问题地将其分解为少于 60 个元素(即使它包含原始的第 61 个元素): > d <-chol(corrMat[10:69, 10:69]) > d <-chol(corrMat[10:70, 10:70]) Error in chol.default(corrMat[10:70, 10:70]) : the leading minor of order 61 is not positive definite 这是矩阵: https://drive.google.com/open?id=0B0F1yWDNKi2vNkJHMDVHLWh4WjA 回答1 问题不是大小,而是数字排名! d <- chol(corrMat, pivot = TRUE) dim(corrMat) #[1] 72 72 attr(d, "rank") #[1] 62 corrMat不是正定的。 普通的 Cholesky 分解将失败

2021-10-10 03:21:13    分类:技术分享    r   matrix   matrix-factorization   matrix-decomposition

在 TensorFlow 中使用 coo_matrix(Use coo_matrix in TensorFlow)

问题 我正在 TensorFlow 中进行矩阵分解,我想使用 Spicy.sparse 中的 coo_matrix,因为它使用更少的内存,并且可以轻松地将我的所有数据放入我的矩阵中以进行训练数据。 是否可以使用 coo_matrix 在 tensorflow 中初始化变量? 或者我是否必须创建一个会话并使用 sess.run() 和 feed_dict 将我获得的数据提供给 tensorflow。 我希望您理解我的问题和我的问题,否则请发表评论,我会尽力解决。 回答1 TensorFlow 最接近 scipy.sparse.coo_matrix 的是 tf.SparseTensor,它是 tf.Tensor 的稀疏等效项。 将coo_matrix输入您的程序可能是最简单的。 tf.SparseTensor是 COO 矩阵的轻微泛化,其中张量表示为三个密集的tf.Tensor对象: indices :一个N X D的矩阵tf.int64 ,其中每行代表一个非零值的坐标值。 N是非零的数量, D是等效密集张量的秩(矩阵情况下为 2)。 values :一个长度为N的值向量,其中元素i是其坐标在indices第i行上给出的元素的值。 dense_shape :一个长度- D的矢量tf.int64 ,表示等效密张量的形状。 例如,可以使用下面的代码,它使用tf.sparse

2021-10-09 18:53:11    分类:技术分享    tensorflow   sparse-matrix   matrix-factorization

非负矩阵分解中的评级预测(Rating prediction in non negative matrix factorization)

问题 我正在关注这个博客 http://www.quuxlabs.com/blog/2010/09/matrix-factorization-a-simple-tutorial-and-implementation-in-python/(也在此处附上矩阵)进行评分预测使用矩阵分解。 最初我们有一个稀疏的用户电影矩阵 R 。 然后我们应用 MF 算法来创建一个新的矩阵 R',它是 2 个矩阵 P(UxK) 和 Q(DxK) 的乘积。 然后我们“最小化” R 和 R' 中给出的值的误差。到目前为止一切顺利。 但在最后一步,当矩阵被填满时,我不太相信这些是用户会给出的预测值。 这是最终的矩阵: 证明这些实际上是“预测”评级的依据是什么? 另外,我计划使用 P 矩阵 (UxK) 作为用户的潜在特征。 我们能否以某种方式“证明”这些实际上是用户的潜在特征? 回答1 使用为每个用户获得的向量作为潜在特征向量的理由是,使用这些潜在潜在特征的值将最小化预测评分与实际已知评分之间的误差。 如果您查看您发布的两个图表中的预测评分和已知评分,您会发现两个矩阵中的两个矩阵之间的差异非常小。 示例:U1D4 在第一个图表中为 1,在第二个图表中为 0.98。 由于特征或用户潜在特征向量在已知评分上产生了良好的结果,我们认为它可以很好地预测未知评分。 当然,我们使用正则化来避免过度拟合训练数据

2021-10-08 21:08:54    分类:技术分享    data-science   collaborative-filtering   matrix-factorization