2017-06-24 49 views
0

我目前有一个perl脚本,它需要一个完整的文件列表,并将列表平均分成一列火车和测试集。我现在想做k-fold交叉验证,为此我需要perl脚本来进行调整。将完整列表划分为k折培训和测试集?

但鉴于目前的实施,我似乎很难想出一个简单的解决方案。

#!/usr/bin/env perl 

$full_list = $ARGV[0]; 
$test_list = $ARGV[1]; 
$train_list = $ARGV[2]; 

open FL, $full_list; 
$nol = 0; 
while ($l = <FL>) 
{ 
    $nol++; 
} 
close FL; 

$i = 0; 
open FL, $full_list; 
open TESTLIST, ">$test_list"; 
open TRAINLIST, ">$train_list"; 
while ($l = <FL>) 
{ 
    chomp($l); 
    $i++; 
    if ($i <= $nol/2) 
    { 
     print TRAINLIST "$l\n"; 
    } 
    else 
    { 
     print TESTLIST "$l\n"; 
    } 
} 

我使得能够创建A K折叠的简单的尝试是通过引入两个新的输入参数是partargv[4]kargv[3]。因此,$nol的一部分用于生成测试集,其余部分将作为列车集。

#!/usr/bin/env perl 

$full_list = $ARGV[0]; 
$test_list = $ARGV[1]; 
$train_list = $ARGV[2]; 
$k = $ARGV[3] 
$part_index_end = $ARGV[4] 
$part_index_start = $ARGV[4]-1 


print "Hi"; 

open FL, $full_list; 
$nol = 0; 
while ($l = <FL>) 
{ 
    $nol++; 
} 
close FL; 

$i = 0; 
open FL, $full_list; 
open TESTLIST, ">$test_list"; 
open TRAINLIST, ">$train_list"; 
while ($l = <FL>) 
{ 
    chomp($l); 
    $i++; 
    if ($i <= ($nol/$k)*$part_index_end $$ $i => ($nol/$k)*$part_index_end) 
    { 
     print TESTLIST "$l\n"; 
    } 
    else 
    { 
     print TRAINLIST "$l\n"; 
    } 
} 

这虽然需要调用这个脚本随着部分参数,使得它们也被正确放置,并且不会覆盖同一文件的其它脚本。

脚本的结果应该是3组列车/测试列表。

+0

好吧,你已经证明你的出发点,但是你有没有显示你已经尝试将其转换的东西。你知道K-fold交叉验证是什么吗?你知道你想让你的程序产生什么吗? – Borodin

+0

我添加了我的尝试,以及我希望如何。 – Lamda

回答

0

我结束了使用的解决方案是:

/* cook your code below */ 
k=5 
for ((j=1; j<k; j++)) 
do 
    for ((i=1; i<k; i++)) 
    do 

     if [ $i == $j ] && [ $j == $((k-1)) ] 
     then 
      s+="1" 
      #echo "1" 
     elif [ $i == $j ] 
     then 
      s+="1_" 
      #echo "1" 
     elif [ $i == $((k-1)) ] 
     then 
      s+="0" 
      #echo "0" 
     else 
      s+="0_" 
      #echo "0_" 
     fi 
    done 
    echo $s 
    s="" 
done 
0

我相信你需要1行,n + 1,2n + 1,...在一个文件中;第2行,n + 2,2n + 2,...在另一行;等

my @out_fhs; 
for my $i (1..$n) { 
    my $out_qfn = sprintf("file%03d", $i); 
    open(my $out_fh, '>', $out_qfn) 
     or die("Can't create \"$out_qfn\": $!\n"); 

    push @out_fhs, $out_fh; 
} 

my $in_qfn = '...'; 
open(my $in_fh, '<', $in_qfn) 
    or die("Can't create \"$in_qfn\": $!\n"); 

my $i = 0; 
while (<$in_fh>) { 
    print { $out_fhs[ $i++ % @fhs ] } $_; 
} 
+0

对不起,它有点难以理解你的代码..你能澄清一点吗? – Lamda

+0

我相信你需要1行,n + 1,2n + 1,...在一个文件中;第2行,n + 2,2n + 2,...在另一行;等等 – ikegami