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篇——矩陣乘法

今天結束,我要開始愁明天寫啥了~~~


分享到:


相關文章: