如何在Quantrix中使用Groovy实现Simple Linear Regression自定义函数
简单线性回归自定义函数问题排查与实现方案
现有代码问题说明
- 第一版代码问题:
- 未实现
slope()、intercept()两个核心计算函数,属于逻辑缺失 - 参数类型错误:计算回归需要至少2组样本,因此因变量、自变量应为数组类型,而非单个double值
- 语法错误:变量声明重复书写
double关键字,不符合语法规范
- 未实现
- 第二版代码问题:
- 调用的
SimpleRegression属于Apache Commons Math第三方类,未导入依赖时无法识别 - 参数仍为单个double值,无法传入多组样本计算回归系数
- 调用的
- 第三版测试代码问题:
- 未导入Apache Commons Math的
SimpleRegression类,编译器无法识别该类 - 实例化类时遗漏
new关键字,语法错误 - 仅传入1组样本点,无法计算线性回归系数
- 存在无意义的空
addData()调用
- 未导入Apache Commons Math的
可直接运行的实现方案
方案1:原生Groovy实现(无额外依赖,推荐Quantrix环境使用)
无需导入任何第三方库,直接复制即可在Groovy环境中运行,支持多组样本输入:
// 入参说明:y为因变量数组,x为自变量数组,xTest为待预测的x值 double simpleLinearRegression(double[] y, double[] x, double xTest) { // 校验样本数量一致且不少于2组 if (y.size() != x.size() || y.size() < 2) { throw new IllegalArgumentException("样本数量需一致且不少于2组") } int n = y.size() // 计算x、y的平均值 double xMean = x.sum() / n double yMean = y.sum() / n // 计算斜率和截距 double numerator = 0 double denominator = 0 for (int i = 0; i < n; i++) { numerator += (x[i] - xMean) * (y[i] - yMean) denominator += Math.pow(x[i] - xMean, 2) } double slope = numerator / denominator double intercept = yMean - slope * xMean // 返回预测结果 return intercept + slope * xTest }
方案2:基于Apache Commons Math实现(需环境已导入commons-math3依赖)
如果你的Quantrix环境已经引入了Apache Commons Math库,可以直接调用官方封装好的类:
// 首先导入依赖类 import org.apache.commons.math3.stat.regression.SimpleRegression double simpleLinearRegression(double[] y, double[] x, double xTest) { if (y.size() != x.size() || y.size() < 2) { throw new IllegalArgumentException("样本数量需一致且不少于2组") } SimpleRegression regression = new SimpleRegression() // 批量添加样本数据 for (int i = 0; i < x.size(); i++) { regression.addData(x[i], y[i]) } return regression.predict(xTest) }
使用示例
// 样本示例:x=[1,2,3,4,5], y=[2,4,5,4,5],预测x=6时的y值 double[] x = [1,2,3,4,5] as double[] double[] y = [2,4,5,4,5] as double[] double predict = simpleLinearRegression(y, x, 6) println predict // 输出结果约为5.8
内容的提问来源于stack exchange,提问作者Hector Devough
相关产品推荐
相关产品推荐

