Java 计算一系列值的斜率
我有两个长度相等的数组。以下函数尝试使用这些数组计算坡度。它返回每个点之间斜率的平均值。对于下面的数据集,我似乎得到了与Excel和Google文档不同的值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,
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中计算坡度的方法与计算坡度的方法不同。请参阅有关计算的数值示例。这对于代码来说应该是微不足道的。最小二乘法只是这个问题更广泛解决方案的一部分: