Eigen学习之简单线性方程与矩阵分解

  Eigen提供了解线性方程的计算方法,包括LU分解法,QR分解法,SVD(奇异值分解)、特征值分解等。对于一般形式如下的线性系统:

        

  解决上述方程的方式一般是将矩阵A进行分解,当然最基本的方法是高斯消元法。

  先来看Eigen 官方的第一个例程:

 1 #include <iostream>
 2 #include <Eigen/Dense>
 3
 4 using namespace std;
 5 using namespace Eigen;
 6
 7 int main()
 8 {
 9     Matrix3f A;
10     Vector3f b;
11     A << 1,2,3, 4,5,6, 7,8,10;
12     b << 3,3,4;
13     cout<<"Here is the Matrix A:\n"<< A <<endl;
14     cout<<" Here is the vector b:\n"<< b <<endl;
15     Vector3f x = A.colPivHouseholderQr().solve(b);
16     cout<<"The solution is:\n"<<x<<endl;
17     return 0;
18 }

运行结果如下:

Eigen内置的解线性方程组的算法如下表所示:

使用这些接口也可以解决矩阵相乘的问题:

 1 #include <iostream>
 2 #include <Eigen/Dense>
 3
 4 using namespace std;
 5 using namespace Eigen;
 6
 7 int main()
 8 {
 9     Matrix2f A,b;
10     A << 2,-1,-1,3;
11     b << 1,2,3,1;
12     cout<<"Here is the matrix A:\n"<<A<<endl;
13     cout<<"Here is the right hand side b:\n"<<b<<endl;
14     Matrix2f x = A.ldlt().solve(b);
15     cout<<"The solution is:\n"<<x<<endl;
16     return 0;
17 }

运行结果如下:

Eigen也提供了计算特征值和特征向量的算法:

下面是一个简单的例子:

 1 #include <iostream>
 2 #include <Eigen/Dense>
 3
 4 using namespace std;
 5 using namespace Eigen;
 6
 7 int main()
 8 {
 9     Matrix2f A;
10     A << 1,2,2,3;
11     cout<<"Here is the matrix A:\n"<<A<<endl;
12     SelfAdjointEigenSolver<Matrix2f> eigensolver(A);
13     if( eigensolver.info() != Success ) abort();
14     cout<<" The eigenvalues of A are:\n"<<eigensolver.eigenvalues()<<endl;
15     cout<<" Here is a matrix whose columns are eigenvectors of A\n"
16         <<" corresponding to these eigenvalues:\n"
17         <<eigensolver.eigenvectors()<<endl;
18     return 0;
19 }

运行结果如下:

Eigen 也提供了求逆矩阵和求矩阵行列式的算法,但是这两种算法对于大型矩阵来说都是非常不经济的算法,当需要对大型矩阵做这种的操作时,需要自己判断到底需不需这样做。但是对于小型矩阵 则可以没有顾虑地使用。

下面是一个例子:

 1 #include <iostream>
 2 #include <Eigen/Dense>
 3
 4 using namespace std;
 5 using namespace Eigen;
 6
 7 int main()
 8 {
 9     Matrix3f A;
10     A << 1,2,1,
11          2,1,0,
12          -1,1,2;
13
14     cout<<"Here is the matrix A:\n"<<A<<endl;
15     cout<<"The determinant of A is "<<A.determinant()<<endl;
16     cout<<"The inverse of A is:\n"<<A.inverse()<<endl;
17     return 0;
18 }

运行结果如下:

Eigen也提供了解最小二乘问题的解法,并给出两种实现,分别是BDCSVD和JacobiSVD,其中推荐使用的一种是BDCSVD。下面是一个例子:

 1 #include <iostream>
 2 #include <Eigen/Dense>
 3
 4 using namespace std;
 5 using namespace Eigen;
 6
 7 int main()
 8 {
 9     MatrixXf A = MatrixXf::Random(3,2);
10     cout<<"Here is the matrix A:\n"<<A<<endl;
11     VectorXf b = VectorXf::Random(3);
12     cout<<"Here is the right hand side b:\n"<<b<<endl;
13     cout<<"The least-squares solution is:\n"
14         <<A.bdcSvd(ComputeThinU|ComputeThinV).solve(b)<<endl;
15     return 0;
16 }

运行结果如下:

原文地址:https://www.cnblogs.com/wangxiaoyong/p/8977343.html

时间: 2024-11-01 21:53:03

Eigen学习之简单线性方程与矩阵分解的相关文章

简单的基于矩阵分解的推荐算法-PMF, NMF

介绍: 推荐系统中最为主流与经典的技术之一是协同过滤技术(Collaborative Filtering),它是基于这样的假设:用户如果在过去对某些项目产生过兴趣,那么将来他很可能依然对其保持热忱.其中协同过滤技术又可根据是否采用了机器学习思想建模的不同划分为基于内存的协同过滤(Memory-based CF)与基于模型的协同过滤技术(Model-based CF).其中基于模型的协同过滤技术中尤为矩阵分解(Matrix Factorization)技术最为普遍和流行,因为它的可扩展性极好并且易

用Spark学习矩阵分解推荐算法

在矩阵分解在协同过滤推荐算法中的应用中,我们对矩阵分解在推荐算法中的应用原理做了总结,这里我们就从实践的角度来用Spark学习矩阵分解推荐算法. 1. Spark推荐算法概述 在Spark MLlib中,推荐算法这块只实现了基于矩阵分解的协同过滤推荐算法.而基于的算法是FunkSVD算法,即将m个用户和n个物品对应的评分矩阵M分解为两个低维的矩阵:$$M_{m \times n}=P_{m \times k}^TQ_{k \times n}$$ 其中k为分解成低维的维数,一般远比m和n小.如果大

推荐系统中的矩阵分解演变方式

推荐算法主要分为基于内容的算法和协同过滤. 协同过滤的两种基本方法是基于邻居的方法(基于内容/物品的协同过滤)和隐语义模型. 矩阵分解乃是实现隐语义模型的基石. 矩阵分解根据用户对物品的评分, 推断出用户和物品的隐语义向量, 然后根据用户和物品的隐语义向量来进行推荐. 推荐系统用到的数据可以有显式评分和隐式评分. 显式评分时用户对物品的打分, 显式评分矩阵通常非常稀疏. 隐式评分是指用户的浏览, 购买, 搜索等历史记录, 表示的是用户行为的有无, 所以是一个密集矩阵. 1. 基本矩阵分解 矩阵分

矩阵分解在推荐系统中的应用

矩阵分解是最近几年比较火的算法,经过kddcup和netflix比赛的多人多次检验,矩阵分解可以带来更好的结果,而且可以充分地考虑各种因素的影响,有非常好的扩展性,因为要考虑多种因素的综合作用,往往需要构造cost function来将矩阵分解问题转化为优化问题,根据要考虑的因素为优化问题添加constraints,然后通过迭代的方法进行矩阵分解,原来评分矩阵中的missing vlaue可以通过分解后得到的矩阵求的. 本文将简单介绍下最近学习到的矩阵分解方法. (1)PureSvd 怎么评价这

矩阵分解在协同过滤推荐算法中的应用

在协同过滤推荐算法总结中,我们讲到了用矩阵分解做协同过滤是广泛使用的方法,这里就对矩阵分解在协同过滤推荐算法中的应用做一个总结.(过年前最后一篇!祝大家新年快乐!明年的目标是写120篇机器学习,深度学习和NLP相关的文章) 1. 矩阵分解用于推荐算法要解决的问题 在推荐系统中,我们常常遇到的问题是这样的,我们有很多用户和物品,也有少部分用户对少部分物品的评分,我们希望预测目标用户对其他未评分物品的评分,进而将评分高的物品推荐给目标用户.比如下面的用户物品评分表: 用户\物品 物品1 物品2 物品

推荐系统的各个矩阵分解模型1

推荐系统的各个矩阵分解模型 1. SVD 当然提到矩阵分解,人们首先想到的是数学中经典的SVD(奇异值)分解,直接上公式: $$ M_{m \times n}=U_{m \times k} \Sigma_{k \times k} V_{k \times n}^{T} $$ 原理和流程 当然SVD分解的形式为3个矩阵相乘 左右两个矩阵分别表示用户/项目隐含因子矩阵 中间矩阵为奇异值矩阵并且是对角矩阵,每个元素满足非负性,并且逐渐减小 目的 推荐好 计算得到三个矩阵 左右两个矩阵分别表示用户/项目隐

推荐系统的各个矩阵分解模型

# 推荐系统的各个矩阵分解模型 ## 1. SVD 当然提到矩阵分解,人们首先想到的是数学中经典的SVD(奇异值)分解,直接上公式:$$M_{m \times n}=U_{m \times k} \Sigma_{k \times k} V_{k \times n}^{T}$$ - 原理和流程 - 当然SVD分解的形式为3个矩阵相乘 - 左右两个矩阵分别表示用户/项目隐含因子矩阵 - 中间矩阵为奇异值矩阵并且是对角矩阵,每个元素满足非负性,并且逐渐减小- 目的 - 推荐好 - 计算得到三个矩阵 -

LFM矩阵分解,java实现

关于LFM分解理论和python实现见https://www.cnblogs.com/little-horse/p/12489619.html. 以下是java简单实现,完整程序见https://github.com/jiangnanboy/RecomSys/blob/master/src/main/java/com/sy/zhihai/model/LFM.java,数据https://github.com/jiangnanboy/RecomSys/tree/master/src/main/re

矩阵分解

矩阵分解在推荐系统中的应用 浅谈矩阵分解在推荐系统中的应用 SVD在推荐系统中的应用 用于推荐系统的一种矩阵分解库:LibMF 基于矩阵分解的推荐算法,简单入门 - kobeshow