精华内容
下载资源
问答
  • svm多分类
    千次阅读
    2021-05-15 22:11:58


    SVM 多分类

    采用libSVM包进行多分类

    对带标签的高光谱数据建立分类模型

    数据描述:三个类别,每个类别300个样本,特征数量为237。

    代码

    1.训练集、测试集

    将数据分为训练集和测试集,训练集数量为800,测试集为100。

    clear
    clc
    
    load data.mat
    
    test_num = 100;
    l = randperm(size(dataset,1));
    
    %  测试集――100个样本
    test_data = dataset(l(1:test_num),:);
    test_label = label(l(1:test_num),:);
    %  训练集――800个样本
    train_data = dataset(l(test_num+1:end),:);
    train_label = label(l(test_num+1:end),:);
    
    write_traindata = [train_label train_data];
    write_testdata = [test_label test_data];
    csvwrite('C:\Users\Desktop\traindata.csv',write_traindata);
    csvwrite('C:\Users\Desktop\testdata.csv',write_testdata);
    # dlmwrite('C:\Users\Desktop\traindata.csv',write_traindata,'-append');    %写入训练集文件
    # dlmwrite('C:\Users\Desktop\testdata.csv',write_testdata,'-append');      %写入测试集文件
    save('write_traindata','write_traindata');
    save('write_testdata','write_testdata');
    

    函数csvwrite()每次执行之后数据会覆盖表格之前的数据;函数dlmwrite()可以将数据写在表格数据的后面,不会覆盖原有数据。

    2、数据归一化

    SVM分类器对数据进行分类前,需要将数据归一化

    clear
    clc
    
    load write_traindata.mat
    load write_testdata.mat
    
    
    %  训练集――800个样本
    train_data = write_traindata(:,2:end);
    train_label = write_traindata(:,1);
    %  测试集――100个样本
    test_data = write_testdata(:,2:end);
    test_label = write_testdata(:,1);
    
    % 数据归一化
    [Train_matrix,PS] = mapminmax(train_data',0,1);
    Train_matrix = Train_matrix';
    Test_matrix = mapminmax('apply',test_data',PS);
    Test_matrix = Test_matrix';
    

    3、参数选择

    SVM的核函数是选用径向基函数(RBF),这里采用CV方法选择最优的参数,c表示惩罚系数,g表示核函数自带的参数gamma。

    [c,g] = meshgrid(-10:1:10,-10:1:10);
    [m,n] = size(c);
    cg = zeros(m,n);
    eps = 10^(-4);
    v = 5;
    bestc = 1;
    bestg = 0.1;
    bestacc = 0;
    for i = 1:m
        for j = 1:n
            cmd = ['-v ',num2str(v),' -t 2',' -c ',num2str(2^c(i,j)),' -g ',num2str(2^g(i,j))];
            cg(i,j) = libsvmtrain(train_label,Train_matrix,cmd);
            if cg(i,j) > bestacc
                bestacc = cg(i,j);
                bestc = 2^c(i,j);
                bestg = 2^g(i,j);
            end
            if abs( cg(i,j)-bestacc )<=eps && bestc > 2^c(i,j)
                bestacc = cg(i,j);
                bestc = 2^c(i,j);
                bestg = 2^g(i,j);
            end
        end
    end
    cmd = [' -t 2',' -c ',num2str(bestc),' -g ',num2str(bestg)];
    

    4、模型训练

    将得到的最优参数带入模型,用训练集数据和标签训练模型。

    model = libsvmtrain(train_label,Train_matrix,cmd);
    

    5、模型测试

    [predict_label_1,accuracy_1,decision_values1] = libsvmpredict(train_label,Train_matrix,model);
    [predict_label_2,accuracy_2,decision_values2] = libsvmpredict(test_label,Test_matrix,model);
    
    SVM_Res =  accuracy_2(1,1);
    disp(["最优参数为:","c为",num2str(bestc),"g为",num2str(bestg)]);
    disp(["模型训练精度为:",num2str(accuracy_1(1,1))]);
    disp(["模型测试精度为:",num2str(accuracy_2(1,1))]);
    
    更多相关内容
  • 一种SVM多分类算法

    2020-10-16 20:59:54
    为了使用支持向量机(SVM)算法进行分类,在SVM分类基础上,提出使用排序算法中冒泡排序的思想进行SVM多类别数据分类。使用该方法在选取的UCI数据集进行实验,结果表明,在保证较高正确率的情况下,相对传统一对...
  • svm多分类的java源码

    2021-01-16 06:01:06
    花了好长时间写的svm多分类 具体的使用在百度上 这个辛苦分应该给的吧 谢谢啦 花了好长时间写的svm多分类 具体的使用在百度上 这个辛苦分应该给的吧 谢谢啦
  • SVM多分类代码

    2017-03-31 21:03:38
    svm多分类代码,包括一对和一对一两种多分类策略,内含数据集,代码可以直接运行,对了解多分类绝对大有帮助。
  • svm多分类器,包括多分类和GA算法和PSO算法优化的SVM
  • 这是一个拥有数据的基于MATLAB——svm多分类程序。已经编译好所需要的代码,可以运行,这是基于mac系统的,如果你的是win系统,需要把路径重新设置!
  • 本程序有数据集,有程序代码。本程序是将手写数字图像作为特征输入SVM,最终得到10分类,准确率约90%
  • svm多分类器,svm实现多分类,matlab源码
  • SVM多分类算法,基于svmlib适合初学者学习
  • svm分类器,集成了svm分类解决方案,支持matlab、C、python等
  • 分类SVM分类器函数,matlab语言编写.
  • LS-svm 支持向量机的分类程序,支持多分类
  • svm分类的matlab训练代码,精度高,使用线性核函数实现分类
  • svm分类的matlab代码,精度高,使用线性核函数实现分类
  • svm多分类问题matlab程序代码 SVM Introduction 支持向量机 (Support Vector Machines) 在机器学习中是一个重要的学习课题。 近两年在学习的同时也尝试给其他人讲解支持向量机的相关理论知识,个人认为也是十分有益...
  • 提供了一组衣领图像的特征,可以使用SVM来进行图像分类
  • 科研上用来进行基于SVM方法的多分类的程序
  • SVM分类器,针对语音信号的分类识别应用。内容非常,大家可以筛选着利用。
  • 提供的 MATLAB 函数可用于使用基于树状图的支持向量机 (D-SVM) 对数据集进行训练和执行分类。 两个主要功能是: Train_DSVM:这是用于训练的函数Classify_DSVM:这是用于 D-SVM 分类的函数示例:使用fisheriris ...
  • 机器学习之SVM多分类

    千次阅读 2020-12-18 19:59:53
    实验要求数据说明 :数据集data4train.mat是一个2*150的矩阵,代表了150个样本,每个样本...在此基础上设计使用该二分类器实现三分类问题的策略,并程序实现,画出分类结果直接采用现成的可实现多分类的方法(如类S...

    实验要求

    数据说明 :数据集data4train.mat是一个2*150的矩阵,代表了150个样本,每个样本具有两维特征,其类标在truelabel.mat文件中,trainning sample 图展示了理想的分类类结果;

    方案选择:

    选择并实现一种两分类方法(如感知机方法,SVM等);在此基础上设计使用该二分类器实现三分类问题的策略,并程序实现,画出分类结果

    直接采用现成的可实现多分类的方法(如多类SVM,BP网络等)进行问题求解。画出分类结果。我选择第二种,时间不够,只能使用sklearn中的svc实现

    实现思想

    一对一:

    其做法是在任意两类样本之间设计一个SVM,因此k个类别的样本就需要设计k(k-1)/2个SVM。当对一个未知样本进行分类时,最后得票最多的类别即为该未知样本的类别。

    优点:不需要重新训练所有的SVM,只需要重新训练和增加语音样本相关的分类器。在训练单个模型时,速度较快。

    缺点:所需构造和测试的二值分类器的数量关于k成二次函数增长,总训练时间和测试时间相对较慢。

    一对多

    训练时依次把某个类别的样本归为一类,其他剩余的样本归为另一类,这样k个类别的样本就构造出了k个SVM。分类时将未知样本分类为具有最大分类函数值的那类。

    **优点:**训练k个分类器,个数较少,其分类速度相对较快。

    缺点:

    ①每个分类器的训练都是将全部的样本作为训练样本,这样在求解二次规划问题时,训练速度会随着训练样本的数量的增加而急剧减慢;

    ②同时由于负类样本的数据要远远大于正类样本的数据,从而出现了样本不对称的情况,且这种情况随着训练数据的增加而趋向严重。解决不对称的问题可以引入不同的惩罚因子,对样本点来说较少的正类采用较大的惩罚因子C;

    ③还有就是当有新的类别加进来时,需要对所有的模型进行重新训练

    层次树:

    首先将所有类别分为两个类别,再将子类进一步划分为两个次级子类,如此循环下去,直到所有的节点都只包含一个单独的类别为止,此节点也是二叉树树种的叶子。该分类将原有的分类问题同样分解成了一系列的两类分类问题,其中两个子类间的分类函数采用SVM。

    我这里选择一对多,因为只有三类

    #!/usr/bin/env python

    # -*- coding: utf-8 -*-

    # @Time : 2019/7/2 23:25

    # @Author : 朱红喜

    # @File : Multi-classify.py

    # @Software: PyCharm

    # 引入必要的库

    import numpy as np

    import matplotlib.pyplot as plt

    from sklearn import svm

    from sklearn.model_selection import train_test_split

    from sklearn.preprocessing import label_binarize

    from sklearn.multiclass import OneVsRestClassifier

    from FileUtil import FileUtil

    # 加载数据

    # 1.训练模型的数据

    X = FileUtil.open_matfile("data4train.mat").T # 数据集

    y = FileUtil.open_matfile("truelabel.mat") # 真实标签

    print(X)

    print(y[0])

    print(y.shape)

    # 2.测试模型的数据

    X_2 = FileUtil.open_matfile("data4test.mat").T

    y_2 = FileUtil.open_matfile("testtruelabel.mat")

    print(X_2)

    print(y_2[0])

    print(y_2.shape)

    # 标签二值化

    y = label_binarize(y[0], classes=[1, 2, 3])

    # print(y)

    # 划分训练集和测试集

    # 设置种类

    n_classes = y.shape[1]

    # print(y.shape[1])

    # 训练模型并预测

    random_state = np.random.RandomState(0)

    n_samples, n_features = X.shape

    # 随机化数据,并划分训练数据和测试数据

    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.5, random_state=0)

    # 训练模型

    # Learn to predict each class against the other

    model = OneVsRestClassifier(svm.SVC(kernel='linear', probability=True, random_state=random_state))

    clt = model.fit(X_train, y_train)

    # 性能评估

    # 1.在训练集上的得分

    clt.score(X_train, y_train)

    print(clt.score(X_train, y_train))

    # 2.在测试集上的评分

    clt.score(X_test, y_test)

    print(clt.score(X_test, y_test))

    # 查看各类别的预测情况

    y_predict_scores = clt.decision_function(X_test)

    print(y_predict_scores[:149])

    # 转化为原始标签模式

    result = np.argmax(clt.decision_function(X_test), axis=1)[:149]

    # print(result)

    # 转化为老师需要的 1,2,3类标

    for i in range(result.__len__()):

    result[i] = result[i]+1

    print(result)

    print("++++++++++++++++++++++data4train数据集++++++++++++++++++")

    result_2 = np.argmax(clt.decision_function(X), axis=1)[:149]

    # print(result_2)

    # 转化为老师需要的 1,2,3类标

    for i in range(result_2.__len__()):

    result_2[i] = result_2[i]+1

    print(result_2)

    print("++++++++++++++++++++++data4test测试集++++++++++++++++++")

    result_2 = np.argmax(clt.decision_function(X_2), axis=1)[:59]

    # print(result_2)

    # 转化为老师需要的 1,2,3类标

    for i in range(result_2.__len__()):

    result_2[i] = result_2[i]+1

    print(result_2)

    分类结果

    展开全文
  • 多分类SVM的Matlab实现

    2019-04-12 09:31:15
    内含libsvm工具箱、SVMs的示例程序(含代码和实例数据)、SVR的示例程序(含代码和实例数据)
  • 对于组合二元支持向量机模型的类学习,使用纠错输出码(ECOC,error-correcting output codes )。有关详细信息,请参阅fitcecoc。 ECOC 可以用来将 Multiclass Learning 问题转化为 Binary Classification 问题。...

    对于组合二元支持向量机模型的多类学习,使用纠错输出码(ECOC,error-correcting output codes )。有关详细信息,请参阅fitcecoc。 ECOC 可以用来将 Multiclass Learning 问题转化为 Binary Classification 问题。

    以下内容基于MATLAB官网的介绍文档,进行了一点个人的理解和整理,不算原创,但也不是单纯的翻译。一年的博客写作生涯,随着博士生涯进入正轨,我写博客的动力也变了,原来是纯粹为了分享和成长,想写的方法就学一学写一写。现在不行了,搞科研的方法太多了,能让人皓首穷经,慢慢地,我就变成了没有需求就没有学习的的动力。用不到的方法就不想去学了,python的学习就是这样放下的。SVM也是,这里就开个头吧,不知道以后还有没有机会深入学习,拿出来哪怕一个月的时间,从头到尾地学习。现在这篇博客里的内容缺斤少两的,想看具体的英文内容请点击链接fitcecoc

    纠错输出码(ECOC)相关网页

    https://www.deeplearn.me/587.html
    https://blog.csdn.net/u010945683/article/details/52743515

    官网的例子

    Train Multiclass Model Using SVM Learners

    使用支持向量机(SVM)二进制学习器训练多类纠错输出代码(ECOC)模型。

    % 导入数据,Y中含有三类标签
    load fisheriris
    X = meas;
    Y = species;
    
    % 使用默认选项训练多类ECOC模型。
    % Mdl是ECOC多分类模型,默认情况下,fitcecoc使用SVM二进制学习器和一对一编码设计,可以使用点表示法访问Mdl属性。
    Mdl = fitcecoc(X,Y)
    
    % 显示类名称和编码设计矩阵。
    % 三个类的一对一编码设计产生三个二进制学习器。CodingMat的列对应于学习器,行对应于类。
    % 类顺序与Mdl.ClassNames类中的顺序相同
    % 例如,CodingMat(,1)[1;1;0],表示matlab使用分类为"setosa""versicolor"的所有观测值训练第一个支持向量机二进制学习者。
    % 因为'setosa'对应于1,所以它是正类;'versicolor'对应于-1,所以它是负类。
    Mdl.ClassNames
    CodingMat = Mdl.CodingMatrix
    
    % 使用单元格索引和点表示法访问每个二进制学习器。
    Mdl.BinaryLearners{1}   % The first binary learner
    
    % 计算替换类别错误。 训练数据的分类误差很小,但是分类器可能是过拟合模型。 可以使用crossval对分类器进行交叉验证,并计算交叉验证分类错误。
    error = resubLoss(Mdl)
    

    Train Multiclass Linear Classification Model

    训练由多个二进制,线性分类模型组成的ECOC模型。

    % 导入数据
    load nlpdata
    % X是预测数据的稀疏矩阵,Y是类标签的分类向量。数据中有两个以上的类。
    % 创建默认的线性分类模型模板。
    t = templateLinear();
    % 训练由多个二进制,线性分类模型组成的ECOC模型,这些模型可以根据文档网页上单词的频率分布来识别产品。 
    % 为了缩短训练时间,请转置预测数据,并指定观察值对应于列。
    X = X';
    rng(1); % For reproducibility 
    Mdl = fitcecoc(X,Y,'Learners',t,'ObservationsIn','columns')
    

    Cross-Validate ECOC Classifier

    使用SVM二进制学习器对ECOC分类器进行交叉验证,并估计分类错误。

    % 交叉验证ECOC分类器
    % 加载Fisher的虹膜数据集,指定预测变量数据X和标签Y。
    load fisheriris
    X = meas;
    Y = species;
    rng(1); % For reproducibility
    % 创建一个SVM模板,并标准化预测变量。
    % t是一个SVM模板。 大多数模板对象属性为空,训练时,属性为其默认值。
    t = templateSVM('Standardize',true)
    % 训练ECOC分类器Mdl,并指定类别顺序。
    Mdl = fitcecoc(X,Y,'Learners',t,...
        'ClassNames',{'setosa','versicolor','virginica'});
    % 使用10倍交叉验证对Mdl进行交叉验证
    CVMdl = crossval(Mdl);
    % 估计广义分类误差,误差越小说明分类器的泛化效果越好
    genError = kfoldLoss(CVMdl)
    

    Estimate Posterior Probabilities Using ECOC Classifier

    使用SVM二进制学习器训练ECOC分类器。首先预测训练样本标签和类后验概率,然后预测网格中每个点的最大类后验概率,并可视化结果。(啊不想看了)

    Speed Up Training ECOC Classifiers Using Binning and Parallel Computing

    使用合并和并行计算加快训练ECOC分类器的速度。
    使用具有替代分割的决策树GentleBoost集成训练一个一对多ECOC分类器。 为了加快训练速度,合并(bin应该是这个意思)数值预测器并使用并行计算。Binning只有在fitcecoc使用树型学习器时才有效。训练结束后,利用10倍交叉验证估计分类误差。

    Optimize ECOC Classifier

    每个SVM相关函数的实例中都有一个优化的例子

    Train Multiclass ECOC Model with SVMs and Tall Arrays

    创建两个基于高数据训练的多类ECOC模型。其中一个模型使用线性二进制学习器,另一个模型使用核心二进制学习器。 比较两个模型的分类误差。

    其他

    输入输出设置的内容也有很多,需要注意的是,在这里,可以使用多种分类器进行多分类,SCM只是其中的一种。

    此外,fitcecoc只支持稀疏矩阵(稀疏矩阵是个啥?)用于训练线性分类模型。对于所有其他模型,请提供完整的预测数据矩阵。

    更多的内容需要进一步学习啊,学吧,学无止境,太深了。
    在这里插入图片描述

    展开全文
  • 支持向量机(SVM)在处理多分类问题时,需要综合利用个二分类SVM,以获得多分类判决结果. 传统多分类拓展方法使用的是SVM的硬输出,在一定程度上造成了信息的丢失. 为了更加充分地利用信息,提出一种基于证据推理-...
  • SVM支持向量机多分类器源码,用过的,绝对好用
  • 浅析svm1多分类问题-svm多分类问题.rar svm多分类问题.rar 抛弃数学公式和专业术语,以一个初学者的视角来讲解问题
  • SVM多分类问题

    千次阅读 2021-06-16 22:27:18
    SVM本身是一个二值分类器,SVM算法最初是为二值分类问题设计的,当处理类问题时,就需要构造合适的分类器。 1、直接法:直接在目标函数上进行修改,将分类面的参数求解合并到一个最优化问题中,通过求解...

    SVM本身是一个二值分类器,SVM算法最初是为二值分类问题设计的,当处理多类问题时,就需要构造合适的多类分类器。
    人生梦想实现家

    1、直接法

    :直接在目标函数上进行修改,将多个分类面的参数求解合并到一个最优化问题中,通过求解该最优化问题“一次性”实现多类分类。这种方法看似简单,但其计算复杂度比较高,实现起来比较困难,只适合用于小型问题中。

    以Weston在提出的多值分类算法为代表,在经典SVM理论的基础上重新构造多值分类模型通过SV方法对新模型的目标函数进行优化实现多值分类,它实际上是标准SVM中二次优化问题的一种自然的推广。

    微信公众号:人生梦想实现家
    在这里插入图片描述

    2、间接法

    :主要是通过组合多个二分类器来实现多分类器的构造。

    2.1、一对多

    在该分类方法中对n个类别仅需构造n个支持向量机‚每一个支持向量机分别将某一类的数据从其他类别中分离出来。在测试时‚取决策函数输出值最大的类别为测试样本的类别。其第i个SVM可通过解决下面的最优化问题得到。
    在这里插入图片描述
    例如:使用这三个训练集分别进行训练,然后的得到三个训练结果文件。在测试的时候,把对应的测试向量分别利用这三个训练结果文件进行测试。最后每个测试都有一个结果f1(x),f2(x),f3(x)。于是最终的结果便是这三个值中最大的一个作为分类结果。

    在这里插入图片描述

    2.2、基于决策树的SVMs

    首先将所有类别分为两个类别,再将子类进一步划分为两个次级子类,如此循环下去,直到所有的节点都只包含一个单独的类别为止,此节点也是二叉树树种的叶子。该分类将原有的分类问题同样分解成了一系列的两类分类问题,其中两个子类间的分类函数采用SVM。如下图表示
    在这里插入图片描述
    在这里插入图片描述
    注意:越上层节点的分类性能对整个分类模型的推广性影响越大. 因此,在生成二叉树的过程中, 应该让最易分割的类最早分割出来, 即在二叉树的上层节点处分割。

    2.3、一对一

    在该分类方法中各个类别之间构造分类器对n个类别共需构造n(n-1 )/2个分类器每个分类器函数的训练样本是相关的两个类,‚组合这些两类分类器并使用投票法,得票最多的类为样本点所属的类。具体的讲对第i类和第j类之间的分类器,我们通过解下面的最优化问题得到:
    在这里插入图片描述
    例如:假设有四类A,B,C,D四类。在训练的时候我们选择(A,B)、 (A,C)、(A,D)、(B,C)、(B,D)、(C,D)所对应的向量作为训练集,然后得到六个训练结果,在测试的时候,把对应的向量分别对六个结果进行测试,然后采取投票形式,最后得到一组结果。投票是这样的:

    A=B=C=D=0; # 票数初始化
    (A,B)-classifier 如果是A win,则A=A+1;otherwise, B=B+1;
    (A,C)-classifier 如果是A win,则A=A+1;otherwise, C=C+1;(C,D)-classifier 如果是C win,则C=C+1;otherwise, D=D+1;
    The decision is the Max(A,B,C,D)
    

    2.4、纠错编码支持向量机

    由1和0组成的一个码矩阵设为𝑀^𝑄𝑆其中Q为类别数S为待训练的分类器数当𝑚_𝑞𝑠= 1 ( 𝑚_𝑞𝑠 = 0)时表示此样本相对于第q类而言是作为正例(负例)来训练第s个分类器fs的。
    工作分两步:训练和测试。在训练过程中依上述原则训练分类器f(x)= (f1(x)… fs(x))在测试过程中对于新例x计算分类器f(x)的输出向量与各类别向量的距离使其距离最小的类即为x所属的类。
    在这里插入图片描述
    例如:对于该样本分类时,10个SVM分类器的分类结果(0或1 )构成一个编码 s,计算码本内 7个编码与 s汉明距离,距离最小者所代表的类别即该测试样本所属类别。
    在这里插入图片描述

    可能有小伙伴会疑惑,用纠错编码SVM使用3次不就是可以分出8类了吗
    在这里插入图片描述
    但是,对于纠错编码SVM有以下使用约定(暂未找到证明)
    在这里插入图片描述

    2.5、有向无环图SVMs

    包括 k ( k − 1 ) / 2 个节点和 k 个 ”叶“。其中每个节点为一个分类器,并与下一层的两个节点(或者叶)相连。当对一个未知样本进行分类时,首先从顶部的根节点开始,根据根节点的分类结果用下一层中的左节点或者右节点继续分类,知道到达底层某个叶为止,该叶所表示的类别即未知样本的类别。
    在这里插入图片描述
    微信公众号:人生梦想实现家
    你好,很高兴遇见你,愿和你一起看最美的风景!

    展开全文
  • svm多分类模块流程图

    2011-07-20 14:33:52
    这是我在做项目是自己想出来的一个多分类算法流程图。基于二叉树的 。
  • 改进的球结构SVM多分类增量学习算法.pdf
  • 支持向量机(SVM) 在处理多分类问题时, 需要综合利用个二分类SVM, 以获得多分类判决结果. 传统多分类拓展方法使用的是SVM的硬输出, 在一定程度上造成了信息的丢失. 为了更加充分地利用信息, 提出一种基于证据推理-...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 97,328
精华内容 38,931
关键字:

svm多分类

友情链接: dual_buck_boost.rar