Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.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 计算一系列值的斜率_Java_Math_Graphing - Fatal编程技术网

Java 计算一系列值的斜率

Java 计算一系列值的斜率,java,math,graphing,Java,Math,Graphing,我有两个长度相等的数组。以下函数尝试使用这些数组计算坡度。它返回每个点之间斜率的平均值。对于下面的数据集,我似乎得到了与Excel和Google文档不同的值 double[] x_values = { 1932, 1936, 1948, 1952, 1956, 1960, 1964, 1968, 1972, 1976, 1980 }; double[] y_values = { 197, 203, 198, 204, 212, 216, 218,

我有两个长度相等的数组。以下函数尝试使用这些数组计算坡度。它返回每个点之间斜率的平均值。对于下面的数据集,我似乎得到了与Excel和Google文档不同的值

        double[] x_values = { 1932, 1936, 1948, 1952, 1956, 1960, 1964, 1968,
            1972, 1976, 1980 };
    double[] y_values = { 197, 203, 198, 204, 212, 216, 218, 224, 223, 225,
            236 };



public static double getSlope(double[] x_values, double[] y_values)
        throws Exception {

    if (x_values.length != y_values.length)
        throw new Exception();

    double slope = 0;

    for (int i = 0; i < (x_values.length - 1); i++) {
        double y_2 = y_values[i + 1];
        double y_1 = y_values[i];

        double delta_y = y_2 - y_1;

        double x_2 = x_values[i + 1];
        double x_1 = x_values[i];

        double delta_x = x_2 - x_1;

        slope += delta_y / delta_x;
    }

    System.out.println(x_values.length);
    return slope / (x_values.length);
}
double[]x_值={193219361948 195219956196019641968,
1972, 1976, 1980 };
双[]y_值={197、203、198、204、212、216、218、224、223、225,
236 };
公共静态双getSlope(双[]x_值,双[]y_值)
抛出异常{
if(x_values.length!=y_values.length)
抛出新异常();
双斜率=0;
对于(int i=0;i<(x_values.length-1);i++){
双y_2=y_值[i+1];
双y_1=y_值[i];
双delta_y=y_2-y_1;
双x_2=x_值[i+1];
双x_1=x_值[i];
双delta_x=x_2-x_1;
斜率+=δy/δx;
}
System.out.println(x_值.长度);
返回斜率/(x_值.长度);
}
输出

谷歌:0.755

getSlope():0.9621212

Excel:0.7501


您应该除以
x_values.length-1
。坡度的数量是成对的


编辑:我的评论中的Wiki示例演示了如何计算确定线性回归线斜率的alpha和beta

此函数对您帮助不大,因为它没有考虑到不同线段的宽度。考虑将其应用于点(0,0),(10001000),和(1001, 2000)对(0,0),(1,1)和(2, 1001)的差异。这两种情况都有连续的斜率1和1000,但它们看起来大不相同

您需要实现最小二乘法:找到最接近数据集的直线


还有一条建议:永远不要抛出
java.lang.Exception
。始终选择更具体的异常,即使您必须自己编写类。使用您的代码的人需要处理
java.lang.Exception
,这会严重干扰其他代码。

我打赌其他两种方法正在计算,而您没有

当我使用验证这个猜想时,我也得到了大约0.755的斜率:

> summary(lm(y~x))

Call:
lm(formula = y ~ x)

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept) -1.265e+03  1.793e+02  -7.053 5.97e-05 ***
x            7.551e-01  9.155e-02   8.247 1.73e-05 ***
相关编号为
7.551e-01
。还值得注意的是,该线的截距约为-1265

以下是最小二乘拟合的图片:


关于在代码中实现这一点,请参见编辑:如果可以选择,请使用Apache Commons数学类。 否则,这里有一个计算斜率和截距的方法,应该产生与excel和apache相同的结果:

private static double intercept(List<Double> yList, List<Double> xList) {
    if (yList.size() != xList.size())
        throw new IllegalArgumentException("Number of y and x must be the same");
    if (yList.size() < 2)
        throw new IllegalArgumentException("Need at least 2 y, x");

    double yAvg = average(yList);
    double xAvg = average(xList);

    double sumNumerator = 0d;
    double sumDenominator = 0d;
    for (int i = 0; i < yList.size(); i++) {
        double y = yList.get(i);
        double x = xList.get(i);
        double yDiff = y - yAvg;
        double xDiff = x - xAvg;
        double numerator = xDiff * yDiff;
        double denominator = xDiff * xDiff;
        sumNumerator += numerator;
        sumDenominator += denominator;
    }

    double slope = sumNumerator / sumDenominator;
    double intercept = yAvg - (slope * xAvg);
    return intercept;
}

private static double average(Collection<Double> doubles) {
    return doubles.stream().collect(Collectors.averagingDouble(d -> d));
}
私有静态双截取(列表yList、列表xList){
如果(yList.size()!=xList.size())
抛出新的IllegalArgumentException(“y和x的数量必须相同”);
if(yList.size()<2)
抛出新的IllegalArgumentException(“至少需要2 y,x”);
双yAvg=平均值(yList);
双xAvg=平均值(xList);
双分子=0d;
双总和分母=0d;
对于(int i=0;id));
}
资料来源:

x_值的输出。长度为11。减去1会得到更高的平均斜率。您确定在Excel/Google文档中应用了正确的平均逻辑吗?你能发布宏吗?
SLOPE(B2:B22,A2:A22)
这里,B列包含
y\u值
,A列包含
x\u值
。酷。给我几分钟来检查一下。斜率(Y,X)计算线性回归线的斜率。快速搜索表明,java中计算坡度的方法与计算坡度的方法不同。请参阅有关计算的数值示例。这对于代码来说应该是微不足道的。最小二乘法只是这个问题更广泛解决方案的一部分: