R语言第23篇——矩阵乘法

R语言是以向量作为基本单位的,对向量化计算有很大优势,这句话我貌似之前写过,但是就没有好好实践过,一方面是因为本人的线性代数基础比较差,另一方面也是因为R语言的编程学的时间不长,好多都没学全乎

今天找出来的几个矩阵计算的命令都是刚琢磨出来的,写得不灵敬请见谅

R语言第23篇——矩阵乘法

首先第一个就是咱题目里的矩阵乘法,函数名solve,它还有个简写的二元运算符形式%*%

上的例子是昨天用过的14行*6列的距离表,由于函数的处理对象不能是数据帧只能是矩阵,所以咱先用as.matrix转换下格式

R语言第23篇——矩阵乘法

先尝试个简单的,建一个1行6个值的简单向量

R语言第23篇——矩阵乘法

由于矩阵乘法要求的格式是AxB时,A的列数=B的行数,所以咱们的距离表需要转置一下行列位置,函数名相当简洁,就是t()

R语言第23篇——矩阵乘法

然后两者相乘,得到一个长度为1行14列的新矩阵,请注意这里的输出结果形式是矩阵,如果后续需要直接当向量使用时得用as.vector转化

R语言第23篇——矩阵乘法

会特地举这么个例子不是随便写的,因为这里有个比较好玩的点,让我们把这个矩阵乘法计算出来的结果和另外一个数列放在一起看看

R语言第23篇——矩阵乘法

发现玄机了没?咱的矩阵乘法结果和原矩阵中每行的和是一样一样的

这还没完,还有更有意思的,由于咱前面设置的是6个1,现在我们把它整体除以6,变成一个总和为1的向量,再做一次矩阵乘法

R语言第23篇——矩阵乘法

现在,这个乘法的结果完全等于源表中每行的平均值了

记得昨天提到的重心的概念不,当时把14个横向的小区名称作为14根坐标轴,直接取了每行的平均值作为这个高维度空间里的重心坐标,而按照现在这个情况,这个取平均的做法其实就相当于对6个重要地点每列取相同权重乘以变换矩阵的结果

那如果咱们需要摒弃一个影响因素,该怎么操作呢?比如源表的第二列ToWork,数值太大造成了重心偏移,咱干脆去掉它,这里用了两种做法,详细见图

R语言第23篇——矩阵乘法

又一次验证成功,开森~~~

最后再做点额外的探索,咱现在都是通过横向定义6个权重来计算得到距离,那如果反过来做它的逆运算能搞得定不?

理论上来说,这个东西存在点数学上的问题,因为在线性代数里,矩阵求逆的前提是矩阵本身的形状为长宽相等的正方形,但现在咱们举例的这个14*6的数据明显不是,所以只能试试看一个近似的计算方式,叫做广义逆

为了验证测试结果,我直接取了源表第一列ToCenter的数据来做实验

R语言第23篇——矩阵乘法

求Moore-Penrose广义逆,R软件中有提供这个工具,但需要先加载下MASS包,函数名ginv

R语言第23篇——矩阵乘法

计算广义逆结果如下,效果还是不错的

R语言第23篇——矩阵乘法

今天结束,我要开始愁明天写啥了~~~


分享到:


相關文章: