范数和距离函数(Norms and Distance functions)

linalg模块由一些基本线性代数操作的功能函数组成。在实现新算法的时候可以使用某些函数。这些函数作用于向量vector(一维float8数组)和矩阵matrix(二维float8数组)。注意其它数组类型在调用这些函数前可能需要转换到float8[]。

每个功能函数的文档请查阅linalg.sql_in

线性代数功能函数

norm1() 向量vector的1范数范数和距离函数 - 图2
norm2() 向量vector的2范数范数和距离函数 - 图3
dist_norm1() 两个向量vector之间的1范数范数和距离函数 - 图4
dist_norm2() 两个向量vector之间的2范数范数和距离函数 - 图5
dist_pnorm() 两个向量vector之间的generic p范数范数和距离函数 - 图6
dist_inf_norm() 两个向量vector之间的ginfinity-范数范数和距离函数 - 图7
squared_dist_norm2() 两个向量vector之间的squaared 2范数范数和距离函数 - 图8
cosine_similarity() 两个向量vector之间的cosine值范数和距离函数 - 图9
dist_angle() 两个向量vector在欧式空间Euclidean space的夹角angle。范数和距离函数 - 图10
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个向量列的数据库表,并插入数据

  1. CREATE TABLE two_vectors(
  2. id integer,
  3. a float8[],
  4. b float8[]);
  5. INSERT INTO two_vectors VALUES
  6. (1, '{3,4}', '{4,5}'),
  7. (2, '{1,1,0,-4,5,3,4,106,14}', '{1,1,0,6,-3,1,2,92,2}');
  8. select * from two_vectors;
  9. id | a | b
  10. ----+-------------------------+-----------------------
  11. 1 | {3,4} | {4,5}
  12. 2 | {1,1,0,-4,5,3,4,106,14} | {1,1,0,6,-3,1,2,92,2}
  1. 调用范数函数

    1. SELECT
    2. id,
    3. madlib.norm1(a),
    4. madlib.norm2(a)
    5. FROM two_vectors;
    6. 结果
    7. id | norm1 | norm2
    8. ----+-------+------------------
    9. 1 | 7 | 5
    10. 2 | 138 | 107.238052947636
    11. (2 rows)
  2. 调用距离函数

    1. SELECT
    2. id,
    3. madlib.dist_norm1(a, b),
    4. madlib.dist_norm2(a, b),
    5. madlib.dist_pnorm(a, b, 5) AS norm5,
    6. madlib.dist_inf_norm(a, b),
    7. madlib.squared_dist_norm2(a, b) AS sq_dist_norm2,
    8. madlib.cosine_similarity(a, b),
    9. madlib.dist_angle(a, b),
    10. madlib.dist_tanimoto(a, b),
    11. madlib.dist_jaccard(a::text[], b::text[])
    12. FROM two_vectors;

    结果

    1. id | dist_norm1 | dist_norm2 | norm5 | dist_inf_norm | sq_dist_norm2 | cosine_similarity | dist_angle | dist_tanimoto | dist_jaccard
    2. ----+------------+------------------+------------------+---------------+---------------+-------------------+--------------------+--------------------+-------------------
    3. 1 | 2 | 1.4142135623731 | 1.14869835499704 | 1 | 2 | 0.999512076087079 | 0.0312398334302684 | 0.0588235294117647 | 0.666666666666667
    4. 2 | 48 | 22.6274169979695 | 15.585086360695 | 14 | 512 | 0.985403348449008 | 0.171068996592859 | 0.0498733684005455 | 0.833333333333333

矩阵函数

  1. 创建一张矩阵表
    1. CREATE TABLE matrix(
    2. id integer,
    3. m float8[]);
    4. INSERT INTO matrix VALUES(1, '{{4,5},{3,5},{9,0}}');
  2. 调用矩阵函数
    1. SELECT
    2. madlib.get_row(m, 1) AS row_1,
    3. madlib.get_row(m, 2) AS row_2,
    4. madlib.get_row(m, 3) AS row_3,
    5. madlib.get_col(m, 1) AS col_1,
    6. madlib.get_col(m, 2) AS col_2
    7. FROM matrix;
    8. 结果:
    9. row_1 | row_2 | row_3 | col_1 | col_2
    10. -------+-------+-------+---------+---------
    11. {4,5} | {3,5} | {9,0} | {4,3,9} | {5,5,0}

聚合函数

  1. 创建包含向量列的数据表
    1. CREATE TABLE vector(
    2. id integer,
    3. v float8[]);
    4. INSERT INTO vector VALUES
    5. (1, '{4,3}'),
    6. (2, '{8,6}'),
    7. (3, '{12,9}');
  2. 调用聚合函数
    1. SELECT
    2. madlib.avg(v),
    3. madlib.normalized_avg(v),
    4. madlib.matrix_agg(v)
    5. FROM vector;
    6. avg | normalized_avg | matrix_agg
    7. -------+----------------+----------------------
    8. {8,6} | {0.8,0.6} | {{4,3},{8,6},{12,9}}