Java 支持向量机预测阅读数据测试
我在实现Java 支持向量机预测阅读数据测试,java,svm,Java,Svm,我在实现svm\u predict函数时遇到了一个很大的问题。我已经训练了svm,并准备了数据测试。这两个文件都在.txt中file.Datatest来自LBP(本地二进制模式),看起来像: -0.6448744548418511 -0.7862774302452588 1.7746263060948377 我正在将其加载到svm\u predict函数中,编译程序后,在我的控制台上有: 准确度=0.0%(0/800)(分类) 所以看起来它不能读取数据测试 import libsvm.*; i
svm\u predict
函数时遇到了一个很大的问题。我已经训练了svm,并准备了数据测试。这两个文件都在.txt
中file.Datatest
来自LBP(本地二进制模式),看起来像:
-0.6448744548418511
-0.7862774302452588
1.7746263060948377
我正在将其加载到
svm\u predict
函数中,编译程序后,在我的控制台上有:
准确度=0.0%(0/800)(分类)
所以看起来它不能读取数据测试
import libsvm.*;
import java.io.*;
import java.util.*;
class svm_predict {
private static double atof(String s)
{
return Double.valueOf(s).doubleValue();
}
private static int atoi(String s)
{
return Integer.parseInt(s);
}
private static void predict(BufferedReader input, DataOutputStream output, svm_model model, int predict_probability) throws IOException
{
int correct = 0;
int total = 0;
double error = 0;
double sumv = 0, sumy = 0, sumvv = 0, sumyy = 0, sumvy = 0;
int svm_type=svm.svm_get_svm_type(model);
int nr_class=svm.svm_get_nr_class(model);
double[] prob_estimates=null;
if(predict_probability == 1)
{
if(svm_type == svm_parameter.EPSILON_SVR ||
svm_type == svm_parameter.NU_SVR)
{
System.out.print("Prob. model for test data: target value = predicted value + z,\nz: Laplace distribution e^(-|z|/sigma)/(2sigma),sigma="+svm.svm_get_svr_probability(model)+"\n");
}
else
{
int[] labels=new int[nr_class];
svm.svm_get_labels(model,labels);
prob_estimates = new double[nr_class];
output.writeBytes("labels");
for(int j=0;j<nr_class;j++)
output.writeBytes(" "+labels[j]);
output.writeBytes("\n");
}
}
while(true)
{
String line = input.readLine();
if(line == null) break;
StringTokenizer st = new StringTokenizer(line," \t\n\r\f:");
double target = atof(st.nextToken());
int m = st.countTokens()/2;
svm_node[] x = new svm_node[m];
for(int j=0;j<m;j++)
{
x[j] = new svm_node();
x[j].index = atoi(st.nextToken());
x[j].value = atof(st.nextToken());
}
double v;
if (predict_probability==1 && (svm_type==svm_parameter.C_SVC || svm_type==svm_parameter.NU_SVC))
{
v = svm.svm_predict_probability(model,x,prob_estimates);
output.writeBytes(v+" ");
for(int j=0;j<nr_class;j++)
output.writeBytes(prob_estimates[j]+" ");
output.writeBytes("\n");
}
else
{
v = svm.svm_predict(model,x);
output.writeBytes(v+"\n");
}
if(v == target)
++correct;
error += (v-target)*(v-target);
sumv += v;
sumy += target;
sumvv += v*v;
sumyy += target*target;
sumvy += v*target;
++total;
}
if(svm_type == svm_parameter.EPSILON_SVR ||
svm_type == svm_parameter.NU_SVR)
{
System.out.print("Mean squared error = "+error/total+" (regression)\n");
System.out.print("Squared correlation coefficient = "+
((total*sumvy-sumv*sumy)*(total*sumvy-sumv*sumy))/
((total*sumvv-sumv*sumv)*(total*sumyy-sumy*sumy))+
" (regression)\n");
}
else
System.out.print("Accuracy = "+(double)correct/total*100+
"% ("+correct+"/"+total+") (classification)\n");
}
private static void exit_with_help()
{
System.err.print("usage: svm_predict [options] test_file model_file output_file\n"
+"options:\n"
+"-b probability_estimates: whether to predict probability estimates, 0 or 1 (default 0); one-class SVM not supported yet\n");
System.exit(1);
}
public static void main(String argv[]) throws IOException
{
int i, predict_probability=0;
// parse options
for(i=0;i<argv.length;i++)
{
if(argv[i].charAt(0) != '-') break;
++i;
switch(argv[i-1].charAt(1))
{
case 'b':
predict_probability = atoi(argv[i]);
break;
default:
System.err.print("Unknown option: " + argv[i-1] + "\n");
exit_with_help();
}
}
if(i>=argv.length-2)
exit_with_help();
try
{
BufferedReader input = new BufferedReader(new FileReader(argv[i]));
DataOutputStream output = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(argv[i+2])));
svm_model model = svm.svm_load_model(argv[i+1]);
if(predict_probability == 1)
{
if(svm.svm_check_probability_model(model)==0)
{
System.err.print("Model does not support probabiliy estimates\n");
System.exit(1);
}
}
else
{
if(svm.svm_check_probability_model(model)!=0)
{
System.out.print("Model supports probability estimates, but disabled in prediction.\n");
}
}
predict(input,output,model,predict_probability);
input.close();
output.close();
}
catch(FileNotFoundException e)
{
exit_with_help();
}
catch(ArrayIndexOutOfBoundsException e)
{
exit_with_help();
}
}
}
导入libsvm.*;
导入java.io.*;
导入java.util.*;
类svm_预测{
专用静态双atof(字符串s)
{
返回Double.valueOf(s).doubleValue();
}
私有静态int atoi(字符串s)
{
返回整数.parseInt;
}
私有静态无效预测(BufferedReader输入、DataOutputStream输出、svm_模型、int预测_概率)抛出IOException
{
int correct=0;
int-total=0;
双误差=0;
双sumv=0,sumy=0,sumvv=0,sumyy=0,sumvy=0;
int-svm_-type=svm.svm_-get_-svm_-type(模型);
int nr_class=svm.svm_get_nr_class(模型);
双[]概率估计值=空;
如果(预测概率==1)
{
如果(svm_类型==svm_参数.EPSILON_SVR||
svm_类型==svm_参数.NU_SVR)
{
System.out.print(“测试数据的概率模型:目标值=预测值+z,\nz:Laplace分布e^(-z |/sigma)/(2sigma),sigma=“+svm.svm_get_svr_概率(模型)+””\n”);
}
其他的
{
int[]标签=新的int[nr_类];
支持向量机获取标签(模型,标签);
概率估计=新的双[nr_类];
输出。写入字节(“标签”);
对于(intj=0;j很难知道,因为这是一个大过程
确保您遵循他们的分类指南
数据应该按比例缩放,现在它似乎超过了1,这很难知道,因为这是一个大过程
确保您遵循他们的分类指南
数据应该被缩放,现在它似乎超过了1这与这些家伙提供的免费libsvm库有关吗?徐志伟、张志忠和林志仁?Ya,这是libsvm的免费实现,仍然有一些问题,因为我无法获得任何预测结果欢迎使用堆栈溢出(通常称为)!与我看到的许多帖子相比,这是一篇非常好的第一篇帖子。我确实在问题的主体中设置了函数名的格式,因为它们是代码。此外,在您将“…”作为分隔符的地方,我将标记改为“------------”,正如您所看到的,这将在帖子中显示为一行。我所做的最后一件事是设置文件名和扩展名的格式s、 有一件事我搞不清楚,那就是你是否有负数,或者要点。快乐的编码!这与这些家伙提供的免费libsvm库有关吗?徐志伟、张志忠和林志仁?是的,这是libsvm的免费实现,仍然有一些错误,因为我无法获得任何预测结果elcome到堆栈溢出(通常称为SO)!与我看到的许多帖子相比,这是一篇非常好的第一篇帖子。我确实在问题的主体中设置了函数名的格式,因为它们是代码。此外,在您将“…”作为分隔符的地方,我将标记改为“------------”,正如您所看到的,这将在帖子中显示为一行。我所做的最后一件事是设置文件名和扩展名的格式s、 有一件事我搞不清楚,那就是你是否有负数,或者要点。编码快乐!