Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的Logistic回归_Java - Fatal编程技术网

Java中的Logistic回归

Java中的Logistic回归,java,Java,我们需要在Java中进行逻辑回归。我们在Python中使用了这段代码,在Java中基本上也需要这段代码。我被指示去Weka,但许可证是非商业性的 我发现Omegahat API具有类似Scipy的BFGS最小化,但我无法理解API:我想用模型实现一个类,并放入似然函数。但是model.eval接受一个modelpointumeric,它也有一个eval。在任何情况下,它都不像使用numpy的python代码那样与数学紧密相关。是否使用或维护omegahat api?我找不到它的邮件列表。如果您找

我们需要在Java中进行逻辑回归。我们在Python中使用了这段代码,在Java中基本上也需要这段代码。我被指示去Weka,但许可证是非商业性的


我发现Omegahat API具有类似Scipy的BFGS最小化,但我无法理解API:我想用模型实现一个类,并放入似然函数。但是model.eval接受一个modelpointumeric,它也有一个eval。在任何情况下,它都不像使用numpy的python代码那样与数学紧密相关。是否使用或维护omegahat api?我找不到它的邮件列表。

如果您找不到任何其他内容,请查看:它是一个轻量级、自包含的数学和统计组件库,用于解决Java编程语言或Commons Lang中无法解决的最常见问题


祝你好运。

Weka拥有商业版许可证,有关详细信息,请参阅


然而,如果logistic回归是您需要的唯一数据挖掘技术,那么请看一看,这是一种非常有用的方法

感谢您的投入。经过多次搜索,我发现:这几乎是numpy实现工作原理的1:1翻译,它允许我们自己用数学公式进行逻辑回归。因此,我可以使用python类实现必要的4-5种方法,然后将其传递给BFGS解算器以执行逻辑回归

它工作得很好,我们唯一需要认识到的是Mallet最大化了函数,Numpy有一个最小值。

只有两个类(加上一个实用程序)中有一个。它可能没有经过优化,但没有可下载的依赖项


我创建了一个将其进一步简化为单个文件的模型。

如前所述,您可以使用Apache Commons Math将逻辑曲线拟合到数据中。来自apache math的函数比标准逻辑函数更通用。它有6个参数(
k,m,b,q,a,n
),而标准逻辑函数有3个参数(
k,m,b
),但是,如果
q=0.0
a=0.0
,和
q=1.0
,则广义函数简化为3参数函数。
q、a和n的值主要影响曲线的偏移和对称性

示例代码显示了如何使函数适合使用标准函数生成的数据。在这种情况下,拟合是微不足道的(因为数据来自logistic方程)。如果您愿意,可以使用
xvalues
yvalues
引入噪声或扭曲曲线,以提供更真实的场景

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.math3.analysis.ParametricUnivariateFunction;
import org.apache.commons.math3.analysis.function.Logistic;
import org.apache.commons.math3.fitting.SimpleCurveFitter;
import org.apache.commons.math3.fitting.WeightedObservedPoint;


public class LogisticFit {

    public static void main(String[] args) {

        double[] xvalues = new double[]{-6.0,-5.0,-4.0,-3.0,-2.0,-1.0,0.0,1.0,2.0,3.0,4.0,5.0,6.0};
        /*
         * These are Y values for values of x for a "standard" logistic equation
         */
        double[] yvalues = new double[]{0.002472623, 0.006692851, 0.01798621, 0.047425873, 0.119202922, 0.268941421,
                0.5, 0.731058579, 0.880797078, 0.952574127, 0.98201379, 0.993307149, 0.997527377};

        List<WeightedObservedPoint> weightedObservedPoints = new ArrayList<>();

        for (int x = 0; x < yvalues.length; x++) {
            weightedObservedPoints.add( new WeightedObservedPoint(1.0, xvalues[x], yvalues[x]));
        }

        /* Starting Estimates */
        /* Lower asymptote. A reasonable estimate is the minimum observed value*/
        double a = yvalues[0]; //assumes observations are sorted
        /* Upper asymptote. The 'carrying capacity'. A reasonable estimate is the maximum observed value */
        double k = yvalues[ yvalues.length -1 ];
        /* Growth rate. For a standard logistic curve this is 1 so 1 is a reasonable estimate*/
        double b = 1.0;
        /* Parameter that affects near which asymptote maximum growth occurs. 1.0 if we assume the curve is symmetric*/
        double n = 1.0;
        /* Parameter that affects the position of the curve along the ordinate axis. */
        double q = 1.0;
        /*
         * Abscissa of maximum growth. The x value where inflection point of the curve occurs. The value of x when the
         * population is halfway to the maximum. A reasonable estimate is halfway along the x axis if we assume symmetry
         * */
        double m = xvalues[ xvalues.length / 2];

        double[] estimates = new double[]{k, m, b, q, a, n};
        /* the logistic function we want to fit */
        ParametricUnivariateFunction logisticFunction = new Logistic.Parametric();
        SimpleCurveFitter curveFitter = SimpleCurveFitter.create(logisticFunction, estimates);
        final double[] fit = curveFitter.fit(weightedObservedPoints);

        System.out.println("estimated k = "+ fit[0] + ", True value = 1.0");
        System.out.println("estimated m = "+ fit[1] + ", True value = 0.0");
        System.out.println("estimated b = "+ fit[2] + ", True value = 1.0");
        System.out.println("estimated q = "+ fit[3] + ", True value = 1.0");
        System.out.println("estimated a = "+ fit[4] + ", True value = 0.0");
        System.out.println("estimated n = "+ fit[5] + ", True value = 1.0");
        System.out.println("value of y at estimated curve inflection point (m) = "+logisticFunction.value(m, fit));
    }
}

您好,我查看了一下代码,优化器本身没有使用成本函数(lik),所以我想知道这里实际优化了什么。很明显,成本函数的梯度很容易计算,但据我所知,权重更新并不正确。@WernerVanBelle我实际上不知道如何计算逻辑回归,我只是将其压缩到一个文件中进行测试,但确实有一些事情感觉做得不好。如果你发现了问题,我很乐意纠正!
estimated k = 0.9999999999617879, True value = 1.0
estimated m = 0.05131427607556755, True value = 0.0
estimated b = 1.0000000013063237, True value = 1.0
estimated q = 0.949980068678136, True value = 1.0
estimated a = 4.555478390914705E-12, True value = 0.0
estimated n = 1.0000000008645784, True value = 1.0
value of y at estimated curve inflection point (m) = 0.4999999999837729