在使用 R 计算数据挖掘技术算法的准确性的大学项目期间,我和我的主管同意实施此处显示的 DP 算法http://www.iwaponline.com/jh/012/0318/0120318.pdf,对于每隔 15 分钟获取的河流高度时间序列,需要一个计算所有分段路径的函数。
在编写此函数“最小化”时,-- 顺便说一句未完成,但仍然有效。我遇到了以下错误“错误:C 堆栈使用量太接近限制”,我不想继续,直到这部分首先工作下面是我的 R 代码,然后是我试图复制的函数的 java 代码进一步遵循示例测试系列是:1,2,3,4,5,4,3,2,1,2,3,4,5 所以 T=13 目前我一直在尝试让示例与 K 一起运行=3,但 Minimize 函数最终将在 K=1 到 K=20 的循环中使用。java中的calerror函数计算我的R代码中每个段的lms错误我还没有实现这个函数所以目前被注释掉了。Minimize 函数的目标是计算每个可能段的误差,并放入一个名为 cost 的数组中,
如果有人知道我为什么会得到并可能纠正这个错误,那么非常需要您的帮助,如果有人对将 JAVA 代码转换为 R 代码有任何建议,也将不胜感激。
#Recursive method for exploring all paths
library(zoo)
fmt = '%d-%b-%Y %H:%M'
data = read.zoo("desktop/test.csv",header=TRUE,sep=',',tz='',format=fmt,index=0:1)
Values = coredata(data) #strips date/time of values for computation
Number=plain #array of indexed values
T=length(data)
r=1
K=3
Compare = function (START,END){
if (START<END){
boo = -1
}
if (START==END){
boo = 0
}
if (START>END){
boo = 1
}
return(boo)
}
Minimize = function(T,K,r){
if(r<K){
H=T-K+r
for(r in 1:H){
START = Number[1]
END = Number[r]
boo1=Compare(START,END)
if (boo1 !=0){
cost[r]=cost[r-1]#+calerror(START,END)
}else{
cost[r]=0
r=r+1
Minimize(T,K,r)
}
}
}else{
}
return(cost)
}
tester=Minimize(T,K,r)
tester
完成的 Java 代码如下:
private void minimize(int T, int K, int k) {
// recursive method for exploring all the paths
if(k<K){
for(t[k]=t[k-1];t[k]<T-K+k-1;t[k]++){
Map.Entry<Date, V> e = inData.getEntryAtIndex(t[k-1]);
Map.Entry<Date, V> f = inData.getEntryAtIndex(t[k]+1);
Interval interval = new Interval(e.getKey(),f.getKey());
//System.out.println(interval);
if(interval.getStart().compareTo(interval.getEnd())!=0)
cost[k]=cost[k-1]+calError(interval);
else cost[k] = 0;
minimize(T,K,k+1);
}
}
else{
for(t[k]=t[k-1];t[k]<T-K+k-1;t[k]++){
Map.Entry<Date, V> g = inData.getEntryAtIndex(t[k-1]);
Map.Entry<Date, V> h = inData.getEntryAtIndex(t[k]+1);
Interval interval1 = new Interval(g.getKey(),h.getKey());
//System.out.println(interval1);
if(interval1.getStart().compareTo(interval1.getEnd())!=0)
cost[k]=cost[k-1]+calError(interval1);
else cost[k] = 0;
Map.Entry<Date, V> i = inData.getEntryAtIndex(t[k]);
Map.Entry<Date, V> j = inData.getEntryAtIndex(T-1);
Interval interval2 = new Interval(i.getKey(),j.getKey());
if(interval2.getStart().compareTo(interval2.getEnd())!=0)
cost[k+1]=cost[k]+calError(interval2);
else cost[k+1]=0;
if(ckt[K]>cost[k+1]){
/*for(int l=0;l<K+1;l++)
System.out.println(ckt[l]);*/
ckt[K] = cost[k+1];
/*for(int l=0;l<K+1;l++)
System.out.println(ckt[l]);*/
for(int l=0;l<K+1;l++)
tOpti[K][l]=t[l];
/*for(int l = 0;l<K+1;l++)
System.out.print(tOpti[K][l]+",");
System.out.println(ckt[K]);*/
}
}
}
}