PostgreSQL相似人群圈選,人群擴選,向量相似使用實踐-cube
背景
PostgreSQL 相似外掛非常多,外掛的功能以及用法如下:
《PostgreSQL 相似搜尋外掛介紹大彙總 (cube,rum,pg_trgm,smlar,imgsmlr,pg_similarity) (rum,gin,gist)》
相似人群分析在精準營銷,推薦系統中的需求很多。
人的屬性可以使用向量來表達,每個值代表一個屬性的權重值,通過向量相似,可以得到一群相似的人群。
例如
create table tt (
uid int8 primary key,
att1 float4, — 屬性1 的權重值
att2 float4, — 屬性2 的權重值
att3 float4, — 屬性3 的權重值
…
attn float4 — 屬性n 的權重值
);
使用cube表示屬性
create table tt (
uid int8 primary key,
att cube — 屬性
);
使用cube或imgsmlr可以達到類似的目的。
a <-> b float8 Euclidean distance between a and b.
a <#> b float8 Taxicab (L-1 metric) distance between a and b.
a <=> b float8 Chebyshev (L-inf metric) distance between a and b.
但是如果向量很大(比如屬性很多),建議使用一些方法抽象出典型的特徵值,壓縮向量。 類似圖層,圖片壓縮。實際上imgsmlr就是這麼做的:
pic
例如256256的畫素,壓縮成44的畫素,儲存為特徵值。
例子
1、建立外掛
create extension cube;
2、建立測試表
create table tt (id int , c1 cube);
3、建立GIST索引
create index idx_tt_1 on tt using gist(c1);
4、建立生成隨機CUBE的函式
create or replace function gen_rand_cube(int,int) returns cube as
$$
select (`(`||string_agg((random()*$2)::text, `,`)||`)`)::cube from generate_series(1,$1);
$$
language sql strict;
5、CUBE最多存100個維度
postgres=# set VERBOSITY verbose
postgres=# select gen_rand_cube(1000,10);
ERROR: 22P02: invalid input syntax for cube
DETAIL: A cube cannot have more than 100 dimensions.
CONTEXT: SQL function “gen_rand_cube” statement 1
LOCATION: cube_yyparse, cubeparse.y:111
6、寫入測試資料
insert into tt select id, gen_rand_cube(16, 10) from generate_series(1,10000) t(id);
7、通過單個特徵值CUBE查詢相似人群,以點搜群
select * from tt order by c1 <-> `(1,2,3,4,5,6,7)` limit x; — 個體搜群體
8、通過多個特徵值CUBE查詢相似人群,以群搜群
select * from tt order by c1 <-> `[(1,2,3,4,5,6,7),(1,3,4,5,6,71,3), …]` limit x; — 群體搜群體
postgres=# explain select * from tt order by c1 <-> `[(1,2,3),(2,3,4)]` limit 1;
QUERY PLAN
Limit (cost=0.11..0.14 rows=1 width=44)
-> Index Scan using idx_tt_1 on tt (cost=0.11..0.16 rows=2 width=44)
Order By: (c1 <-> `(1, 2, 3),(2, 3, 4)`::cube)
(3 rows)
9、如果需要再計算壓縮前的特徵值的相似性,可以使用原始值再計算一遍。
《PostgreSQL 遺傳學應用 – 矩陣相似距離計算 (歐式距離,…XX距離)》
select *,
c1 <-> ?1, — c1表示壓縮後的特徵值浮點數向量,比如(4*4)
distance_udf(detail_c1,?2) — deatil_c1 表示原始特徵值浮點數向量(比如128*128)
from tt order by c1 <-> ?1 limit xx;
參考
https://www.postgresql.org/docs/devel/static/cube.html
https://github.com/postgrespro/imgsmlr
https://github.com/eulerto/pg_similarity
《PostgreSQL 相似搜尋外掛介紹大彙總 (cube,rum,pg_trgm,smlar,imgsmlr,pg_similarity) (rum,gin,gist)》
《PostgreSQL 11 相似影像搜尋外掛 imgsmlr 效能測試與優化 3 – citus 8機128shard (4億影像)》
《PostgreSQL 11 相似影像搜尋外掛 imgsmlr 效能測試與優化 2 – 單機分割槽表 (dblink 非同步呼叫並行) (4億影像)》
《PostgreSQL 11 相似影像搜尋外掛 imgsmlr 效能測試與優化 1 – 單機單表 (4億影像)》
轉自阿里雲德哥
相關文章
- 相似人群畫像演算法演算法
- JUST技術:如何通過軌跡相似性度量方法,發現新冠易感人群
- 如何發現品牌潛客?目標人群優選演算法模型及實踐解析演算法模型
- 移動端影像相似度演算法選型演算法
- iOS - 建立大量相似App的另外一種選擇iOSAPP
- 眾安保險 CDP 平臺:藉助 Apache Doris 打破資料孤島,人群圈選提速4倍Apache
- PostgreSQL大學選課相關性應用實踐SQL
- Dockerfile中相似命令Docker
- word2vec實現域名向量化並計算相似度-python程式碼Python
- 手機中國:資料顯示單身人群中有55.04%比例的人群在休閒時間都會選擇的手機娛樂
- 城市相似性的視覺化:美國和冰島竟如此相似視覺化
- 839相似字串字串
- 查詢相似的索引索引
- java實現兩個文字相似度 simHash 實現Java
- 文章相似度檢測,相似度檢測工具,原創度檢測工具
- 如何洞悉城市人群移動規律?DataV海量軌跡視覺化實踐解析視覺化
- 實踐2:如何使用word2vec和k-means聚類尋找相似的城市聚類
- SQL Server相似比較演算法實現SQLServer演算法
- 文章相似度檢測工具哪個好?怎麼讓文章相似度變低?
- TF-IDF與餘弦相似性的應用(二):找出相似文章
- 低程式碼平臺適合哪些人群使用?
- Java開發者的Python快速實戰指南:探索向量資料庫之影像相似搜尋-文字版JavaPython資料庫
- 當代減肥人群鑑別指南
- 個推:抖音網紅景點人群分析
- 中文標題相似度檢測
- 相似圖片搜尋的原理
- 872. 葉子相似的樹
- 萃弈陳傳洽:人群優選+技術優效——海外品牌增長的紅藍雙buff
- 使用PL/SQL找到兩個表中的相似值FKSQL
- 機器學習中那些相似度的計算方法及實現機器學習
- 【圖解】Web前端實現相似Excel的電子表格圖解Web前端Excel
- python 相似語句匹配(非機器學習)Python機器學習
- HybridDBforPostgreSQL軌跡相似(伴隨分析)SQL
- 大規模文字相似度計算
- 利用sklearn計算文字相似性
- c#-SimHash匹配相似-演算法C#演算法
- 通過decode計算相似度
- 相似圖片搜尋的原理(二)