天天看點

視覺挖掘與PostGIS空間資料庫的邂逅

postgresql , postgis , 視覺比對 , 空間相交 , 圈人

推薦系統是廣告營銷平台的奶牛,其核心是精準、實時、高效。

這麼多廣告平台,到底誰家強?誰的核心牛逼?

1. 精準,指對使用者的描述精準,通常需要基于大量的使用者行為資料,經曆深度學習後形成的使用者畫像,或稱之為标簽系統。 标簽的準确性關系到推薦的精準度,比如你可能不會對一個正常的年輕人推薦老花眼鏡(當然如果有其他購買意向的标簽來指出他有購買老花眼鏡的欲望除外)。

2. 實時,名額簽的更新實時性,很多标簽是具有非常強的時效性的,比如一次營銷的目标人群,又或者使用者最近浏覽的一些商品可能是有潛在購買欲望的商品,都具備時效性。如果你的标簽生成是隔天,或者個很多天的,那麼可能已經錯過了推薦時機。實時性在推薦系統中是非常重要的。

3. 高效,指基于标簽圈人的動作的效率與并發能力,作為購買廣告的金主,當然是期望他們拿到資料的速度越快越好。并且會有很多人向你的平台購買廣告,這考驗的是并發能力。

做到以上三點,這樣的廣告平台才具備一定的競争力。

postgresql 數組與gin索引可以完美的支援這樣的業務場景,可以參考我去年寫的這個案子。

<a href="https://github.com/digoal/blog/blob/master/201612/20161225_01.md">《恭迎萬億級營銷(圈人)潇灑的邁入毫秒時代 - 萬億user_tags級實時推薦系統資料庫設計》</a>

以上案子适合店鋪通路分階層的場景,例如1-1000,1001-5000,....分檔。

如果店鋪的通路次數沒有分檔,完全精細化表示,怎麼挖掘呢?

接下來,将要給大家介紹的方法,使用空間資料庫來實作以上場景。

使用者在逛淘寶時,購買一個商品,可能會看很多家店鋪,一番貨比三家後,才會決定從哪家買。

使用者每天會通路很多的店鋪,如果某個使用者通路某家店鋪的次數非常多,說明一個什麼問題呢?

這家店一定有什麼吸引該使用者,那麼如果店家針對這些使用者推送活動、或者采用合适的營銷手段,客戶在這家店鋪購買商品的可能性就非常高。

視覺挖掘與PostGIS空間資料庫的邂逅

這個是圈人的手段之一。

資料結構可能會包括如下

使用者id,店鋪id1,通路次數,店鋪id2,通路次數,。。。。。(例如1:1, 2:1即1号店通路了1次,2号店通路了1次)。

有了這些資料,業務方可以根據店鋪的通路次數圈出一部分人群,比如a店鋪通路超出多少次的,或者b店鋪通路超過多少次的等。

如果讓你來處理,你會使用什麼技術呢?

店鋪id上億、使用者數上億、通路次數不定。

以上業務需求,如果裸算,會耗費大量的cpu。

postgis是一個空間資料庫,如果将這些資料轉換為空間資料,則可以使用空間函數來實作圈人的目的,比如圈人可以表示為:multipoint與某條線段相交。

這個操作可以使用postgis的空間索引來完成。

把通路軌迹資料轉換為multipoint的幾何類型來實作這個業務需求。

這兩個函數,可以将multipoint構造為幾何類型

<a href="http://postgis.net/docs/manual-2.3/st_mpointfromtext.html">http://postgis.net/docs/manual-2.3/st_mpointfromtext.html</a>

<a href="http://postgis.net/docs/manual-2.3/st_geomfromtext.html">http://postgis.net/docs/manual-2.3/st_geomfromtext.html</a>

某個使用者的通路軌迹,在資料庫中存儲為多個點組成的幾何類型

視覺挖掘與PostGIS空間資料庫的邂逅

而圈人,則使用兩個幾何類型的相交即可,例如通路2号店鋪在2到100次,或者,通路4号店鋪在3到100次的人群。轉化為求 "多線段幾何圖形" 與 "多點幾何圖形" 相交的結果集。

視覺挖掘與PostGIS空間資料庫的邂逅

(目前postgis ga版本還不支援這個操作, 接下來我假設postgis已支援multipoint &amp;&amp; linestring的基礎上)。

目前&amp;&amp;支援的是bounding box的相交,并不是point,是以直接判斷&amp;&amp;的結果,得到的結果并不是我們想要的。

postgis衆多高難度的幾何操作都實作了,這個需求看樣子真的不是幾何需求。

資料格式(店鋪id:通路次數;店鋪id:通路次數....)

根據以上格式,建構multipoint,并建立空間索引,注意空字元串轉化為極點(0 0)。

插入幾條測試資料,分别表示這些使用者的通路了哪些店鋪,以及次數。

1. 查詢通路1号店鋪&gt;=2, &lt;=100次的使用者

構造一條線段st_linefromtext('linestring(1 2, 1 100)'),查詢相交即可。

執行計劃,可以看到使用了空間索引

2. 查詢通路1号店鋪&gt;=2, &lt;=100次的使用者,或者,通路2号店鋪&gt;=2, &lt;=100次的使用者

構造一個多線段類型st_mlinefromtext('multilinestring((1 2, 1 100), (2 2, 2 100))'),查詢相交即可。

3. 查詢通路1号店鋪&gt;=2, &lt;=100次的使用者,并且,通路2号店鋪&gt;=2, &lt;=100次的使用者

查詢兩條線段st_linefromtext('linestring(1 2, 1 100)'), st_linefromtext('linestring(2 2, 2 100)')都相交即可

那麼postgis哪些視覺、幾何運算和本文相關呢?

postgis在處理multipoint時,大多數幾何運算,會将multipoint自動轉換為閉合的、占據最大面積或者體積的bound box.

視覺挖掘與PostGIS空間資料庫的邂逅

1. b的所有部分都在a的内部,并且,b至少有1個内部的點在a的内部。

藍色為a,灰色為b

true

視覺挖掘與PostGIS空間資料庫的邂逅

false, 并不是所有的點都在a的内部

視覺挖掘與PostGIS空間資料庫的邂逅

2. b的任何點都不在a的外面。

3. a的任何點都不在b的外面。

4. a與b有部分共用的部分,并且,共用的部分不是a或者b的全部(即公共部分隻是a或b的一部分)

視覺挖掘與PostGIS空間資料庫的邂逅

5. a和b沒有任何空間交集

6. a和b有空間相交, 與st_disjoint相反

7. a和b有空間相交,但是a或b都不會完全包含對方。即一定有一部分在對方的外面。

視覺挖掘與PostGIS空間資料庫的邂逅

8. 傳回a和b在指定幾何計算特性樣式下的運算結果,或者,判斷兩個幾何體是否符合指定的幾何特性。

<a href="http://postgis.net/docs/manual-2.3/st_relate.html">http://postgis.net/docs/manual-2.3/st_relate.html</a>

運算樣式如下

<a href="https://en.wikipedia.org/wiki/de-9im">https://en.wikipedia.org/wiki/de-9im</a>

視覺挖掘與PostGIS空間資料庫的邂逅

9. 判斷a幾何特性是否包含b幾何特性

10. a和b至少有1個公共點,但是他們的内部沒有相交。

視覺挖掘與PostGIS空間資料庫的邂逅

11. a完全在b裡面

視覺挖掘與PostGIS空間資料庫的邂逅

幾何特性如下,a為存儲的multipoint(或者單點),b為我們輸入的條件線段。

那麼應該具備如下特性:

1. a 和 b有公共點,但是他們的内部不存在相交。

或者

2. a 完全在b裡面。

1. 點選1号店鋪在2到100次之間的使用者有哪些?

不管是multipoint還是linestring,理論上視覺判斷是很好判斷的,但是目前postgis沒有對這個簡單的視覺判斷加直接的索引過濾,需要使用st_touches和st_within兩個來判斷,而且multipoint會轉換為linestring,這樣的話相交的機率就大大增加了。

優化方法,每個使用者,每個店鋪對應一條記錄,店鋪和通路次數可以使用一個point來表示。

通過st_within來判斷即可,可以走索引。

當然這麼做,和存兩個标量字段的效率就差不多了。

postgis在民用、科研、軍工等各個領域都有應用,貫穿測繪、宇航局、氣象、視覺、導航、物流、物聯網等等各個行業。

幾乎所有的視覺或地圖類的架構也将postgis作為預設元件來支援。

<a href="http://postgis.net/docs/manual-2.3/">http://postgis.net/docs/manual-2.3/</a>

實際上有很多應用可以往視覺處理方面靠,比如本文提到的根據店鋪的通路次數圈人的場景,如果将其存儲為multipoint,那麼圈人的動作就可以轉換為視覺處理,求相交。

通過postgis的空間索引,這種應用完全可以做到毫秒級的響應。

讓我們一起迎接實時營銷的毫秒時代。

同時我們也可以開腦洞想象一下,是不是還有很多解不了的問題,可以用視覺處理來解決呢?

<a href="http://pointclouds.org/">http://pointclouds.org/</a>

<a href="http://postgis.net/docs/manual-2.3/st_makeline.html">http://postgis.net/docs/manual-2.3/st_makeline.html</a>

<a href="http://postgis.net/docs/manual-2.3/st_mlinefromtext.html">http://postgis.net/docs/manual-2.3/st_mlinefromtext.html</a>

<a href="https://github.com/digoal/blog/blob/master/201610/20161021_01.md">《基于 阿裡雲 rds postgresql 打造實時使用者畫像推薦系統》</a>