數據尋龍點穴(空間聚集分析) - 阿裏雲RDS PostgreSQL最佳實踐
標簽
PostgreSQL , Greenplum , PostGIS , K-Mean , 熱力圖
背景
最近鬼吹燈熱播,胡八一的《十六字陰陽風水秘術》到底是什麼武功秘籍?尋龍點穴又是什麼?別問我,不知道。
PS:截取自互聯網。- 尋龍點穴是風水學術語。古人說:三年尋龍,十年點穴。意思就是說,學會尋龍脈要很長的時間,但要懂得點穴,並且點得準則難上加難,甚至須要用“十年”時間。 但是,若沒正確方法,就是用百年時間,也不能夠點中風水穴心聚氣的真點,這樣一來,尋龍的功夫也白費了。 準確地點正穴心,並不是一件容易的事,對初學者來說如此,就是久年經驗老手,也常常點錯點偏。
但是,我們要相信科學的力量,如今大數據、AI這麼發達,實際上我們可以在海量數據的情況下總結經驗,和前人通過古老的夜觀星象總結的經驗可能會出現驚人的相似。
我們有海量的人物活動數據、汽車活動數據、傳感器數據等等。完全可以分析出來什麼樣的地方適合居住,什麼樣的地方適合做生意,等等。
扯遠了,我們回到主題 - 空間數據尋龍點穴。實際上就是PostGIS 2.3的兩個新特性,空間數據的聚集分析。
例如我們有人物活動的點數據組成的海量數據,通過空間聚集分析,可以匯聚出指定時間段,數據聚集的熱力圖。是不是和尋龍點穴有點相似呢?
空間聚集窗口分析函數
鬼吹燈中有一段關於“龜眠之地”的描述:
我掏出《十六字陰陽風水秘術》翻了翻,找到一段“龜眠之地”的傳說,書中記載,當年有人在海邊,見到海中突然浮出一座黑山,再細觀之,原來是數十隻老龜,馱負著一頭死去的巨龜自海中而出,這些老龜把死龜馱至一處山崖下地洞穴裏藏好,這才陸續離去遊回大海,偷偷看到這一切的那個人,擅長相地擇穴之術,知道此穴乃是四靈所鍾。洞中“龍氣衝天”,其時正好他家中有先人故去,於是他探明洞中龜屍的特形後,把自己的先人不用棺槨裸身葬入其中。此後這個人飛黃騰達、平步青雲,成就了一方霸業。那處龜眠洞日後就成了他家宗室的專用慕穴,數百年後龍氣已盡,地崩,露出屍體無數,當地人爭相圍觀,所有屍身皆生鳥羽龍鱗,被海風吹了一天一夜之後,全部屍體同時化為烏有。
鬼吹燈和數據分析有什麼關聯呢?必須有啊,你想想,古人為了找到一塊“龜眠之地”得費勁多少心思了。而現在我們有了數據,是不是很好找了呢。
假設我們的數據包含這些維度:
1、時間
2、人物位置
3、人物屬性(收入、行業、年齡、等等)
好了,想象一下,你是不是可以按人物屬性、時間,對數據進行空間聚集分析。生成不同分析維度的人群熱力圖。頗有尋龍點穴範。
那麼怎麼做空間數據的聚集分析呢?
PostGIS 2.3 新增了兩個窗口函數,就是用於
1、基於Density-based spatial clustering of applications with noise (DBSCAN) 算法的空間數據聚集分析函數ST_ClusterDBSCAN:
2、基於 k-means 算法的空間數據聚集分析函數ST_ClusterKMeans:
有意思吧。
例子
1、
-- Partitioning parcel clusters by type
SELECT ST_ClusterKMeans(geom,3) over (PARTITION BY type) AS cid, parcel_id, type
FROM parcels;
-- result
cid | parcel_id | type
-----+-----------+-------------
1 | 005 | commercial
1 | 003 | commercial
2 | 007 | commercial
0 | 001 | commercial
1 | 004 | residential
0 | 002 | residential
2 | 006 | residential
(7 rows)
2、
SELECT name, ST_ClusterDBSCAN(geom, eps := 50, minpoints := 2) over () AS cid
FROM boston_polys
WHERE name > '' AND building > ''
AND ST_DWithin(geom,
ST_Transform(
ST_GeomFromText('POINT(-71.04054 42.35141)', 4326), 26986),
500);
st_union 空間對象聚合
前麵提到的兩個窗口函數隻是生產每條記錄所屬的聚集ID,按這個聚集ID在聚合,就可以聚合成一個個的幾何對象(例如點集),通過點集再可以生成sufface。
https://postgis.net/docs/manual-dev/ST_MemUnion.html
https://postgis.net/docs/manual-dev/ST_Union.html
空間聚集分析業務場景
空間聚集分析窗口函數,非常有助於基於人物、被檢測對象在時間、空間、對象屬性等多種維度層麵的空間聚集透視。
關於多維數據透視,也可以參考我以前寫的文章。
《時間、空間、對象多維屬性 海量數據任意多維 高效檢索 - 阿裏雲RDS PostgreSQL最佳實踐》
實際上除了這兩個窗口分析函數,PostgreSQL還提供了MADlib機器學習庫,通過SQL接口、R接口(pitovalR)、Python接口可以進行調用,利用數據庫的分析能力完成數據透視和編程的易用性(海量數據有MPP,中等體量有PG的多核並行計算、向量計算、JIT等大幅度提升計算能力的特性)。
阿裏雲相關數據庫產品
參考
https://planet.postgis.net/index.html
https://postgis.net/docs/manual-dev/ST_ClusterKMeans.html
https://en.wikipedia.org/wiki/K-means_clustering
https://postgis.net/docs/manual-dev/ST_ClusterDBSCAN.html
https://planet.qgis.org/planet/tag/postgis/
https://2012.ogrs-community.org/2012_papers/d3_10_bonin_presentation.pdf
最後更新:2017-08-20 17:06:43