SVM算法,Java实现,libsvm实现-根据语料判别类别

 ================训练语料==================
1 1:190 2:70     
1 1:180 2:80
-1 1:161 2:80
-1 1:161 2:47
 
训练语料含义,两个分类(1:男生    -1:女生)
1 1:190 2:70 代表的含义是
1 男生   
1 190第一维特征值  男生的身高为190厘米
2 70 第二维特征值  男生的体重为70kg
 
1 1:180 2:80
1 男生   
1 180第一维特征值  男生的身高为180厘米
2 80 第二维特征值  男生的体重为80kg
 
-1 1:161 2:80
-1 女生   
1 161第一维特征值  男生的身高为161厘米
2 80 第二维特征值  男生的体重为80kg
 
-1 1:161 2:47
-1 女生   
1 161第一维特征值  男生的身高为161厘米
2 47 第二维特征值  男生的体重为47kg
 
===================判断分类===================
给定语句,判断类别,一个人身高是185cm,体重是85kg,问这个人是男生还是女生?  ---->   1:185 2:85
给定语句,判断类别,一个人身高是161cm,体重是50kg,问这个人是男生还是女生?  ---->  -1 1:161 2:50



===代码-====
 package cn.liip.dh.svm.根据语料判别;
 
import libsvm.svm;
import libsvm.svm_model;
import libsvm.svm_node;
import libsvm.svm_parameter;
import libsvm.svm_problem;
 
public class SVMForClassic{
 
    public static void main(String[] args) {
    
     svm_node t1_1 = new svm_node(); t1_1.index = 1; t1_1.value = 190;
        svm_node t1_2 = new svm_node(); t1_2.index = 2; t1_2.value = 70;
        svm_node[] t1 = {t1_1, t1_1}; //这个人的身高是190cm,体重是70kg
        double t1_lable=1.0;//1.0对应的分类是男生,-1.0对应的是女生
        
        svm_node t2_1 = new svm_node(); t2_1.index = 1; t2_1.value = 180;
        svm_node t2_2 = new svm_node(); t2_2.index = 2; t2_2.value = 80;
        svm_node[] t2 = {t2_1, t2_2}; //这个人的身高是180cm,体重是80kg
        double t2_lable=1.0;//1.0对应的分类是男生,-1.0对应的是女生
        
        svm_node t3_1 = new svm_node(); t3_1.index = 1; t3_1.value = 161;
        svm_node t3_2 = new svm_node(); t3_2.index = 2; t3_2.value = 80;
        svm_node[] t3 = {t3_1,t3_2}; //这个人的身高是161cm,体重是80kg
        double t3_lable=-1.0;//1.0对应的分类是男生,-1.0对应的是女生
        
        svm_node t4_1 = new svm_node(); t4_1.index = 1; t4_1.value = 161;
        svm_node t4_2 = new svm_node(); t4_2.index = 2; t4_2.value = 47;
        svm_node[] t4 = {t4_1,t4_2}; //这个人的身高是161cm,体重是47kg
        double t4_lable=-1.0;//1.0对应的分类是男生,-1.0对应的是女生
        
        //将上面的数据整合到一面对象里面形成训练语料的描述
        svm_node[][] datas = {t1, t2,t3,t4}; //训练集的向量表
        double[] lables = {t1_lable,t2_lable,t3_lable,t4_lable}; //对应的lable
        svm_problem problem = new svm_problem();
        problem.l = 4; //向量的个数
        problem.x = datas; //训练集向量表
        problem.y = lables; //对应的lable数组
         
        //定义svm_parameter对象
        svm_parameter param = new svm_parameter();
        param.svm_type = svm_parameter.C_SVC;
        param.kernel_type = svm_parameter.LINEAR;
        param.cache_size = 100;
        param.eps = 0.00001;
        param.C = 1;
        
        //训练SVM分类模型
        System.out.println(svm.svm_check_parameter(problem, param)); //如果参数没有问题,则svm.svm_check_parameter()函数返回null,否则返回error描述。
        svm_model model = svm.svm_train(problem, param); //svm.svm_train()训练出SVM分类模型
        
        //定义测试数据点c
        svm_node test1_1 = new svm_node(); test1_1.index = 1; test1_1.value = 165;
        svm_node test1_2 = new svm_node(); test1_2.index = 2; test1_2.value = 45;
        svm_node[] test1 = {test1_1,test1_2}; //这个人的身高是185cm,体重是85kg,判断这个人的是男生,还是女生?
        
        //预测测试数据的lable
        double r1=svm.svm_predict(model, test1);
        String sex=r1==1.0?"男生":"女生";
        System.out.println("这人身高是"+test1_1.value+"cm,体重是"+test1_2.value+"kg,判断是"+sex+"!");
        
    }
}


===结果
null
*
optimization finished, #iter = 1
nu = 0.002770083102493075
obj = -0.005540166204986145, rho = 17.94736842105263
nSV = 2, nBSV = 0
Total nSV = 2
这人身高是165.0cm,体重是45.0kg,判断是女生!
 

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。