好的!下面開始了,快上車吧( ̄) ̄)↗ 。矩陣,相信大家都不會陌生。矩陣的運算穿插了整個大學課程——《線性代數》。在這裡筆者想再龜毛幾句。記得大學那會兒《線代》也沒怎麼認真聽,寫作業就喜歡偷懶,會耍小聰明,自己就琢磨出來的歪門邪道一有空就拿Excel去算題。作業呢也基本上一口氣寫完不費勁 ( ‵▽′)ψ,考試前突擊了一下90分飄過了。(編輯註:老凡爾賽了)至於很複雜的矩陣運算,其實筆者(擅自地)認為只要不是真心想在考研上下功夫提分或者本身就是數學專業人士(在此希望不要被我無意冒犯),站在十幾年後本人的角度去想,當時在大學中花費太多的精力去深入學習高數其實並沒有那麼地需要,可能會觸及很多高深的我們無法觸及的高數世界而受到打擊導致對高數世界的探尋感到望而卻步(那種求知慾被碾壓的感覺你懂的)。相反如何活用高數的知識給將來的科研之路打基礎,如何讓高數的知識跟程式語言做結合,如何讓高數思想跟算法技巧結合,如何遇到問題能夠融會貫通以及如何學以致用才更重要。我們只需要記得曾經學過矩陣運算,將來記得線性代數的老師那句話就中:幾乎全部的矩陣運算都可以用Excel運算,所以能來堅持聽課,能好好寫作業就一定不會掛科的?!
圖1中演示了MATLAB文法如何定義矩陣。在變量A的後面用一個等號後接表示賦值;被中括號括住的都是矩陣內的元素;3×3矩陣裡,分號表示換行,空格或者逗號表示行方向的分割。
圖1圖2中演示了元素的更替和指定。只需按照圖中所示範的command去執行就可以了。沒有什麼技術含量,在此就不贅述了。
圖2圖3演示了子矩陣的抽出和指定。順便補充一句,冒號在矩陣之中元素(子矩陣)聲明和引用的時候十分常用。假如矩陣的尺寸很大例如1000×1000的時候,可以在格式上進行如此的活用:例如A(2:end,:)就表示第2行到最後1行的所有元素所構成的子矩陣;A(2:end-1,:)就表示第2行到倒數第2行的所有元素構成的矩陣(當然前提是A這個矩陣得足夠大,不然這裡的例子就會返回一個空矩陣)。有興趣的小夥伴不妨用很大的矩陣來定義A,再來體驗一下這個細節,在此不贅述。
圖3圖4演示了矩陣的轉置,線代老師已教。需要注意的就是A右上角的單引號必須是英文半角輸入的。
圖4接下來重點介紹一下基於MATLAB矩陣運算實現元素的過濾。在很多情況中,我們會遇到矩陣中元素過濾的場面。例如我們想過濾掉所有大於某個閾值的柵格(或者像元,網格)的時候就可以採用這種思路。圖5中解釋了如何進行元素的過濾。當然手法不一定唯一,需要注意的是星乘前面的那一個點還有英文半角的括號。邏輯判斷矩陣的幫助信息可以輸入help > 即可查閱MATLAB對運算符的詳細介紹,在此就不做贅述。
圖5最後還需要介紹一下基於MATLAB矩陣運算實現矩陣的重構。我們在矩陣處理的時候經常會碰到矩陣的重構(比如:拼合)的情況。例如圖6紅色文字所示,zeros(3,1)構造一個3×1的全為0的矩陣,之後從右邊將之拼到A上面構成一個新的矩陣。輸入help zeros即可查閱此函數的詳細解釋。接下來如橙色字體所示,從下方將一個1×4的全為0的矩陣拼到A上面重構一個矩陣。需要特別注意矩陣的中括號內部聲明的時候什麼時候用空格(或者逗號),什麼時候用分號。
圖6總結一下,其實基於MATLAB的矩陣運算還有許許多多技巧,筆者在此僅僅給了幾個本篇所要用到的例子。讀者朋友在碰到實際問題的時候,可以先動腦筋思考矩陣運算的步驟和原理,然後在嘗試利用線性代數的知識進行運算即可。正可謂,萬變不離其宗。記起來線代老師的話了麼,學好矩陣運算能夠讓複雜的運算變得簡便。這裡才是線代的真正魅力所在啊。
流空間(推薦一篇綜述論文)
首先OD矩陣是什麼?以下是百度百科收錄的解釋:OD矩陣以所有交通分區按行(起點區)與列(訖點區)排序,以任意兩分區之間的居民或車輛出行量(OD量)為元素的矩陣。按形式分,有矩形矩陣和三角形矩陣,前者能區分兩區間不同方向的出行量,後者只表示兩區間兩個方向出行量之和。按內容分,有分出行目的,分出行方式,或不分目的(「全目的」),不分方式(「全方式」)的各種矩陣。 [楊廣文.交通大辭典:上海交通大學出版社,2005.01]
OD矩陣是源點(Origin)-終點(Destination)矩陣的英文縮寫,所謂的點其實是一片交通劃分的區域,而該矩陣中的數據就是從區域A到區域B的交通流量,其實就是相當於你從一個地方到另外一個地方的路徑上的擁堵程度,一般用在交通領域。
從圖7不難理解OD矩陣的內涵,如何變換成ArcMap需要的XY列表形式的流數據,以及他們所對應的流空間模式。關於流空間,筆者在這裡想要重點安利一篇綜述文章,特別適合剛入門的同學或者論文開題時候的閱讀:王垚等 《「流空間」視角下區域空間結構研究進展》。這裡給出的例子是3個節點(比如城市,交通分區,生活圈等)之間的兩兩流動。對角線元素代表一個節點的內部流動(intra-regional flow),非對角線元素則代表一個節點的外部流動(inter-regional flow)。特別需要強調一點的是,本文對流空間的可視化還沒有考慮方向性,因為本文採用的例子是一個長期的國內旅客流動,存在一定的對稱性。倘若要考慮帶流動出入方向性的流空間的可視化,推薦使用Python實現,詳情請見本公眾號以前的帖子《利用Python繪製酷炫OD流量圖的新方法》。
圖7接下來就到了OD矩陣處理與其GIS可視化的實踐階段了。本文採用的原始數據來源於日本國土交通省網站上所公布的1990年份的《全日本旅客純流動調查》,分別有兩種精度,50生活圈(跟都道府縣的區域基本重合)與207生活圈(考慮最小單位自治體功能配分的一種劃分)。本文採取的是前者的例子。跟生活圈的定義,數據的細節以及科研中活用可以參考論文:Liu K., & Dauda T. S. (2020). Structural Changes in Japan's Urban System from 1990 to 2010. Journal of Urban and Regional Analysis. 12(2), 117-143. 也可以關心下官方網站上公開的該調查的小冊子查閱空間編碼的情況,GIS基礎數據可以通過國土交通省網站上所公開的國土數值情報下載到。歷年的全日本旅客純流動調查的Excel數據(1990,1995,2000,2005以及2010年份),有興趣關心的同學可以嘗試去官方網站上自行下載,貌似無需申請只需要填寫問卷即可下載,為了防止版權糾紛,本文就不公開了, 。
0
還望諒解。
圖8的GIF演示了如何從Excel數據中複製粘貼需要的部分導入MATLAB。因為數據表格做的比較精緻,明確區分了航空流,鐵路流,汽車流以及全部交通方式的旅客流。本文所演示的部分存在不需要的表頭,欄位和文本部分,在這裡筆者就採用這種簡單粗暴的方式了。倘若表格數據量很大可以採用load函數,假如有大規模海量的表格需要批量處理的話就要考慮編寫實現自動化批量操作的程序了。
圖 8下面的GIF動圖顯示了將原始數據,50生活圈的OD矩陣的數據複製粘貼到新的Excel工作表,儲存為乾淨數據1990.csv,並存入MATLAB的workspace目錄下。接下來,在MATLAB左側的找到csv文件,右擊,點擊最底下那一項input data,按照要求設定細節,選擇分隔符,next,next,重命名,很容易就可以加載進去(圖9)。
圖 9在此需要特別指出的是,由於該《全日本旅客純流動》數據存在瑕疵,例如首都圈(千葉,埼玉,東京以及神奈川),中京圈(岐阜,愛知以及三重)以及近畿圈(京都,大阪,兵庫以及奈良)的內部旅客流由於種種原因並未被收錄(如圖10和圖11),原因可能是因為統計部門差異,數據量原因以及自治體的規模是特別不一樣的(人口密度太高面積又小,跨縣的通勤流動太頻繁,這極大影響旅客流動的調查的嚴謹性和單純性),故而本文一開始無視了這個問題,將三大都市圈是為均一的整體,也就是視為跟其他縣為同級別的生活圈,這裡如同該數據官方說明書的分區說明之中所聲明的那樣(如圖11)。後來在論文Liu & Tamba (2020)之中採用207生活圈為單位zone的數據進行了深入分析(如圖11),在此不做贅述。
圖 10圖11清洗OD矩陣並將之轉化為XY列表形式的流數據的代碼如下圖12所示。請各位同學根據自己的數據情況靈活參考。筆者需要特別指出的是圖中利用for循環語句構造i和j角碼的列向量,建議這裡可以重點體會一下原理(較為抽象),這樣在面對自己數據的時候,具體問題具體分析然後謀求活學活用即可。
圖 12從OD矩陣變換成流數據的處理已經通過圖13所展示。建議在調試成功之後的代碼直接存成m文件或者txt文件複製粘貼直接運行比較有效率而且容易糾錯和校正。在此聲明一下,GIF圖中原本的OD矩陣在此已經將其重命名為A變量。MATLAB中這裡定義OD為處理後的流數據。
圖 13接下來需要實現GIS的可視化。需要特別指出的是筆者這裡僅僅是給出了XY列表流數據如何在GIS上實現可視化步驟,由於讀者朋友手頭的數據可能情況都不一樣,筆者還是希望能在本文把原理可以講解明白,如有疑問可在後臺留言區評論,還望諒解。加之本文沒有考慮流空間的方向性,倘若讀者朋友們有需要考慮方向性,建議採用Python工具進行可視化。
第一步是進行地理編碼,也就是給42個區域一個唯一識別,按1-42順序排列的ID(如圖14)。另外需要強調一點的是這裡的shp需要用世界的WGS坐標系因為後面需要用到經緯度。
圖14
第二步,在地理編碼完成(也就是給42個點shp賦予正確的ID)之後,將清洗好的OD數據(XY列表形式的流數據)加載到ArcMap的工作文件夾(圖15)。
圖15第三步,在shp的屬性表裡新建兩列欄位XY,然後利用屬性表欄位運算給X計算經度,給Y計算緯度(如圖16)。
圖16第四步,載入XY列表形式的流數據(如圖17)。
圖 17第五步,點shp複製一份,一份拿來給出發地i列進行屬性表連結,一份拿來給目的地j那一列進行屬性表連結,如圖18所示。這樣我們就成功第把XY列表的起始點經緯度坐標放在了一張表裡面。
圖18第六步,利用feature → XY to Line這個工具實現流數據的可視化。需要根據自己的數據情況進行合理地設定(如圖19)。
第七步,由於圖19中的操作僅僅是畫出來了OD的形狀,但沒有包含流動的值,需要在進行一步屬性表連結,然後才能進行數值分類(如圖20)。
圖20最後就是調整地圖要素,專題地圖製作以及美工了。圖21給出了一些可視化的例子和筆者在ESRI Japan的展覽會上做的海報。
圖21