You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在DolphinDB中实现块权重与特征表的内积计算?

问题描述

我有两张表:

表1(tb1):展示各符号所属的块(1表示属于,NULL表示不属于)

SYMBOL | block1 | block2 | block3 | block4
-------|--------|--------|--------|-------
sym1   |        |        | 1      |      
sym2   |        | 1      |        | 1
sym3   | 1      |        |        |      
sym4   |        |        | 1      |      
sym5   |        |        |        | 1

表2(tb2):包含部分符号的三个数值特征(注:并非所有符号都包含在内)

SYMBOL | col1 | col2 | col3
-------|------|------|------
sym1   | 1.1  | 2.1  | 3.1
sym3   | 1.2  | 2.2  | 3.2
sym4   | 1.3  | 2.3  | 3.3

针对tb1中的每个块,需执行以下操作:

  1. 找出所有标记为1的符号;
  2. 为这些符号在tb2中查找对应的特征值(col1、col2、col3,若存在);
  3. 计算以下两者的内积:
    • tb1中块列的权重向量
    • tb2中的每个特征列(col1/col2/col3)

示例

  • block1:仅标记了sym3 → 使用其值(1.2, 2.2, 3.2);
  • block3:sym1 + sym4 → 求和得到(1.1+1.3, 2.1+2.3, 3.1+3.3) = (2.4, 4.4, 6.4);
  • block2/block4:其对应的符号(sym2、sym5)不在tb2中 → 返回空值。

预期输出

col1 col2 col3             
        ---- ---- ----- 
block1| 1.2  2.2  3.2              
block2|                                        
block3| 2.4  4.4  6.4
block4|

请问如何在DolphinDB中实现该内积计算?


解决方案

在DolphinDB中可以通过转置表结构+关联聚合的方式实现需求,具体操作如下:

步骤1:准备测试数据

先创建两张测试表:

// 创建tb1
tb1 = table(
    `sym1`sym2`sym3`sym4`sym5 as SYMBOL,
    [NULL, NULL, 1, NULL, NULL] as block1,
    [NULL, 1, NULL, NULL, NULL] as block2,
    [1, NULL, NULL, 1, NULL] as block3,
    [NULL, 1, NULL, NULL, 1] as block4
)

// 创建tb2
tb2 = table(
    `sym1`sym3`sym4 as SYMBOL,
    [1.1, 1.2, 1.3] as col1,
    [2.1, 2.2, 2.3] as col2,
    [3.1, 3.2, 3.3] as col3
)

步骤2:转置tb1并关联特征数据

将tb1从宽表转为长表,筛选出属于各块的符号,再与tb2关联获取特征值:

// 转置tb1,得到每个块对应的符号列表
tb1Transposed = pivot tb1, SYMBOL, `block1`block2`block3`block4, 1
tb1Long = select blockName, SYMBOL from tb1Transposed unpivot value, blockName where value == 1

// 关联tb2获取特征值
joined = lj(tb1Long, tb2, SYMBOL)

步骤3:按块聚合计算内积

对每个块的特征值求和(即权重向量与特征列的内积,这里权重都是1),并整理成预期格式:

// 按块聚合,计算各特征列的和
result = select sum(col1) as col1, sum(col2) as col2, sum(col3) as col3 from joined group by blockName

// 补充所有块(包括无匹配符号的块),并调整列顺序
allBlocks = table(`block1`block2`block3`block4 as blockName)
finalResult = lj(allBlocks, result, blockName)

// 重命名列并展示
rename!(finalResult, `blockName, ``)
show finalResult

代码说明

  • 转置操作将宽表的块列转为行,方便按块筛选符号;
  • 使用lj(左连接)确保所有块都被保留,即使没有匹配的特征数据;
  • sum函数对应内积计算(因为权重向量中属于块的符号为1,其余为0,内积等价于求和);
  • 最后重命名列并展示,与预期输出格式一致。

内容的提问来源于stack exchange,提问作者Polly

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 22:00:10