范数和距离函数(Norms and Distance functions)
linalg模块由一些基本线性代数操作的功能函数组成。在实现新算法的时候可以使用某些函数。这些函数作用于向量vector(一维float8数组)和矩阵matrix(二维float8数组)。注意其它数组类型在调用这些函数前可能需要转换到float8[]。
每个功能函数的文档请查阅
线性代数功能函数
norm1() 向量vector的1范数
norm2() 向量vector的2范数
dist_norm1() 两个向量vector之间的1范数
dist_norm2() 两个向量vector之间的2范数
dist_pnorm() 两个向量vector之间的generic p范数
dist_inf_norm() 两个向量vector之间的ginfinity-范数
squared_dist_norm2() 两个向量vector之间的squaared 2范数
cosine_similarity() 两个向量vector之间的cosine值
dist_angle() 两个向量vector在欧式空间Euclidean space的夹角angle。
dist_tanimoto() 两个向量之间的tanimoto distance。
dist_jaccard() 被当做集合的两个varchar向量的jaccard distance。
get_row() 返回矩阵(二维数组)的索引行indexed row
get_row() 返回矩阵(二维数组)的索引列indexed col
avg() 计算向量的平均值
normalized_avg() 计算向量的normalized average(欧式空间中的单位向量)
matrix_agg() 把向量合并到一个矩阵
向量范数和距离
1.创建一张有2个向量列的数据库表,并插入数据
CREATE TABLE two_vectors(id integer,a float8[],b float8[]);INSERT INTO two_vectors VALUES(1, '{3,4}', '{4,5}'),(2, '{1,1,0,-4,5,3,4,106,14}', '{1,1,0,6,-3,1,2,92,2}');select * from two_vectors;id | a | b----+-------------------------+-----------------------1 | {3,4} | {4,5}2 | {1,1,0,-4,5,3,4,106,14} | {1,1,0,6,-3,1,2,92,2}
调用范数函数
SELECTid,madlib.norm1(a),madlib.norm2(a)FROM two_vectors;结果id | norm1 | norm2----+-------+------------------1 | 7 | 52 | 138 | 107.238052947636(2 rows)
调用距离函数
SELECTid,madlib.dist_norm1(a, b),madlib.dist_norm2(a, b),madlib.dist_pnorm(a, b, 5) AS norm5,madlib.dist_inf_norm(a, b),madlib.squared_dist_norm2(a, b) AS sq_dist_norm2,madlib.cosine_similarity(a, b),madlib.dist_angle(a, b),madlib.dist_tanimoto(a, b),madlib.dist_jaccard(a::text[], b::text[])FROM two_vectors;
结果
id | dist_norm1 | dist_norm2 | norm5 | dist_inf_norm | sq_dist_norm2 | cosine_similarity | dist_angle | dist_tanimoto | dist_jaccard----+------------+------------------+------------------+---------------+---------------+-------------------+--------------------+--------------------+-------------------1 | 2 | 1.4142135623731 | 1.14869835499704 | 1 | 2 | 0.999512076087079 | 0.0312398334302684 | 0.0588235294117647 | 0.6666666666666672 | 48 | 22.6274169979695 | 15.585086360695 | 14 | 512 | 0.985403348449008 | 0.171068996592859 | 0.0498733684005455 | 0.833333333333333
矩阵函数
- 创建一张矩阵表
CREATE TABLE matrix(id integer,m float8[]);INSERT INTO matrix VALUES(1, '{{4,5},{3,5},{9,0}}');
- 调用矩阵函数
SELECTmadlib.get_row(m, 1) AS row_1,madlib.get_row(m, 2) AS row_2,madlib.get_row(m, 3) AS row_3,madlib.get_col(m, 1) AS col_1,madlib.get_col(m, 2) AS col_2FROM matrix;结果:row_1 | row_2 | row_3 | col_1 | col_2-------+-------+-------+---------+---------{4,5} | {3,5} | {9,0} | {4,3,9} | {5,5,0}
聚合函数
- 创建包含向量列的数据表
CREATE TABLE vector(id integer,v float8[]);INSERT INTO vector VALUES(1, '{4,3}'),(2, '{8,6}'),(3, '{12,9}');
- 调用聚合函数
SELECTmadlib.avg(v),madlib.normalized_avg(v),madlib.matrix_agg(v)FROM vector;avg | normalized_avg | matrix_agg-------+----------------+----------------------{8,6} | {0.8,0.6} | {{4,3},{8,6},{12,9}}
