gpt4 book ai didi

java - R.loess 和 org.apache.commons.math LoessInterpolator 的区别

转载 作者:搜寻专家 更新时间:2023-10-30 21:29:24 25 4
gpt4 key购买 nike

我正在尝试使用 apache.commons.math 库计算将 R 脚本转换为 java 的过程。我可以使用 org.apache.commons.math.analysis.interpolation.LoessInterpolator 吗?代替 R loess ?我无法得到相同的结果。

编辑

这是一个 java 程序,它创建一个随机数组 (x,y) 并使用 LoessInterpolator 或通过调用 R 计算黄土。最后,打印结果。

import java.io.*;
import java.util.Random;

import org.apache.commons.math.analysis.interpolation.LoessInterpolator;


public class TestLoess
{
private String RScript="/usr/local/bin/Rscript";
private static class ConsummeInputStream
extends Thread
{
private InputStream in;
ConsummeInputStream(InputStream in)
{
this.in=in;
}
@Override
public void run()
{
try
{
int c;
while((c=this.in.read())!=-1)
System.err.print((char)c);
}
catch(IOException err)
{
err.printStackTrace();
}
}
}
TestLoess()
{

}
private void run() throws Exception
{
int num=100;
Random rand=new Random(0L);
double x[]=new double[num];
double y[]=new double[x.length];
for(int i=0;i< x.length;++i)
{
x[i]=rand.nextDouble()+(i>0?x[i-1]:0);
y[i]=Math.sin(i)*100;
}
LoessInterpolator loessInterpolator=new LoessInterpolator(
0.75,//bandwidth,
2//robustnessIters

);
double y2[]=loessInterpolator.smooth(x, y);

Process proc=Runtime.getRuntime().exec(
new String[]{RScript,"-"}
);
ConsummeInputStream errIn=new ConsummeInputStream(proc.getErrorStream());
BufferedReader stdin=new BufferedReader(new InputStreamReader(proc.getInputStream()));
PrintStream out=new PrintStream(proc.getOutputStream());
errIn.start();
out.print("T<-as.data.frame(matrix(c(");
for(int i=0;i< x.length;++i)
{
if(i>0) out.print(',');
out.print(x[i]+","+y[i]);
}
out.println("),ncol=2,byrow=TRUE))");
out.println("colnames(T)<-c('x','y')");
out.println("T2<-loess(y ~ x, T)");
out.println("write.table(residuals(T2),'',col.names= F,row.names=F,sep='\\t')");
out.flush();
out.close();
double y3[]=new double[x.length];
for(int i=0;i< y3.length;++i)
{
y3[i]=Double.parseDouble(stdin.readLine());
}
System.out.println("X\tY\tY.java\tY.R");
for(int i=0;i< y3.length;++i)
{
System.out.println(""+x[i]+"\t"+y[i]+"\t"+y2[i]+"\t"+y3[i]);
}
}

public static void main(String[] args)
throws Exception
{
new TestLoess().run();
}
}

编译&执行:

javac -cp commons-math-2.2.jar TestLoess.java && java -cp commons-math-2.2.jar:. TestLoess

输出:

X   Y   Y.java  Y.R
0.730967787376657 0.0 6.624884763714674 -12.5936186703287
0.9715042030481429 84.14709848078965 6.5263049649584 71.9725380029913
1.6089216283982513 90.92974268256818 6.269100654071115 79.839773167581
2.159358633515885 14.112000805986721 6.051308261720918 3.9270340708818
2.756903911313087 -75.68024953079282 5.818424835586378 -84.9176311089431
3.090122310789737 -95.89242746631385 5.689740879461759 -104.617807889069
3.4753114955304554 -27.941549819892586 5.541837854229562 -36.0902352062634
4.460153035730264 65.6986598718789 5.168028655980764 58.9472823439219
5.339335553602744 98.93582466233818 4.840314399516663 93.3329030534449
6.280584733084859 41.21184852417566 4.49531113985498 36.7282165788057
6.555538699120343 -54.40211108893698 4.395343460231256 -58.5812856445538
6.68443584999412 -99.99902065507035 4.348559404444451 -104.039069260889
6.831037507640638 -53.657291800043495 4.295400167908642 -57.5419313320511
6.854275630124528 42.016703682664094 4.286978656933373 38.1564179414478
7.401015387322993 99.06073556948704 4.089252482141094 95.7504087842369
8.365502247999844 65.02878401571168 3.7422883733498726 62.5865641279576
8.469992934250815 -28.790331666506532 3.704793544880599 -31.145867173504
9.095139297716374 -96.13974918795569 3.4805388562453574 -98.0047896609079
9.505935493207435 -75.09872467716761 3.3330472034239405 -76.6664588290508

y 的输出值在 R 和 Java 之间明显不同; Y.R 列看起来不错(它接近原始的 Y 列)。我应该如何更改它以获得 Y.java ~ Y.R ?

最佳答案

您需要更改三个输入参数的默认值以使 Java 和 R 版本相同:

  1. Java LoessInterpolator 只做线性局部多项式回归,但 R 支持线性(degree=1)、二次(degree=2)和一个奇怪的 degree=0 选项。所以你需要在 R 中指定 degree=1 以与 Java 相同。

  2. LoessInterpolator 默认迭代次数 DEFAULT_ROBUSTNESS_ITERS=2,但 R 默认 iterations=4。所以需要在R中设置control = loess.control(iterations=X)(X为迭代次数)。

  3. LoessInterpolator 默认为 DEFAULT_BANDWIDTH=0.3 但 R 默认为 span=0.75

关于java - R.loess 和 org.apache.commons.math LoessInterpolator 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12704658/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com