Halcon学习SVM

void testSupportVectorMachines()
{
    //创建一个支持向量机
    //参数说明:NumFeatures支持向量机输入特征向量的维数, KernelType核函数类型, KernelParam核函数的附件参数, Nu正则化常量,
    //NumClasses类别数量, Mode支持向量机的模式, Preprocessing用来转换特征向量的预处理类型, NumComponents转换特征的数目
    Hlong NumFeatures=3;
    HString KernelType = "rbf";
    double KernelParam=0.02, Nu=0.05;
    Hlong NumClasses=3;
    HString Mode = "one-versus-one", Preprocessing = "normalization";
    Hlong NumComponents=3;

    HClassSvm classSvm;
    classSvm.CreateClassSvm(NumFeatures, KernelType, KernelParam, Nu, NumClasses, Mode, Preprocessing, NumComponents);

    //增加一个训练样本到支持向量机的训练数据集
    //参数说明: Features指定需要加入的特征向量的数据, Class指定该特征向量对应的类别
    HTuple Features=HTuple(0.1).Append(0.2).Append(0.1);
    Hlong Class=0;
    classSvm.AddSampleClassSvm(Features, Class);

    Features = HTuple(-0.1).Append(-0.2).Append(-0.1);
    Class = 1;
    classSvm.AddSampleClassSvm(Features, Class);

    Features = HTuple(0.1).Append(-0.2).Append(0.1);
    Class = 2;
    classSvm.AddSampleClassSvm(Features, Class);

    //训练一个支持向量机
    //参数说明:Epsilon训练停止参数, TrainMode训练模型
    double Epsilon = 0.001;
    HString TrainMode = "default";
    classSvm.TrainClassSvm(Epsilon, TrainMode);

    //对一个指定特征向量进行分类
    //参数说明:Features需要分类的特征向量, Num确定最合适的类的数量, Class分类的结果
    HTuple Features2 = HTuple(0.1).Append(-0.2).Append(0.1), Num2=1;
    HTuple Class2 = classSvm.ClassifyClassSvm(Features2, Num2);
    cout << "特征向量[0.1 -0.2 0.1]被分到的类别为 : " << (double)Class2 << endl << endl;

    //将一个支持向量机写入或者读出文件
    classSvm.WriteClassSvm("classSvm.gsc");
    HClassSvm fileclassSvm;
    fileclassSvm.ReadClassSvm("classSvm.gsc");

    //支持向量机序列化与反序列化
    HSerializedItem item = fileclassSvm.SerializeClassSvm();
    HClassSvm serialclassSvm;
    serialclassSvm.DeserializeClassSvm(item);

    //写支持向量机中的训练数据到文件
    classSvm.WriteSamplesClassSvm("sampleclassSvm");
    HClassSvm sampleclassSvm;
    sampleclassSvm.CreateClassSvm(NumFeatures, KernelType, KernelParam, Nu, NumClasses, Mode, Preprocessing, NumComponents);
    sampleclassSvm.ReadSamplesClassSvm("sampleclassSvm");

    //通过支持向量机评价一个特征向量
    //HTuple Features3 = HTuple(3).Append(1).Append(2), Result3;
    //Result3 = classSvm.EvaluateClassSvm(Features3);
    //cout << "特征向量0.1 -0.2 0.1评价系数:" << (double)Result3 << endl;

    //获得支持向量机中的训练数据
    HClassTrainData traindata = classSvm.GetClassTrainDataSvm();

    //获得支持向量机的所有参数值
    //参数说明:NumFeatures支持向量机输入特征向量的维数, KernelType核函数类型, KernelParam核函数的附带参数, Nu正则化常量,
    //NumClasses类别数量, Mode支持向量机的模式, Preprocessing用来转换特征向量的预处理类型, NumComponents转换特征的数目
    Hlong NumFeatures3;
    HString KernelType3;
    double KernelParam3, Nu3;
    Hlong NumClasses3;
    HString Mode3, Preprocessing3;
    Hlong NumComponents3;
    NumFeatures3 = classSvm.GetParamsClassSvm(&KernelType3, &KernelParam3, &Nu3, &NumClasses3, &Mode3, &Preprocessing3, &NumComponents3);
    cout << "特征向量的维数 : " << NumFeatures3 << " 核函数类型: " << KernelType3 << " 核函数的附带参数: " << KernelParam3 << endl;
    cout << "正则化常量 : " << Nu3 << " 类别数量: " << NumClasses3 << " 支持向量机的模式: " << Mode3 << endl;
    cout << "预处理类型: " << Preprocessing3 << " 转换特征的数目: " << NumComponents3 << endl;

    //计算支持向量机的预处理特征向量的信息内容
    //参数说明: Preprocessing用来转换特征向量的预处理类型, InformationCont转换特征向量的相对信息内容, CumInformationCont转化特征向量的累积信息内容
    HTuple Preprocessing4="principal_components", InformationCont4, CumInformationCont4;
    InformationCont4= classSvm.GetPrepInfoClassSvm(Preprocessing4, &CumInformationCont4);
    cout << "相对信息内容: " << (double)InformationCont4 << " 累积信息内容:" << (double)CumInformationCont4<<endl;

    //返回训练数据中的一个训练样本
    //参数说明: IndexSample训练样本的索引值, Features返回的特征向量, Target训练样本的目标向量
    Hlong IndexSample5=1;
    HTuple Features5;
    Hlong Target5;
    Features5 = classSvm.GetSampleClassSvm(IndexSample5, &Target5);
    cout << "检测的特征向量为: " << endl;
    for (int i = 0; i < Features5.Length();i++)
    {
        cout << (double)Features5[i] << " ";
    }
    cout << endl;

    //返回支持向量机中训练样本的总个数
    Hlong NumSamples = classSvm.GetSampleNumClassSvm();
    cout << "训练样本总数: " << NumSamples << endl;

    //从支持向量机中返回支持向量的索引值
    HTuple IndexSupportVector = 1;
    double Index = classSvm.GetSupportVectorClassSvm(IndexSupportVector);
    cout << Index << endl;

    //从支持向量机中返回支持向量总数
    HTuple NumSVPerSVM ;
    Hlong NumSupportVectors;
    NumSupportVectors = classSvm.GetSupportVectorNumClassSvm(&NumSVPerSVM);
    cout << "支持向量的个数: "<<NumSupportVectors<<endl;

}

你可能感兴趣的:(SVM,halcon)