【问题标题】:How do I write more advanced functions/objects in KDB?如何在 KDB 中编写更高级的函数/对象?
【发布时间】:2021-12-09 03:33:56
【问题描述】:

我正在尝试写一些适合x;y 的线性回归的东西,如下所示。

fit: {
  coef: enlist[y] lsq flip[x];
  intercept: avg y;
  rSquared: sum raze[(intercept + (raze coef mmu flip[x]) - y) xexp 2];
  0"intercept";
  0"coef"; }
fit[x;y]

我遇到的问题是:

  • 如何将interceptcoefrSquared 输出为某种单一的结构化数据格式,我可以在predict 函数中使用(未显示)。我试着做

    `intercept`coef!(拦截系数)

但由于结果字典不是方形的,它不允许这样做。

在 KDB 中处理这个问题的正确方法是什么?

【问题讨论】:

标签: kdb


【解决方案1】:

这是一个可能有帮助的简单示例。 假设我有计算三个变量的函数f

f:{[x] n1:x+10; n2:x+20; n3:x+30;}

我可以让 f 将这三个都输出为一个列表:

f:{[x] n1:x+10; n2:x+20; n3:x+30;:(n1;n2;n3);}

如果我有一个函数 g 将三个输入相加,我可以将 f 的输出输入它,如下所示:

q)g:{[x;y;z] x+y+z};
q)g . f[10]

. 表示法会将其右参数的元素应用于其左参数,就好像它们是不同的变量一样。

当然,您可以将f[10] 留作列表。 在这种情况下,您的 g 将需要一个新定义:

q)g:{[l] l[0] + l[1] + l[2]}
q)g[f[10]]

使用字典也可以做到这一点,但您可以用符号索引替换数字索引。

q)f:{[x] n1:x+10; n2:x+20; n3:x+30;:`n1`n2`n3!(n1;n2;n3);}
q)g:{[d] d[`n1] + d[`n2] + d[`n3]}
q)g[f[10]]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-15
    • 2013-03-21
    • 1970-01-01
    • 2014-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-21
    相关资源
    最近更新 更多