[数学]齐次线性方程组的解、SVD、最小二乘法

转自:http://blog.csdn.net/dsbatigol/article/details/9625211

 

AX=0
这是一个齐次线性方程组(一般的非齐次线性方程组AX=b其实也都可以化为齐次方程组的形式,所以比较普遍)

先要说明在非齐次方程组中,A到底有没有解析解,可以由增广矩阵来判断:
  • r(A)<r(A | b) 方程组无解;
  • r(A)=r(A | b) =n,方程组有唯一解;
  • r(A)=r(A | b) <n,方程组无穷解;
  • r(A)>r(A | b) 不可能,因为增广矩阵的秩大于等于系数矩阵的秩(在矩阵中加入一列,其秩只可能增大,不可能变小)。

而在齐次方程中(r(A | b) =r(A | 0)=r(A) ),根据A来分,只剩下了两种情况:

1.r(A)=未知数个数n(约束较强)
   1.1.
A是方阵
         由克莱姆法则可知:
         如果A是n*n的方阵而且r(A)=n,那么该方程组有唯一的零解。
   1.2.A不是方阵,A是m×n的(m>n)
         由另一个定理:齐次线性方程解空间维数 = n - r(A) 可知,该解空间维数为0, 也就是说该解空间只含有零向量。

2.r(A)<未知数个数n(约束不够)
这里A是不是方阵已经无所谓了,也没有什么法则可以用,就只分成一种情况。
由齐次线性方程组解空间维数 = n - r(A) >0,所以该齐次线性方程组有非零解,而且不唯一(自由度为 n - r(A))。

(多谢wereineky指出错误)
在我们做一些实际问题的时候,经常在 1.2(当然严格来说1.1也有可能啦)会卡住,这时实际上是没有真正的非零解析解的,因为约束太多了,没法都满足(零向量除外)。但是可以折中一下,每一个方程都满足个大概,这就要求最小二乘解。求取最小二乘解的方法一般使用SVD,即奇异值分解。

解空间维数与r(A)的关系的感性认识:
r(A)可以理解为一种约束条件的强弱的表现(约束的强弱不只是表面上的方程个数)。比如有一个方程组,每个方程都是一样的,那么其秩为1,方程的个数对约束毫无贡献。
继续看A的秩,也就是约束的个数是怎么影响解空间的维数的。
比如
x1 +   x2 +  x3 = 0
x1 + 2x2 + 3x3 = 0
r(A)=2,消去x1之后得到:
 x2 + 2x3 = 0
x2或者x3一旦确定,其余的未知量就都随之确定了,所以自由度为1,所以解空间维数为1。
即:
如果 r(A)=c,那么c个方程一共最多可以消去c-1个未知数(比如满秩方阵,最后只留一个未知数,得到唯一解),于是得到的方程由n-(c-1)个未知数组成,该方程有 n-c个自由度,也就是说解空间的维数为 n-c。
上述过程在高斯消去法中表现:
假设消去过后的A如下:
x     x      x      x      x
0     x      x      x      x
0     0      x      x      x
0     0      0      x      x
0     0      0      0      0
那么最后一个非全0行的x个数为 num = n-r(A)+1,则可以看到,该行的自由度,决定了所有解的自由度(因为一旦改行确定,其他都确定了,自由区其实可以理解为用将多少变量固定,就能够确定整个矩阵),而该行的自由度=num-1=n-r(A)=齐次线性方程组解空间的维数,Bingo!

SVD与最小二乘解:
SVD:奇异值分解,是在A不为方阵时的对特征值分解的一种拓展。奇异值和特征值的重要意义相似,都是为了提取出矩阵的主要特征。
对于齐次线性方程 A*X =0;当A的秩大于列数时,就需要求解最小二乘解,在||X||=1的约束下,其最小二乘解为矩阵A'A最小特征值所对应的特征向量。

假设x为A'A的特征向量的情况下,为什么是最小的特征值对应的x能够是目标函数最小证明(多谢hukexin0000指出错误,这个约束太强,只能提供一点点感性认识,具体的证明请查阅相关教科书):
齐次线性方程组的最小二乘问题可以写成如下:
min ||Ax||
s.t    ||x||=1
目标函数:||Ax|| = x'A'Ax = x'lamda x=lamda||x||=lamda,其中lamda是A'A的特征值。
于是可知,得到了A'A的最小特征值,就得到了最优值,而其最小特征值对应的特征向量就是最优解.
而对M进行SVD分解(*表示共轭转置):
M^{*} M = V \Sigma^{*} U^{*}\, U \Sigma V^{*} =V (\Sigma^{*} \Sigma) V^{*}\,
M M^{*} = U \Sigma V^{*} \, V \Sigma^{*} U^{*} =U (\Sigma \Sigma^{*}) U^{*}\,
可见M*M的特征向量就是V的列向量。

求解:
求解方法有两种(matlab):
1. 
[V D] =eig(A'*A);D为A'*A的特征值对角矩阵,V为对应的特征向量。找到最小特征值对应的V中的特征向量即为最小二乘解。
2.
 使用SVD分解矩阵A,[U S V] = svd(A); U 由 A*A'的特征向量组成,V 由 A'*A的特征向量组成,因此,奇异值矩阵S中最小的奇异值对应的V中的奇异向量即为最小二乘解。
对于超定方程(非齐次线性方程的一种)的最小二乘解的情况。A*X =b ; 
当A的行数大于列数时,方程组无解,就需要求解最小二乘解。在matlab中使用一个左除命令就可以得到最小二乘意义下的解。这个解没有模制的限制,就是实际的解。matlab:A\b

两种方法其实是一个意思。

推荐资料:
这篇资料还是很不错的,讲述了SVD与PCA的关系,其中的推荐资料也很不错。

机器学习中的数学(5)-强大的矩阵奇异值分解(SVD)及其应用

 
相关资源:
http://blog.csdn.net/zhangchaoyangsun/article/details/8470267  并行计算奇异值分解--Jacobi旋转

 

  • 5
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行答!
提供的源码资源涵盖了小程序应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行答!
### 回答1: 在Java中,我们可以使用最小二乘法决方程组问题。最小二乘法是一种通过最小化残差平方和来估计方程组的未知参数的方法。 要使用最小二乘法决方程组问题,首先需要定义一个线性模型。线性模型可以表示为Y = Xβ+ε,其中Y是观测值向量,X是设计矩阵,β是未知参数向量,ε是误差向量。 在Java中,我们可以使用矩阵运算库(如Apache Commons Math库)来进行矩阵计算。首先,我们需要构造设计矩阵X和观测向量Y。然后,使用最小二乘法来估计参数向量β。 在估计参数向量β时,可以使用最小二乘法的公式:β = (XTX)-1XTY。这个公式通过矩阵的转置、乘法和逆运算来计算参数向量β。 下面是一个使用Java实现的示例代码: ```java import org.apache.commons.math3.linear.MatrixUtils; import org.apache.commons.math3.linear.RealMatrix; import org.apache.commons.math3.linear.RealVector; import org.apache.commons.math3.linear.SingularValueDecomposition; public class LeastSquaresSolver { public static void main(String[] args) { // 构造设计矩阵X RealMatrix X = MatrixUtils.createRealMatrix(new double[][] {{1, 2}, {3, 4}, {5, 6}}); // 构造观测向量Y RealVector Y = MatrixUtils.createRealVector(new double[] {3, 4, 5}); // 使用最小二乘法估计参数向量β RealMatrix X_T = X.transpose(); RealMatrix X_T_X = X_T.multiply(X); SingularValueDecomposition svd = new SingularValueDecomposition(X_T_X); RealMatrix X_T_X_inv = svd.getSolver().getInverse(); RealMatrix beta = X_T_X_inv.multiply(X_T).multiply(Y); // 输出参数向量β for (int i = 0; i < beta.getRowDimension(); i++) { System.out.println("beta" + i + " = " + beta.getEntry(i, 0)); } } } ``` 通过这段代码,我们可以得到参数向量β的估计值。输出结果示例:beta0 = 1.1666666666666687,beta1 = 0.833333333333334。 这样,我们就使用最小二乘法成功决了方程组问题。请注意,实际应用中可能需要更复杂的设计矩阵和观测向量,以及更多的未知参数。这只是一个简单示例来说明如何在Java中使用最小二乘法决方程组问题。 ### 回答2: 在Java中,实现最小二乘法方程组通常可以通过矩阵运算和最小二乘法数学推导来实现。 首先,我们需要将方程组转化为矩阵形式。对于形如Ax=b的方程组,其中A为系数矩阵,x为未知变量向量,b为常数向量,我们可以通过最小二乘法x的近似。 在Java中,我们可以使用矩阵库(如Apache Commons Math)来处理矩阵运算。首先,定义矩阵A和向量b,并初始化它们的值。 然后,我们可以使用最小二乘法的公式来计算x的近似最小二乘法的求过程可通过以下步骤进行: 1. 计算A的转置矩阵AT。 2. 计算矩阵ATA = AT * A。 3. 计算向量ATb = AT * b。 4. 对ATA进行LU分 (LU分是一种常用的矩阵分方法,可以将方程组的求转化为矩阵的法问题)。 5. 使用LU分结果求方程组,得到x的近似。 最后,我们可以将近似打印出来或者进行其他处理。 总之,通过使用Java中的矩阵运算库,以及最小二乘法数学方法,我们可以实现在Java中求方程组的最小二乘法。 ### 回答3: 最小二乘法是一种数学优化方法,用于决方程组一致性问题。在Java语言中,我们可以使用矩阵运算库(如Apache Commons Math)来实现最小二乘法方程组。 首先,我们需要构建一个矩阵A和一个向量b来表示方程组的系数矩阵和常数向量。 然后,我们可以使用最小二乘法的公式来计算最优x。公式如下: x = (A^T * A)^-1 * A^T * b 其中,A^T表示A的转置,^-1表示矩阵的逆运算。 在Java中,我们可以使用以下代码来实现最小二乘法方程组: ```java import org.apache.commons.math3.linear.MatrixUtils; import org.apache.commons.math3.linear.RealMatrix; import org.apache.commons.math3.linear.RealVector; import org.apache.commons.math3.linear.SingularValueDecomposition; public class LeastSquaresSolver { public static void main(String[] args) { // 构建系数矩阵A和常数向量b RealMatrix A = MatrixUtils.createRealMatrix(new double[][]{{1, 2}, {3, 4}, {5, 6}}); RealVector b = MatrixUtils.createRealVector(new double[]{10, 20, 30}); // 计算最优x SingularValueDecomposition svd = new SingularValueDecomposition(A); RealMatrix U = svd.getU(); RealMatrix S = svd.getS(); RealMatrix V = svd.getVT(); RealMatrix X = V.multiply(S.scalarMultiply(1 / S.getEntry(0, 0))).multiply(U.transpose()).multiply(b); RealVector x = X.getColumnVector(0); // 打印最优x System.out.println("最优x: " + x); } } ``` 在上述代码中,我们使用了Apache Commons Math库中的MatrixUtils类来构建矩阵和向量,并使用了SingularValueDecomposition类来进行奇异值分,从而得到最优x。最后,我们将结果打印输出。 通过以上代码,我们可以在Java中使用最小二乘法决方程组问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值