ojAlgo 使用 ExpressionsBasedModel 解决最小二乘问题
ojAlgo solve least-squares problem using ExpressionsBasedModel
我试图了解如何使用 ExpressionsBasedModel class 来解决最小二乘问题并构建了一个最小问题,但我没有获得我期望的结果。我的玩具问题是最小化
f(x) = (x - 4)^2
关于 x。很容易看出这个函数的最小值是 x = 4。我写了这个小 Java 程序来使用 ojAlgo 来最小化它:
import org.ojalgo.optimisation.ExpressionsBasedModel;
import org.ojalgo.optimisation.Variable;
import org.ojalgo.optimisation.Expression;
import org.ojalgo.optimisation.Optimisation.Result;
public class OjalgoDemo {
public static void main(String[] args) {
ExpressionsBasedModel model = new ExpressionsBasedModel();
// Minimize f(x) = (x - 4)^2, which has minimum x = 4
// (x - 4)^2 = x^2 - 8x + 16.
// Note that minimum of
// f(x) = x^2 - 8x + k
// is the same no matter the choice of k.
Variable x = model.addVariable("x");
Expression expr = model.addExpression("objective");
// Add the x^2 term
expr.set(x, x, 1.0);
// Add the -8x term
expr.set(x, -8.0);
Result result = model.minimise();
System.out.println("The state: " + result.getState());
System.out.println("The full result: " + result);
}
}
当我 运行 它时,我得到输出
The state: OPTIMAL
The full result: OPTIMAL 0.0 @ { 0 }
但我希望输出表明解决方案 x = 4:
The state: OPTIMAL
The full result: OPTIMAL 0.0 @ { 4 }
为什么 ojAlgo 似乎没有按照我预期的方式解决我的问题?
我特别想使用 ExpressionsBasedModel 稍后将线性不等式约束添加到最小二乘问题,但在此之前我希望能够解决我能想到的最小可能的最小二乘问题。
我使用这些命令编译并运行它:
javac OjalgoDemo.java -classpath ~/.m2/repository/org/ojalgo/ojalgo/47.3.1/ojalgo-47.3.1.jar
java -classpath ".:/home/rulle/.m2/repository/org/ojalgo/ojalgo/47.3.1/ojalgo-47.3.1.jar" OjalgoDemo
您还没有指定 objective 函数是什么。命名某些东西 "objective" 并不能做到...相反,您将 weights
分配给变量 and/or 表达式。在创建优化模型时,可以使用以下代码示例作为起点:https://www.ojalgo.org/code-examples/
问题是你没有设置一个权重的表达式。如果不设置权重,则对objective函数没有贡献。为了使代码按预期工作,您必须添加行
expr.weight(1.0);
所以它显示
Variable x = model.addVariable("x");
Expression expr = model.addExpression("objective");
// Add the x^2 term
expr.set(x, x, 1.0);
// Add the -8x term
expr.set(x, -8.0);
// THIS FIXES IT
expr.weight(1.0);
Result result = model.minimise();
执行这段代码时,我得到了输出
The state: DISTINCT
The full result: DISTINCT -16.0 @ { 4 }
这是我们所期望的。 -16
是因为我们没有常量偏移量。要进一步了解设置权重意味着 expr
将有助于 objective 函数,请添加行 System.out.println("Objective? " + expr.isObjective());
,只有当 true权重已设置。
我试图了解如何使用 ExpressionsBasedModel class 来解决最小二乘问题并构建了一个最小问题,但我没有获得我期望的结果。我的玩具问题是最小化
f(x) = (x - 4)^2
关于 x。很容易看出这个函数的最小值是 x = 4。我写了这个小 Java 程序来使用 ojAlgo 来最小化它:
import org.ojalgo.optimisation.ExpressionsBasedModel;
import org.ojalgo.optimisation.Variable;
import org.ojalgo.optimisation.Expression;
import org.ojalgo.optimisation.Optimisation.Result;
public class OjalgoDemo {
public static void main(String[] args) {
ExpressionsBasedModel model = new ExpressionsBasedModel();
// Minimize f(x) = (x - 4)^2, which has minimum x = 4
// (x - 4)^2 = x^2 - 8x + 16.
// Note that minimum of
// f(x) = x^2 - 8x + k
// is the same no matter the choice of k.
Variable x = model.addVariable("x");
Expression expr = model.addExpression("objective");
// Add the x^2 term
expr.set(x, x, 1.0);
// Add the -8x term
expr.set(x, -8.0);
Result result = model.minimise();
System.out.println("The state: " + result.getState());
System.out.println("The full result: " + result);
}
}
当我 运行 它时,我得到输出
The state: OPTIMAL
The full result: OPTIMAL 0.0 @ { 0 }
但我希望输出表明解决方案 x = 4:
The state: OPTIMAL
The full result: OPTIMAL 0.0 @ { 4 }
为什么 ojAlgo 似乎没有按照我预期的方式解决我的问题?
我特别想使用 ExpressionsBasedModel 稍后将线性不等式约束添加到最小二乘问题,但在此之前我希望能够解决我能想到的最小可能的最小二乘问题。
我使用这些命令编译并运行它:
javac OjalgoDemo.java -classpath ~/.m2/repository/org/ojalgo/ojalgo/47.3.1/ojalgo-47.3.1.jar
java -classpath ".:/home/rulle/.m2/repository/org/ojalgo/ojalgo/47.3.1/ojalgo-47.3.1.jar" OjalgoDemo
您还没有指定 objective 函数是什么。命名某些东西 "objective" 并不能做到...相反,您将 weights
分配给变量 and/or 表达式。在创建优化模型时,可以使用以下代码示例作为起点:https://www.ojalgo.org/code-examples/
问题是你没有设置一个权重的表达式。如果不设置权重,则对objective函数没有贡献。为了使代码按预期工作,您必须添加行
expr.weight(1.0);
所以它显示
Variable x = model.addVariable("x");
Expression expr = model.addExpression("objective");
// Add the x^2 term
expr.set(x, x, 1.0);
// Add the -8x term
expr.set(x, -8.0);
// THIS FIXES IT
expr.weight(1.0);
Result result = model.minimise();
执行这段代码时,我得到了输出
The state: DISTINCT
The full result: DISTINCT -16.0 @ { 4 }
这是我们所期望的。 -16
是因为我们没有常量偏移量。要进一步了解设置权重意味着 expr
将有助于 objective 函数,请添加行 System.out.println("Objective? " + expr.isObjective());
,只有当 true权重已设置。