首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >KDB:加权中值

KDB:加权中值
EN

Stack Overflow用户
提问于 2022-03-22 21:46:41
回答 2查看 156关注 0票数 1

如何计算KDB中的加权中值?

我可以看到,有一个函数med作为一个简单的中位数,但我找不到类似于波纹wmed

非常感谢您的帮助!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-03-23 09:26:41

对于v和W权数wmed v where w占用较大的w值的空间。

相反,将w排序为v的升序,并寻找累积和达到其之和一半的位置。

代码语言:javascript
复制
q)show v:10?100
17 23 12 66 36 37 44 28 20 30
q)show w:.001*10?1000
0.418 0.126 0.077 0.829 0.503 0.12 0.71 0.506 0.804 0.012
q)med v where "j"$w*1000
36f

q)w iasc v / sort w into ascending order of v
0.077 0.418 0.804 0.126 0.506 0.012 0.503 0.12 0.71 0.829
q)0.5 1*(sum;sums)@\:w iasc v / half the sum and cumulative sums of w
2.0525
0.077 0.495 1.299 1.425 1.931 1.943 2.446 2.566 3.276 4.105
q).[>]0.5 1*(sum;sums)@\:w iasc v / compared
1111110000b
q)v i sum .[>]0.5 1*(sum;sums)@\:w i:iasc v / weighted median
36

q)\ts:1000 med v where "j"$w*1000
18 132192
q)\ts:1000 v i sum .[>]0.5 1*(sum;sums)@\:w i:iasc v
2 2576

q)wmed:{x i sum .[>]0.5 1*(sum;sums)@\:y i:iasc x}

一些向量技术值得注意:

  • 使用左各 (sum;sums)@\:应用两个函数,并对结果使用应用 .和操作符,而不是设置变量,例如(0.5*sum yi)>sums yi:y i或定义内部lambda {sums[x]<0.5*sum x}y i
  • iasc对一个列表进行分级以排序另一个列表
  • 多重并置映射:v i sum ..
票数 5
EN

Stack Overflow用户

发布于 2022-03-22 22:41:46

您可以通过复制(使用where)有效地对中位数进行加权:

代码语言:javascript
复制
q)med 10 34 23 123 5 56 where 4 1 1 1 1 1
10f
q)med 10 34 23 123 5 56 where 1 1 1 1 1 4
56f
q)med 10 34 23 123 5 56 where 1 2 1 3 2 1
34f

如果你的权重是百分比(例如0.15,0.10,0.20,0.30,0.25),那么将它们转换成相等的整数/计数数。

代码语言:javascript
复制
q)med 1 2 3 4 5 where "i"$100*0.15 0.10 0.20 0.30 0.25
4f
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71579330

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档