kdb读取浮点数精度丢失致协方差不满足PSD约束解决方案咨询
问题本质
读取阶段出现的浮点数精度偏差,根源是kdb+的F类型为32位单精度浮点数,仅能支持6~7位有效数字存储,无法承载9位有效数字的科学计数法数值,和显示层配置无关。示例中原始值-5.801050672E-01被解析为-0.50810507,就是单精度浮点数截断、解析错位的典型表现,这类误差累积后自然会破坏协方差矩阵的正半定属性。
可落地的解决方法
- 从解析源头更换数值承接类型:不要在读取后用
F做强制类型转换,读取平面文件时直接将数值列指定为128位长浮点数类型(kdb+中类型标识为h,单值占16字节),该类型可支持15~17位有效数字,完全满足9位精度的读取要求,不会出现科学计数法解析偏差。
若使用0:读取分隔符平面文件,在类型定义段直接标记对应数值列类型为h即可,示例写法:
注意:如果已经把数值读成// 第1、2列按长浮点数解析,跳过表头 ("hh";1 2) 0: `:cov_matrix_data.csvF类型再转h没有任何作用,精度损失在文本解析为F的瞬间已经发生,必须在文本转数值的第一步就用高精度类型承接。 - 协方差矩阵PSD修正方案:如果存量已读取数据存在微小精度偏差,可采用特征值截断法修正,比给单位矩阵加随机噪声的方案更严谨:对矩阵做特征值分解,将所有小于0的特征值截断为0,再用原特征向量重构矩阵,即可得到满足PSD要求的最近邻协方差矩阵,不会引入无意义的随机扰动。
此前尝试方案无效的原因
\P是kdb+控制台的显示精度配置,仅控制打印输出的数字长度,不会改变内存中存储的数值实际精度.Q.f是数值格式化输出工具,同样只作用于显示环节,对读取阶段的文本转数值解析逻辑没有任何影响
内容的提问来源于stack exchange,提问作者jeonw
相关产品推荐
相关产品推荐

