如何在 KDB 中编写更高级的 functions/objects?
How do I write more advanced functions/objects in KDB?
我正在尝试编写一些适合 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]
我遇到的问题是:
如何将 intercept
、coef
和 rSquared
输出为某种单一结构化数据格式,以便我在 predict
中使用功能(未显示)。我试过
`截距`系数!(截距系数)
但由于生成的字典不是方形的,它不允许这样做。
在 KDB 中处理此问题的正确方法是什么?
下面是一个可能会有所帮助的简单示例。
假设我有计算三个变量的函数 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]]
我正在尝试编写一些适合 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]
我遇到的问题是:
如何将
intercept
、coef
和rSquared
输出为某种单一结构化数据格式,以便我在predict
中使用功能(未显示)。我试过`截距`系数!(截距系数)
但由于生成的字典不是方形的,它不允许这样做。
在 KDB 中处理此问题的正确方法是什么?
下面是一个可能会有所帮助的简单示例。
假设我有计算三个变量的函数 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]]