#!/usr/bin/perl use strict; use warnings; use File::Copy; use Statistics::R; my $inputData = "E:\\NUS\\Project\\SVM\\Data\\data.txt"; my $path = "E:\\NUS\\Project\\SVM\\Results\\"; open DATA,"<","$inputData" or die "$!"; chomp(my $data = ); close DATA; my @data = split /\t/,$data; my $total = scalar(@data); copy("$inputData","$path"."data_$total.txt") or die "$!"; open LOG,">","$path"."log.txt" or die "$!"; my $outputData = ""; while($total > 2){ my $inputData = "data_"."$total.txt"; # print LOG "$input:\n"; open IN,"<","$path"."$inputData" or die "$!"; my $drop = $total - 1; $outputData = "data_"."$drop.txt"; my %drop_acc = (); for my $count (2..$total){ &drop($count); my $R = Statistics::R -> new(); $R -> startR; $R -> send(qq'library(class)'); $R -> send(qq'library(e1071)'); $R -> send(qq'svmdata <- read.table(past($path,"$outputData",sep = ""),sep = "\t")'); $R -> send(qq'n <- length(svmdata)'); $R -> send(qq'trainset <- svmdata[1:20,2:n]'); $R -> send(qq'trainlabel <- svmdata[1:20,1]'); $R -> send(qq'testset <- svmdata[21:30,2:n]'); $R -> send(qq'testlabel <- svmdata[21:30,1]'); $R -> send(qq'model <- svm(trainset,trainlabel,type="C-classification")'); $R -> send(qq'predlabel <- predict(model,testset)'); $R -> send(qq'result <- table(predlabel,testlabel)'); $R -> send(qq'acc <- (result[1,1]+result[2,2])/(result[1,1]+result[1,2]+result[2,1]+result[2,2])'); $R -> send(qq'print(acc)'); my $read = $R -> read; $read =~ s/\[\d\]\s+(\d+)/$1/g; $drop_acc{$count} = $read; #$R -> send(qq'write.table(acc,"D:/personalfolders/liuyifang/SVM/Results/$read.txt",sep="\t",row.names=F,col.names=F)'); $R -> stopR(); } #print "$read\n"; my @keys = sort{$drop_acc{$a} <=> $drop_acc{$b}} keys %drop_acc; for(@keys){print LOG "$_ -> $drop_acc{$_}\n";} print LOG "drop: $keys[0]\n"; &drop($keys[0]); $total--; } sub drop { my $drop = shift; open OUT,">","$path"."$outputData" or die "$!"; seek IN,0,0; while(){ chomp; my @data = split /\t/; for my $index (0..$total-1){ print OUT $data[$index],"\t" if $index+1 != $drop; } print OUT "\n"; } close OUT; # system(qq(perl -i".bak" -p -e "~s/\t\n/\n/g" D:\\personalfolders\\liuyifang\\SVM\\Data\\$outputData)); }