SPL 有没有多元线性回归的函数?
一:在用 spl 开发金融类算法, 用到多元线性回归:
在函数参考中找了 linefit() –用最小二乘法线性拟合, 可以得到各个系数,但是缺少:
1:回归分析
2:方差分析
3:以及各系数的标准误差、T 值, Pvalue 等
其中回归分析, 方差分析, 可以自己计算, 但是各系数的标准差,T 值,Pvalue,如果是多元的自己实现起来还是很麻烦的。
二:SPL 集成的算法包中含有 含有 apache math(java)的包, 里面的 regression 就有对应的类库, 没有集成吗?
三:我看教程里面有专门的做模型的工具, 里面应该是有线性回归的算法, 这是比较常见的,难道算法都在那个模型工具中, 而不在 spl 的算法包中?
多元线性拟合有个 ployfit,方差也有个 var(自己算也简单)
在 mathcli 外部库也有一些:http://d.raqsoft.com.cn:6999/esproc/func/math.html
其它统计函数还在追加中,基本上碰到有需求就增加一个。
感谢回复, ployfit 这个是个函数吗? 目前的函数参考中找不到这个函数, 有对应的文档能给发一下吗?
http://d.raqsoft.com.cn:6999/esproc/func/polyfit.html#polyfit
我试了一下, 其实用 linefit 也能出来, 如果是一元的 标准误差, T 值等, 都比较容易计算出来, 多元的, 需要矩阵相关运行, 试了几次, 结果都不对
主要是我看你们有数据挖掘的工具, 这些理论上应该都有的, 所以想问一下
MATHpdf
有个尚未完工的文档,没正式发布,仅供参考
那是两个产品,SPL 可以调用数据挖掘工具来建模和预测 http://c.raqsoft.com.cn/article/1639102948649
但那里面的基础运算还没整理到 SPL 中(正在做,有些是 python 库),当时做的时候是作为两款不同产品开发的
看了一下内容, 可以满足目前的需求, 我验证一下, 再次感谢!
做了试算, 公式和写法没有问题, 但是测试下来好像有个bug
就是在做矩阵运算时, 好像小数有截位,
做了矩阵相乘后, 一个数变为了 0, 其实值应该为:4.56178867206018E-07
=inverse(mul(transpose(A1),A1)) 就是 mul 函数, 正好是最后一个值, 然后再做逆运算, 导致最后一个值为负值,
然后在进行 =A3.conj().(~/sqrt(A12(#)(#))/sqrt(A5/(C1-B1-1))) 负值 sqrt 出不来, 返回 NaN
对应的矩阵数据如下: =inverse(mul(transpose(A1),A1)) 在 mul 的时候出现最后一个值为 0,
1 -0.002846433 8.10218E-06
1 0.015377888 0.000236479
1 -0.005412544 2.92956E-05
1 0.021910675 0.000480078
1 -0.00441259 1.9471E-05
1 0.003141641 9.86991E-06
1 -0.005910337 3.49321E-05
1 -0.003867026 1.49539E-05
1 0.018345113 0.000336543
1 -0.007027675 4.93882E-05
1 0.001264383 1.59867E-06
1 0.009279754 8.61138E-05
1 0.00360201 1.29745E-05
1 -0.011185514 0.000125116
1 0.007826382 6.12523E-05
1 -0.00237409 5.6363E-06
1 -0.008122497 6.5975E-05
1 0.006600291 4.35638E-05
1 0.006564035 4.30866E-05
1 0.004423221 1.95649E-05
1 0.011197864 0.000125392
private final static double scale = 1000000d;
private double getValue(int r, int c, boolean real) {
double d = this.A[r][c];
if (!real) {
d *= scale;
if (d > Long.MIN_VALUE && d < Long.MAX_VALUE) {
d = Math.round(d)/scale;
} else {
d = d / scale;
}
}
return d;
}
由于 double 存储的精度误差,在计算时做了四舍五入的处理。这个处理原来存在 bug,现在做了修改,将在新版中改正,现在的四舍五入处理将根据数值的有效数字处理而不是原来的小数点后位数,但目前对于绝对值小于 1E-10 的数据仍然会作为 0 处理。
目前自己写了一个, mul 的函数, 等更新我再测试一下把。
有个问题还是不明白, 为什么 10 位小数还要置 0, 直接用 double 的有效位数不可以吗?
比如, 一个数据很小,但并是零, 所以参与后续的计算没有问题, 但是如果设置为 0, 就有可能有问题
因为 double 是使用二进制的规则存储的,而不是精确存储,因此在计算中不可避免地存在一些误差。比如用双精度数去计算 3-2.6-0.4,得到的并不是 0,因此原本的规则是对于绝对值很小的数作为 0 去处理。考虑到确实可能会影响小数矩阵的计算,现在修改了规则:在矩阵本身的基础运算中,并不去将小数置零处理。但是,如果需要判断矩阵是否是奇异矩阵,或者判断矩阵是否满秩时,就需要考虑这种极小数的问题了,无法判断它是不是由于误差产生的扰动。在判断奇异矩阵或者满秩矩阵时,极小数将被视为 0 处置。而在使用数值计算时,也必须注意到此类误差的影响,比如 sqrt(3-2.6-0.4),就有可能因为误差扰动出现计算错误。
原本将 1E-10 这样的小数置零,其实就是为了避免存储误差造成的错误。现在将规则进一步收紧,只有绝对值在 1E-14 下的数才会置零,而且仅在判断矩阵是否奇异矩阵或者矩阵是否满秩时去执行。但是误差本身是固有的,使用时必须要知道计算不会是精准的,合理使用四舍五入处理。