使用MASS库 ginv() 计算任意矩阵的广义逆 (Moore-Penrose)

前面讲了矩阵的逆, 例如矩阵A的逆用Aˉ1表示, 使用solve(A)可与计算A的逆.

并且满足A %*% Aˉ1 == Aˉ1 %*% A  ==  diag(min(ncol(A), nrow(A)))  ==  Identity matrix

如下 : 

http://blog.163.com/digoal@126/blog/static/1638770402015312105227107/

并非所有的矩阵都有逆, 但是所有的矩阵都可有广义逆.

如果广义逆满足下列条件, n×m矩阵A+是矩阵A的Moore-Penrose逆:

用A+表示A的广义逆. 那么必须满足(后两个是对称性) : 

AA+A=A
A+AA+=A+
(AA+)T=AA+
(A+A)T=A+A

R中MASS包中的ginv()函数可以计算矩阵的Moore-Penrose逆. 例如:

> A=matrix(1:12,nrow=3,ncol=4)
> A
     [,1] [,2] [,3] [,4]
[1,]    1    4    7   10
[2,]    2    5    8   11
[3,]    3    6    9   12

使用solve只能计算正方矩阵的逆.

> solve(A)
Error in solve.default(A) : 'a' (3 x 4) must be square

需要用到MASS的ginv函数.

> library(MASS)
> ginv(A)
             [,1]        [,2]        [,3]
[1,] -0.483333333 -0.03333333  0.41666667
[2,] -0.244444444 -0.01111111  0.22222222
[3,] -0.005555556  0.01111111  0.02777778
[4,]  0.233333333  0.03333333 -0.16666667

验证 :

1. a %*% A %*% a = a

> a %*% A %*% a
             [,1]        [,2]        [,3]
[1,] -0.483333333 -0.03333333  0.41666667
[2,] -0.244444444 -0.01111111  0.22222222
[3,] -0.005555556  0.01111111  0.02777778
[4,]  0.233333333  0.03333333 -0.16666667
> a
             [,1]        [,2]        [,3]
[1,] -0.483333333 -0.03333333  0.41666667
[2,] -0.244444444 -0.01111111  0.22222222
[3,] -0.005555556  0.01111111  0.02777778
[4,]  0.233333333  0.03333333 -0.16666667
精度问题, 不能直接划等号
> (a %*% A %*% a) == a
      [,1]  [,2]  [,3]
[1,] FALSE FALSE FALSE
[2,] FALSE FALSE FALSE
[3,] FALSE FALSE FALSE
[4,] FALSE FALSE FALSE

2. A %*% a %*% A = A

> A %*% a %*% A
     [,1] [,2] [,3] [,4]
[1,]    1    4    7   10
[2,]    2    5    8   11
[3,]    3    6    9   12
> A
     [,1] [,2] [,3] [,4]
[1,]    1    4    7   10
[2,]    2    5    8   11
[3,]    3    6    9   12
精度问题, 不能直接划等号
> (A %*% a %*% A)  ==  A
      [,1]  [,2]  [,3]  [,4]
[1,] FALSE FALSE FALSE FALSE
[2,] FALSE FALSE FALSE FALSE
[3,] FALSE FALSE FALSE FALSE

3. 验证对称性

A %*% a == t(A %*% a)

a %*% A == t(a %*% A)

> A %*% a
           [,1]      [,2]       [,3]
[1,]  0.8333333 0.3333333 -0.1666667
[2,]  0.3333333 0.3333333  0.3333333
[3,] -0.1666667 0.3333333  0.8333333
> t(A %*% a)
           [,1]      [,2]       [,3]
[1,]  0.8333333 0.3333333 -0.1666667
[2,]  0.3333333 0.3333333  0.3333333
[3,] -0.1666667 0.3333333  0.8333333
精度问题, 不能直接划等号
> t(A %*% a) == A %*% a
      [,1]  [,2]  [,3]
[1,]  TRUE FALSE FALSE
[2,] FALSE  TRUE  TRUE
[3,] FALSE  TRUE  TRUE

> t(a %*% A)
     [,1] [,2] [,3] [,4]
[1,]  0.7  0.4  0.1 -0.2
[2,]  0.4  0.3  0.2  0.1
[3,]  0.1  0.2  0.3  0.4
[4,] -0.2  0.1  0.4  0.7
> a %*% A
     [,1] [,2] [,3] [,4]
[1,]  0.7  0.4  0.1 -0.2
[2,]  0.4  0.3  0.2  0.1
[3,]  0.1  0.2  0.3  0.4
[4,] -0.2  0.1  0.4  0.7
精度问题, 不能直接划等号
> t(a %*% A) == a %*% A
      [,1]  [,2]  [,3]  [,4]
[1,]  TRUE FALSE FALSE FALSE
[2,] FALSE  TRUE  TRUE FALSE
[3,] FALSE  TRUE  TRUE FALSE
[4,] FALSE FALSE FALSE  TRUE

[参考]
1. http://en.wikipedia.org/wiki/Moore%E2%80%93Penrose_pseudoinverse

时间: 2024-09-20 07:32:06

使用MASS库 ginv() 计算任意矩阵的广义逆 (Moore-Penrose)的相关文章

矩阵论 第三章 矩阵的广义逆与线性方程组

广义逆主要是为了把逆计算推广到奇异矩阵和非方阵. 广义逆矩阵是Moore首先明确提出来, 凭借他天才的几何直觉,利用正交投影算子来定义广义逆,但由于这类定义较为抽象而且不能进行有效运作,所以在之后的30年并未引起人们的注意.直到1955年,Penrose以更直接明确的代数形式给出了Moore广义逆矩阵的定义,他用四个方程再次定义了广义逆,并证明了A+的唯一性,还建立了A(1)与线性方程组Ax=b的解的联系,从那时起广义逆的研究开始蓬勃发展. 1. 广义逆介绍 定义: m x n的矩阵A∈C, 若

计算任意一个图生成树的个数:Kirchhoff 的Matrix Tree方法Java实现

计算任意一个图的生成树的个数,是Kirchhoff提出的理论,通常称为Matrix Tree Theorem,原理很简单: Let G be a graph with V(G)={v1,v2,...,vn},let A={aij}be the adjacentcy matrix of G,and let C={cij}be the n*n matrix, where cij=deg vi if i=j; cij=-aij if i!=j; Then the number of spanning

java实现任意矩阵Strassen算法_java

本例输入为两个任意尺寸的矩阵m * n, n * m,输出为两个矩阵的乘积.计算任意尺寸矩阵相乘时,使用了Strassen算法.程序为自编,经过测试,请放心使用.基本算法是: 1.对于方阵(正方形矩阵),找到最大的l, 使得l = 2 ^ k, k为整数并且l < m.边长为l的方形矩阵则采用Strassen算法,其余部分以及方形矩阵中遗漏的部分用蛮力法. 2.对于非方阵,依照行列相应添加0使其成为方阵. StrassenMethodTest.java package matrixalgorit

T-SQL 2 Tips: 1.计算任意两日期之间的&amp;amp;quot;周一&amp;amp;quot;到&amp;amp;quot;周日&amp;amp;quot;分别各有几个! 2.根据出生..

这两个小技巧,不写不知道,一写吓一跳!都是看似简单,实际做起来就懵,得仔细想一想,才能写对!凡是有日期运算的程序都要细心哦! 先说第二个: 2.根据出生日期精确计算年龄!  所谓计算精确年龄就是: 生日差一天也不能长一岁!  大家常用,间隔年数算作年龄! 如果需求要精确,如: 保险 之类的,就粗了!  当然还可引申为根据入职日期计算精确的司龄,算加薪之类的需求!  我起初认为很简单,当年也写了好几遍才写对!高手们也被我晃点了数次几近晕倒!  不信有当年 2002-11-27 16:16:26 贴

Java中计算任意两个日期之间的工作天数

主要思路: 对于任意2个日期比如:date_start=2006-10-1.date_end=2006-10-14 ,首先计算这连个日期之间的时间间隔(天数),然后分别对date_start 和date_end 取得它们下一个星期一的日期,这样就可以得到一个新的可以整除7的完整日期间隔(这个新的日期间隔已经把星期几的问题剔出掉了),换一种说法就是我们可以得到,这两个新的日期之间的周数,拿这个周数乘以5就是工作日期了(tmpWorkingDays).但是这个日期并不是我们所要的日期,接下来我们要做

java计算任意位水仙花数示例(回文数)_java

可计算任意位水仙花数 复制代码 代码如下: public static void main(String[] args) {  int max = 10;  for (int len = 1; len <= max; len++) {   System.out.println(getNarc(len, ""));  } }  static StringBuffer strb = new StringBuffer();  static String getNarc(int len,

PostgreSQL 计算 任意类型 字段之间的线性相关性

PostgreSQL自带了计算numeric和numeric字段的线性相关性的聚合函数corr(numeric, numeric).例如: postgres=# select corr(c1,c2) from (values (1,2),(2,1),(100,90),(13,13),(25,27) ) t(c1,c2); corr ------------------- 0.998528203831946 (1 row) postgres=# \df+ corr List of function

MySQL · 答疑解惑 · 备库Seconds_Behind_Master计算

背景 在mysql主备环境下,主备同步过程如下,主库更新产生binlog, 备库io线程拉取主库binlog生成relay log.备库sql线程执行relay log从而保持和主库同步. 理论上主库有更新时,备库都存在延迟,且延迟时间为备库执行时间+网络传输时间即t4-t2. 那么mysql是怎么来计算备库延迟的? 先来看show slave status中的一些信息,io线程拉取主库binlog的位置: Master_Log_File: mysql-bin.000001 Read_Maste

用单循环链表存储一个环上的数据,并计算任意两个相邻元素之差是否超过2

#include<iostream.h> #include<stdlib.h>   typedef struct node{   int  data;  struct node *next; }Lnode,*LinkList;   //假设下面的单循环链表均为带头结点,而且L指向尾结点.   void CreatLinkList(LinkList &L) {//建立一个单循环链表L,数据为整数,数据由键盘随机输入.  int i;  LinkList head;  L=(L