精华内容
下载资源
问答
  • python 自定义生成多核svm进行分类
  • 多核svm分类器

    2015-12-16 17:24:29
    多核svm分类实现,vc工程文件,可直接编译
  • SimpleMKL是一种多核分类的算法,SVM的思想(SimpleMKL is one of the multi kernel algorithm)并已经修改为可运行版本
  • 论文研究-基于流形学习的多核SVM财务预警方法研究.pdf, 在进行财务困境预测时, 为了客观全面地反映企业的财务状况, 纳入较多的预警指标, 数据集维度将变得很大, ...
  • 基于多核SVM的人脸识别.pdf
  • simpleMKL_svm多核_kernelsvm_tidezmk_多核SVM_多融合内核训练程序_源码.zip
  • simpleMKL_svm多核_kernelsvm_tidezmk_多核SVM_多融合内核训练程序_源码.rar
  • 支持向量机是在统计学习理论基础上发展起来的一种机器学习方法,广泛应用于文本分类领域。利用信息增益法进行文本特征选取,运用TF-IDF进行特征权重设置。对支持向量机不同核函数,通过网格与交叉验证组合法优化参数...
  • 基于K均值聚类和多核SVM的微钙化簇检测.pdf
  • 针对传感器的动态特性,提出了一种基于多核最小二乘支持向量机对传感器进行动态建模的方法。通过不同核函数的线性加权组合构造新的等价核,由于构造的等价核函数兼具了全局核函数和局部核函数的优点,从而降低了建模...
  • 基于K均值聚类和粒子群优化的多核SVM图像分割.pdf
  • 具有事件提取和多核SVM的情感原因检测的集成方法
  • python MKL SVM(多核学习)

    千次阅读 2020-04-13 18:33:19
    python 实现MKL SVM(多核学习)+lasso降维处理 import math import pandas as pd from sklearn.linear_model import LassoCV from sklearn.feature_selection import SelectFromModel from sklearn import ...

    python 实现MKL SVM(多核学习)+lasso降维处理

    import math
    import pandas as pd
    from sklearn.linear_model import LassoCV
    from sklearn.feature_selection import SelectFromModel
    from sklearn import preprocessing
    import numpy as np
    import matplotlib.pyplot as plt
    from sklearn import svm
    from sklearn.model_selection import train_test_split        
    import itertools
    import datetime
    from sklearn.model_selection import cross_val_score
    "定义核函数"
    "np.linalg.norm(求范数)"
    "范数的定义 eg向量x=[2,4,8]T(转至)的范数为:||x||=根号(2*2+4*4+8*8)=9.165"
    "math.exp(1)返回e的一次方"
    def rbf(gamma=1.0):
     def rbf_fun(x1,x2):
      return math.exp((np.linalg.norm(x1-x2))*(-1.0*gamma))
     return rbf_fun
    "x2.transpose()是对矩阵的转置"
    def lin(offset=0):
     def lin_fun(x1,x2):
      return x1.dot(x2.transpose())+offset
     return lin_fun
    "pow(x1.dot(x2.transpose())+offset,power)指的是对得到x1.dot(x2.transpose())+offset的power次方"
    def poly(power=2,offset=0):
     def poly_fun(x1,x2):
      return pow(x1.dot(x2.transpose())+offset,power)
     return poly_fun
     def sig(alpha=1.0,offset=0):
     def sig_fun(x1,x2):
      return math.tanh(alpha*1.0*x1.dot(x2.transpose())+offset)
     return sig_fun
    "根据输入X的大小构造核矩阵"
    def kernel_matrix(x,kernel):
     mat=np.zeros((x.shape[0],x.shape[0]))
     for a in range(x.shape[0]):
      for b in range(x.shape[0]):
       mat[a][b]=kernel(x[a],x[b])
     return mat
    ".trace()得到矩阵的迹eg a=[[a11,a12],[a21,a22]] a的迹就是a11+a22的值"
    "f_dot函数最后得到一个值"
    def f_dot(kernel_mat1,kernel_mat2):
     return (kernel_mat1.dot(kernel_mat2.transpose())).trace()
    def A(kernel_mat1,kernel_mat2):
     return (f_dot(kernel_mat1,kernel_mat2))/(math.sqrt(f_dot(kernel_mat1,kernel_mat1)*f_dot(kernel_mat2,kernel_mat2)))
    '''
    求betas
    1.形成一个y行y列的矩阵yyT,由y*yT得到
    2.通过kernel_matrix,得到对X数据进行核函数的映射后的矩阵,
    和X的行数列数相同,设为data
    3.通过f_dot函数,将data和y相乘,返回相乘得到的矩阵f_mat,再返回矩阵的迹,记为J
    4.通过A函数将f_mat和yyT相乘得到的迹,再除以根号下(f_mat*f_matT)*(yyT*yyTT)得到的矩阵的迹
    5.将不同核函数在第四步得到的值相加,得到deno值
    6.得到使用不同核函数情况下的betas值,
    通过A函数将f_mat和yyT相乘得到的迹,再除以根号下
    (f_mat*f_matT)*(yyT*yyTT)得到的矩阵的迹,最后除以deno
    就的到每个核函数的betas值了
    betas值是每个核函数的比重
    '''
    def beta_finder(x,y,kernel_list):
        y=np.matrix(y)
        yyT=y.dot(y.transpose())
        deno=sum([A(kernel_matrix(x,kernel),yyT) for kernel in kernel_list])
        betas=[A(kernel_matrix(x,kernel),yyT)/deno for kernel in kernel_list]
        print (betas)
        return betas
    "产生multi核"
    '''
    1.得到betas
    2.生成矩阵XxY维的矩阵
    3.得到不同核函数对X数据映射后的数据data,再乘以该核函数对应的beta值(比重),再
    4.将上述得到的矩阵相加得到最融合的矩阵
    '''
    def multi_kernel_maker(x,y,kernel_list):
     betas=[float(b) for b in beta_finder(x,y,kernel_list)]
     #print " ",betas
     def multi_kernal(x1,x2):
      mat=np.zeros((x1.shape[0],x2.shape[0]))
      for a in range(x1.shape[0]):
       for b in range(x2.shape[0]):
        mat[a][b]=sum([betas[i]*kernel(x1[a],x2[b]) for i,kernel in enumerate(kernel_list)])
      return mat
     return multi_kernal
    "制造多核"
    #kernels = [lin(),lin(2),poly(),poly(3),poly(4),rbf(),rbf(1.5),sig(),sig(1.5)]
    kernels = [lin(),poly(),rbf(),sig(),rbf(10)]
    kernel_numbers=5
    multi_kernels = [mult for mult in itertools.combinations(kernels, kernel_numbers)]#itertools.combinations迭代器eg。(combinations('ABC', 2))得到[('A', 'B'), ('A', 'C'), ('B', 'C')]      
    "训练模型"
    def mk_train(x_train,y_train,multi_kernels):
        y=[[t] for t in y_train[:]]
        #  y=[[t] for t in y_train[:,i]]
        for k_list in multi_kernels:
            mk_train_start_time=datetime.datetime.now()
            multi_kernel=multi_kernel_maker(x_train,y,k_list)
            print(k_list,'multi kernel maked! !')
            clf=svm.SVC(kernel=multi_kernel)
            results=cross_val_score(clf,x_train, y_train, scoring='accuracy',cv=10)
            print(results.mean())
            mk_train_end_time=datetime.datetime.now()
            print('mk_train_time:',(mk_train_end_time-mk_train_start_time).seconds,'seconds')
            "导入数据"       
    file_path=r'C:\\Users\\DengBY\\Desktop\\liver_Lasso_features\\ALL_V.csv'
    data = pd.read_csv(file_path)
    a=pd.DataFrame(data)
    X=a.values[:,1:597]
    y=a.values[:,598]
    min_max_scaler = preprocessing.MinMaxScaler()#范围0-1缩放标准化
    X=min_max_scaler.fit_transform(X)
    "基于Lasso的特征选择"
    lsvc=LassoCV().fit(X, y)
    model = SelectFromModel(lsvc, prefit=True)
    X_lsvc = model.transform(X)
    df_X_lsvc=pd.DataFrame(X_lsvc)
    y=pd.DataFrame(y)
    b=df_X_lsvc
    objs=[b,y]
    "features select 后的数据"
    data=pd.concat(objs, axis=1, join='outer', join_axes=None, ignore_index=False,
                   keys=None, levels=None, names=None, verify_integrity=False
    '打乱数据,重新排序'               
    data=data.sample(frac=1)
    X=data.values[:,:14]
    y=data.values[:,15]   
    X_train,X_test,y_train,y_test=train_test_split(X,y,random_state=200)
    print('model training starting')
    mk_train(X_train,y_train,multi_kernels)
    print('model training finishing')
    #保存日志
    #import sys
    #f_handler=open('out.log', 'w')
    #sys.stdout=f_handler
    
    展开全文
  • 多核模糊SVM

    2013-12-06 15:45:28
    利用模糊理论实现SVM中样本偏差存在的问题,并利用多核SVM的思想改进SVM程序中核函数的选择问题,大大提高了分类的准确率。
  • 本人接触分类时间并不长,在刚用SVM做分类的时候对一个现象一直比较困惑,看到大家将各种不同类型特征,拼接在一起,组成庞大的高维特征向量,送给SVM,得到想要的分类准确率,一直不明白这些特征中,到底是哪些特征...

    1摘要

    分类在搜索引擎中的应用非常广泛,这种分类属性可以方便在rank过程中针对不同类别实现不同的策略,来更好满足用户需求。本人接触分类时间并不长,在刚用SVM做分类的时候对一个现象一直比较困惑,看到大家将各种不同类型特征,拼接在一起,组成庞大的高维特征向量,送给SVM,得到想要的分类准确率,一直不明白这些特征中,到底是哪些特征在起作用,哪些特征组合在一起才是最佳效果,也不明白为啥这些特征就能够直接拼在一起,是否有更好的拼接方式?后来了解到核函数以及多核学习的一些思想,临时抱佛脚看了点,对上面的疑问也能够作一定解释,正好拿来和大家一起探讨探讨,也望大家多多指点。本文探讨的问题所列举的实例主要是围绕项目中的图像分类展开,涉及SVM在分类问题中的特征融合问题。扩展开来对其他类型分类问题,理论上也适用。

    关键词: SVM  特征融合 核函数 多核学习

     

    2基本概念阐述

    SVM:支持向量机,目前在分类中得到广泛的应用

    特征融合:主要用来描述各种不同的特征融合方式,常见的方式有前期融合,就是前面所描述的将各个特征拼接在一起,后期融合本文后面会提到

    核函数:SVM遇到线性不可分问题时,可以通过核函数将向量映射到高维空间,在高维空间线性可分

    多核学习:在利用SVM进行训练时,会涉及核函数的选择问题,譬如线性核,rbf核等等,多核即为融合几种不同的核来训练。

    3应用背景

    在图片搜索中,会出现这样的一类badcase,图像的内容和描述图像的文本不一致,经常会有文本高相关,而图像完全不一致的情况。解决这类问题的一个思路就是综合利用图像的内容分类属性和文本的query分类属性,看两者的匹配程度做相应策略。

    4分类方法的选取

    下面就可以谈到本文的重点啦,那是如何对图像分类的呢?

    对分类熟悉的同学,马上可能要说出,这还不easy,抽取各种特征,然后一拼接,随便找个分类器,设定几个参数,马上分类模型文件就出来啦,80%准确率没问题。

    那这个方法确实不错也可行,但是有没有可以改进的地方呢?

    这里可能先要说明下图像分类的一些特殊性。

    图像的分类问题跟一般的分类问题方法本质上没太大差异,主要差异体现在特征的抽取上以及特征的计算时间上。

    图像特征的抽取分为两部分,一部分是针对通用图像的特征,还有一部分则是针对特定类别抽取的特征。这些特征与普通的文本特征不一致的地方在于,一个图像特征由于存在分块、采样、小波变换等,可能维度就已经很高。譬如常见的MPEG-7标准中提到的一些特征,边缘直方图150维,颜色自相关特征512维等。在分类过程中,如果将这些特征拼接在一起直接就可能过千维,但是实际在标注样本时,人工标注的正负样本也才几千张,所以在选择分类器时,挑选svm,该分类器由于可以在众多分类面中选择出最优分界面,以及在小样本的学习中加入惩罚因子产生一定软边界,可以有效规避overfitting。

    在特征的计算时间上,由于图像处理涉及的矩阵计算过多,一个特征的计算时间慢的可以达到0.3秒,所以如何挑选出既有效又快速的特征也非常重要。

    5两种特征融合方式的比较

    那刚才的方法有什么问题呢?

    仔细想想,大致存在以下几点问题:
    1. 你所提取的所有特征,全部串在一起,一定合适么?如果我想知道哪些特征组合在一起效果很好,该怎么办?
    2. 用svm进行学习时,不同的特征最适合的核函数可能不一样,那我全部特征向量串在一起,我该如何选择核函数呢?
    3. 参数的选取。不同的特征即使使用相同的核,可能最适合的参数也不一样,那么如何解决呢?
    4. 全部特征都计算,计算时间的花销也是挺大的

    对于刚才的问题,如果用前期融合,可能是用下面方式来解决:
    1. 根据经验,觉得在样本中可能表现不错的特征加进来,至于组合么,全部串在一起,或者选几个靠谱的串一起,慢慢试验,慢慢调,看哪些特征有改进就融合在一起
    2. 也是根据经验,选取普遍表现不错的RBF核,总之结果应该不会差
    3. 交叉验证是用来干嘛的?验证调优参数呗,全部特征融合在一起,再来调,尽管验证时间长,不要紧,反正模型是离线训练的,多调会也没关系。

    那是否有更好的选择方案呢?

    多核学习(MKL)可能是个不错的选择,该方法属于后期融合的一种,通过对不同的特征采取不同的核,对不同的参数组成多个核,然后训练每个核的权重,选出最佳核函数组合来进行分类。

    先看下简单的理论描述:

    普通SVM的分类函数可表示为:

     

    其中为待优化参数,物理意义即为支持向量样本权重,用来表示训练样本属性,正样本或者负样本,为计算内积的核函数,为待优化参数。

    其优化目标函数为:

     


    其中用来描述分界面到支持向量的宽度,越大,则分界面宽度越小。C用来描述惩罚因子,而则是用来解决不可分问题而引入的松弛项。
    在优化该类问题时,引入拉格朗日算子,该类优化问题变为:
     


    其中待优化参数在数学意义上即为每个约束条件的拉格朗日系数。
    而MKL则可认为是针对SVM的改进版,其分类函数可描述为:
     


    其中,表示第K个核函数,则为对应的核函数权重。
    其对应的优化函数可以描述为:
     


    在优化该类问题时,会两次引入拉格朗日系数,参数与之前相同,可以理解为样本权重,而则可理解为核函数的权重,其数学意义即为对每个核函数引入的拉格朗日系数。具体的优化过程就不描述了,不然就成翻译论文啦~,大家感兴趣的可以看后面的参考文档。
    通过对比可知,MKL的优化参数多了一层其物理意义即为在该约束条件下每个核的权重。
    Svm的分类函数形似上是类似于一个神经网络,输出由中间若干节点的线性组合构成,而多核学习的分类函数则类似于一个比svm更高一级的神经网络,其输出即为中间一层核函数的输出的线性组合。其示意图如下:
     

     


    在上图中,左图为普通SVM示例,而全图则为MKL示例。其中

    为训练样本,而

    为不同的核函数,

    为支持向量权重(假设三个训练样本均为支持向量),

    为核权重,y为最终输出分类结果。

    6实验过程:

    以实际对地图类别的分类为例,目前用于分类的特征有A,B,C,D,E,F,G(分别用字母代表某特征),这些特征每个的维数平均几百维。
    准备工作:
    1. 人工标注地图类别正负样本,本次标注正样本176张,负样本296张
    2. 提取正负训练样本图片的A~G各个特征
    3. 归一化特征
    4. 为每个特征配置对应的核函数,以及参数
    工具:

    Shogun工具盒:http://www.shogun-toolbox.org/,其中关于该工具的下载,安装,使用实例都有详细说明。该工具除了提供多核学习接口之外,几乎包含所有机器学习的工具,而且有多种语言源码,非常方便使用。

    结果测试:

    经过大约5分钟左右的训练,输出训练模型文件,以及包含的核函数权重、准确率。

    在该实例中,7个特征分别用七个核,其权重算出来为:

    0.048739 0.085657 0.00003 0.331335 0.119006 0.00000 0.415232,

    最终在测试样本上准确率为:91.6%

    为了节省特征抽取的时间,考虑去掉权重较小的特征A、C、F,

    拿剩下4个核训练,几分钟后,得到核函数权重如下:

    0.098070 0.362655 0.169014 0.370261,

    最终在测试样本上准确率为:91.4%

    在这次训练中,就可以节约抽取A、C、F特征的训练时间,并且很快知道哪些特征组合在一起会有较好的结果。

    实验的几点说明:
    1. 该类别的分类,因为样本在几百的时候就已经达到不错效果,所以选取数目较少。
    2. 该实验是针对每个特征选择一个核,且每个核配置固定参数,实际中如果时间允许,可以考虑每个特征选不同核,同一核可以选取不同参数,这样可以得到稍微更好的结果。
    参考文章:

    Large Scale Multiple Kernel Learning

    SimpleMKL

    Representing shape with a spatial pyramid kernel

    参考代码:http://www.shogun-toolbox.org/doc/cn/current/libshogun_examples.html

    7个人经验与总结:

    1. 多核学习在解释性上比传统svm要强。多核学习可以明显的看到各个子核中哪些核在起作用,哪些核在一起合作效果比较好。
    2. 关于参数优化。曾经做过实验,关于同一特征选用同一核,但是不同参数,组合成多个核,也可以提升分类准确率。
    3. 多核学习相比前期特征融合在性能上会有3%~5%左右的提升。
    4. 通过特征选择,可以节约特征计算时间。

    展开全文
  • 图像分类中的SVM多核学习

    万次阅读 2016-03-12 22:42:21
    本人接触分类时间并不长,在刚用SVM做分类的时候对一个现象一直比较困惑,看到大家将各种不同类型特征,拼接在一起,组成庞大的高维特征向量,送给SVM,得到想要的分类准确率,一直不明白这些特征中,到底是哪些特征...

    1.引文

    SVM是机器学习里面最强大最好用的工具之一,它试图在特征空间里寻找一个超平面,以最小的错分率把正负样本分开。它的强大之处还在于,当样本在原特征空间中线性不可分,即找不到一个足够好的超平面时,可以利用核(kernel)函数,将特征映射到希尔伯特(Hilbert)空间。后者一般维度更高,通过这样的映射之后,样本在新的特征空间中便是线性可分的了。

    记得刚刚学习SVM的时候,对“核”这个词很恐惧,一直理解不了它究竟是什么。在看MKL的时候,又经常会遇到“核矩阵”(kernel matrices)这个词。现在说一下我的理解。

    刚才说过,我们通过核把特征从低维空间映射到高维空间。举例来说,我们看下面的多项式核函数:

    其中x,y是两个样本,他们的特征分别是(x1,x2),(y1,y2),通过这个核函数,可以看到二维特征被映射到了六维特征。而且我们也可以理解,这个映射其实就是用一个矩阵A乘以原来的特征(x1,x2)得到的。矩阵A也就是核矩阵了。一个核函数对应一个核矩阵。


    2.基本概念阐述

        特征融合:主要用来描述各种不同的特征融合方式,常见的方式有前期融合,就是前面所描述的将各个特征拼接在一起,后期融合本文后面会提到

        核函数:SVM遇到线性不可分问题时,可以通过核函数将向量映射到高维空间,在高维空间线性可分

        多核学习:在利用SVM进行训练时,会涉及核函数的选择问题,譬如线性核,rbf核等等,多核即为融合几种不同的核来训练。

    3.应用背景

        在图片搜索中,会出现这样的一类badcase,图像的内容和描述图像的文本不一致,经常会有文本高相关,而图像完全不一致的情况。解决这类问题的一个思路就是综合利用图像的内容分类属性和文本的query分类属性,看两者的匹配程度做相应策略。

    4.分类方法的选取

    对分类熟悉的同学,马上可能要说出,这还不easy,抽取各种特征,然后一拼接,随便找个分类器,设定几个参数,马上分类模型文件就出来啦,80%准确率没问题。

        图像的分类问题跟一般的分类问题方法本质上没太大差异,主要差异体现在特征的抽取上以及特征的计算时间上。

        图像特征的抽取分为两部分,一部分是针对通用图像的特征,还有一部分则是针对特定类别抽取的特征。这些特征与普通的文本特征不一致的地方在于,一个图像特征由于存在分块、采样、小波变换等,可能维度就已经很高。譬如常见的MPEG-7标准中提到的一些特征,边缘直方图150维,颜色自相关特征512维等。在分类过程中,如果将这些特征拼接在一起直接就可能过千维,但是实际在标注样本时,人工标注的正负样本也才几千张,所以在选择分类器时,挑选svm,该分类器由于可以在众多分类面中选择出最优分界面,以及在小样本的学习中加入惩罚因子产生一定软边界,可以有效规避overfitting。

        在特征的计算时间上,由于图像处理涉及的矩阵计算过多,一个特征的计算时间慢的可以达到0.3秒,所以如何挑选出既有效又快速的特征也非常重要。

    5.两种特征融合方式的比较

        那刚才的方法有什么问题呢?

    仔细想想,大致存在以下几点问题:

         1. 你所提取的所有特征,全部串在一起,一定合适么?如果我想知道哪些特征组合在一起效果很好,该怎么办?

         2. 用svm进行学习时,不同的特征最适合的核函数可能不一样,那我全部特征向量串在一起,我该如何选择核函数呢?

         3. 参数的选取。不同的特征即使使用相同的核,可能最适合的参数也不一样,那么如何解决呢?

         4. 全部特征都计算,计算时间的花销也是挺大的

    对于刚才的问题,如果用前期融合,可能是用下面方式来解决:

         1. 根据经验,觉得在样本中可能表现不错的特征加进来,至于组合么,全部串在一起,或者选几个靠谱的串一起,慢慢试验,慢慢调,看哪些特征有改进就融合在一起

         2. 也是根据经验,选取普遍表现不错的RBF核,总之结果应该不会差

         3. 交叉验证是用来干嘛的?验证调优参数呗,全部特征融合在一起,再来调,尽管验证时间长,不要紧,反正模型是离线训练的,多调会也没关系。

        那是否有更好的选择方案呢?

        我们学过的SVM都是单核(single kernel)的,在使用的时候,需要我们根据经验或试验来选择用哪种核函数、怎样指定它的参数,这样很不方便。另一方面,实际应用当中,特征往往不是single domain的,而是异构的。拿图像分类来说,我们可能用到颜色相关的特征、纹理相关的特征、空间相关的特征,这几类特征对应的最佳的核函数未必相同,让他们共用同一个核函数,未必能得到最优的映射。对这些问题的思考,就引出了MKL。

    简单地说,我们给定一些basekernels,比如linear,Polynomial,RBF,Sigmoid,对于每一个,可以指定多组参数,也就是一共有M个base kernels,我们想用它们的线性组合来作为最终的核函数。通过training,得到这个线性组合中每个kernel的权重d(weight)。由于融合了各种kernel,可以照顾到异构的特征;由于自动学习权重,我们就不需要费脑子想究竟用哪一个核哪一种参数,把可能的核、参数都拿过来,组合着来用就可以了。

    多核学习(MKL)可能是个不错的选择,该方法属于后期融合的一种,通过对不同的特征采取不同的核,对不同的参数组成多个核,然后训练每个核的权重,选出最佳核函数组合来进行分类。

    与传统的单核SVM的不同,就是除了要学习w、b之外,还要学习上面提到的权重d。这样的话,decision function, cost function都会有些变化,棘手的是,cost function 的求解不再是一个convex problem,传统的优化方法就不适用了。近年来MKL比较热,很多论文都是在优化方法上面下功夫,企图达到更快的收敛速度、更好的解。具体的优化方法就比较复杂了,略去。

        先看下简单的理论描述:

        普通SVM的分类函数可表示为:

        

        其中为待优化参数,物理意义即为支持向量样本权重,用来表示训练样本属性,正样本或者负样本,为计算内积的核函数,为待优化参数。

        其优化目标函数为:

        

         其中用来描述分界面到支持向量的宽度,越大,则分界面宽度越小。C用来描述惩罚因子,而则是用来解决不可分问题而引入的松弛项。

         在优化该类问题时,引入拉格朗日算子,该类优化问题变为:

         

         其中待优化参数在数学意义上即为每个约束条件的拉格朗日系数。

         而MKL则可认为是针对SVM的改进版,其分类函数可描述为:

         

         其中,表示第K个核函数,则为对应的核函数权重。

         其对应的优化函数可以描述为:

         

         在优化该类问题时,会两次引入拉格朗日系数,参数与之前相同,可以理解为样本权重,而则可理解为核函数的权重,其数学意义即为对每个核函数引入的拉格朗日系数。具体的优化过程就不描述了,不然就成翻译论文啦~,大家感兴趣的可以看后面的参考文档。

         通过对比可知,MKL的优化参数多了一层其物理意义即为在该约束条件下每个核的权重。

         Svm的分类函数形似上是类似于一个神经网络,输出由中间若干节点的线性组合构成,而多核学习的分类函数则类似于一个比svm更高一级的神经网络,其输出即为中间一层核函数的输出的线性组合。其示意图如下:

         

         在上图中,左图为普通SVM示例,而全图则为MKL示例。其中为训练样本,而为不同的核函数,为支持向量权重(假设三个训练样本均为支持向量),为核权重,y为最终输出分类结果。

    6.实验过程与相关应用

        以实际对地图类别的分类为例,目前用于分类的特征有A,B,C,D,E,F,G(分别用字母代表某特征),这些特征每个的维数平均几百维。

         准备工作:

         1. 人工标注地图类别正负样本,本次标注正样本176张,负样本296张

         2. 提取正负训练样本图片的A~G各个特征

         3. 归一化特征

         4. 为每个特征配置对应的核函数,以及参数

         工具:

        Shogun工具盒:http://www.shogun-toolbox.org/,其中关于该工具的下载,安装,使用实例都有详细说明。该工具除了提供多核学习接口之外,几乎包含所有机器学习的工具,而且有多种语言源码,非常方便使用。

        结果测试:

        经过大约5分钟左右的训练,输出训练模型文件,以及包含的核函数权重、准确率。

        在该实例中,7个特征分别用七个核,其权重算出来为:

        0.048739 0.085657 0.00003 0.331335 0.119006 0.00000 0.415232,

        最终在测试样本上准确率为:91.6%

        为了节省特征抽取的时间,考虑去掉权重较小的特征A、C、F,

        拿剩下4个核训练,几分钟后,得到核函数权重如下:

        0.098070 0.362655 0.169014 0.370261,

        最终在测试样本上准确率为:91.4%

        在这次训练中,就可以节约抽取A、C、F特征的训练时间,并且很快知道哪些特征组合在一起会有较好的结果。

        实验的几点说明:

         1. 该类别的分类,因为样本在几百的时候就已经达到不错效果,所以选取数目较少。

         2. 该实验是针对每个特征选择一个核,且每个核配置固定参数,实际中如果时间允许,可以考虑每个特征选不同核,同一核可以选取不同参数,这样可以得到稍微更好的结果。

         参考文章:

        Large Scale Multiple Kernel Learning

        SimpleMKL

        Representing shape with a spatial pyramid kernel

        参考代码:http://www.shogun-toolbox.org/doc/cn/current/libshogun_examples.html

    多核线性组合,最经典的是simpleMKL,也被作为MKL的具体实现,应用在了计算机各领域。为了使MKL应用地更广,应对各种特征组合、各种样本量级,后来又有人提出了GMKL,G即Generalized,最优化方法用的是PGD(Projected Gradient Descend)。为了改进收敛效果,Vishwanathan又提出SPG-GMKL(Spectral Projected Gradient),同时提出了多核的product组合。SPG-GMKL也被后来者视作state-of-art。

    除了MKL,还有一个MKB(Multiple Kernel Boosting),大连理工大学的卢湖川有几篇论文就是用MKB做跟踪。论文生成MKB是基于MKL的,我觉得不然。请看MKB的框架图:

    这里的确用到多核,但每一个SVM都是单核的,根本没有用到多核训练的东西。本质上就是训练出M * N个single-kernel SVM,然后用boosting的方法,把这些弱分类器ensemble为一个强分类器。用到的就是传统的SVM加传统的boosting,只是名字新,实质并无新意。

    TKDE12 有一篇 MKBoost论文,这应该是正宗的MKB,它提出了一个框架,并提供了几个formulation,然后与MKL做了比较。论文中全是公式,没有看,以后需要的时候再研究吧。

    MKL的经典实现有SimpleMKL,Shogun,SPG-GMKL,SMO-MKL。

    如果只是要使用MKL,可以不看论文中的推导,更多的是看看上述几种实现附带的例子;可以看看MKL在跟踪、图像分类中的使用,输入输出是什么;可以看看这个这个教程。


    7.个人经验与总结:

        1. 多核学习在解释性上比传统svm要强。多核学习可以明显的看到各个子核中哪些核在起作用,哪些核在一起合作效果比较好。

         2. 关于参数优化。曾经做过实验,关于同一特征选用同一核,但是不同参数,组合成多个核,也可以提升分类准确率。

         3. 多核学习相比前期特征融合在性能上会有3%~5%左右的提升。

         4. 通过特征选择,可以节约特征计算时间。


    展开全文
  • Linux: 只需将其混合为: >> mex evalua_svm_thread.cc -lpthread 视窗: >>mex -largeArrayDims evalua_svm_thread_win.cc 执行它以获得帮助。 该函数需要完整矩阵
  • 针对传统算法在外界环境及目标运动导致外形变化的影响下跟踪效果不稳定的问题,提出一种鲁棒的多核学习跟踪算法,将Boosting提升方法引入到多核学习框架中,用比传统多核学习算法更少的样本训练,构建出基于互补性...
  • SVM---sklearn实现多核

    千次阅读 2019-05-11 15:58:49
    from sklearn.svm import SVR import matplotlib.pyplot as plt %# % matplotlib inline(再jupyter中实现可加上) #自定义样本点rand,并且生成sin值 x = np.random.rand(40,1)*5 X_train = np.sort(x,axis = 0) ...

    import numpy as np
    from sklearn.svm import SVR
    import matplotlib.pyplot as plt
    %# % matplotlib inline(再jupyter中实现可加上)
    #自定义样本点rand,并且生成sin值
    x = np.random.rand(40,1)*5
    X_train = np.sort(x,axis = 0)
    print(“X_train:%s”%X_train)

    y_train = np.sin(X_train)
    print(“y_train:%s”%y_train)

    y_train[::5]+= np.random.randn(8,1)
    print(“y_train:%s”%y_train)
    plt.scatter(X_train,y_train)
    plt.ylim(-2.5,2.5)

    svr_linear = SVR(kernel=‘linear’)
    svr_rbf = SVR(kernel=‘rbf’)#默认设置
    svr_poly = SVR(kernel=‘poly’)

    #数据的预测
    %# x_test= np.arange(0,5,0.01).reshape((-1,1))
    x_test= np.arange(0,5,0.01)[:,np.newaxis]
    %# print(“X_train.shape:%s”%X_train.shape[1])
    %# print(“y_train.shape:%s”%y_train.shape[1])
    print(“x_test.shape:%s”%x_test.shape[0])
    linear_y_ = svr_linear.fit(X_train,y_train).predict(x_test)
    rbf_y_ = svr_rbf.fit(X_train,y_train).predict(x_test)
    poly_y = svr_poly.fit(X_train,y_train).predict(x_test)

    #绘制图形,观察三种支持向量机内核不同
    plt.figure(figsize=(8,6))
    plt.scatter(X_train,y_train)
    plt.plot(x_test,linear_y_, ‘r+’,label=“linear”)
    plt.plot(x_test,rbf_y_,‘cyan’,label = ‘rbf’)
    plt.plot(x_test,poly_y,‘purple’,label=‘poly’)

    plt.legend()

    plt.show()

    注:线性的linear可以画出分割线,但是高维的就没法画出分割面,所以一般SVM预测都是可以画出预测的线,分割线无法画出。那如何才能知道哪个核函数最好,这就需要测试之后才能知道。哪个测试出来的准确率高就用哪个
    在这里插入图片描述

    展开全文
  • 该代码包括了SVM多核核函数的分类实现和可视化展示。
  • SVM多核学习方法简介

    千次阅读 2018-07-24 18:35:01
    因为SVM既能达到工业界的要求,机器学习研究者又能知道其背后的原理,所以SVM有着举足轻重的地位。 但是我们之前接触过的SVM都是单核的,即它是基于单个特征空间的。在实际应用中往往需要根据我们的经验来选择不同...
  • 最近关于多核学习(MKL)的工作已经证明了积分半径信息是提高核学习性能的一种有前途的方法。 但是,将最小包围球(MEB)的半径直接集成到MKL中,不仅会导致计算量大,而且由于该半径对异常值的敏感性而导致的核学习...
  • svm多分类 matlab程序

    热门讨论 2014-08-22 16:23:03
    采用matlab自带的svmtrain和svmpredict实现多分类。
  • SVM的matlab代码及SVM的多分类的作法

    千次阅读 2019-04-02 14:51:55
    SVM是常用的一种有监督的学习模型(即给你一些输入特征,告诉你这些特征的样本是属于A类,再给你一些输入特征,告诉你这些特征的样本是属于B类,现在再来一些数据,来判断它们是属于哪一类)。 它与Kmeans的区别在于...
  • 基于多核函数SVM的跳频序列预测,余永庆,姚毓凯,具有混沌特性的跳频序列可进行短期预测。通过混沌序列的相空间重构方法得到混沌吸引子,使序列预测问题转化为对混沌吸引子的回归
  • 多核分类器

    2013-11-20 16:07:52
    多核分类
  • 基于多核模糊SVM的l(2)数据融合可提高肽段识别能力
  • 本次是我自己刚学习svm,并在faruto视频上学习svm的笔记。 一.SVM 由Vapnik首先提出,svm的主要思想是建立一个超平面作为决策曲面,使得正例与反例之间的隔离边缘被最大化。 svm的优点: 1.通用性(能够在各种函数...
  • 支持向量回归(多核函数)

    千次阅读 2017-12-18 00:15:00
    sklearn.svm import SVR 2.生成训练数据 x = np.linspace(-np.pi,np.pi, 60 ) y = np.sin(x) #数据加噪 y[:: 3 ]+= 0.5 -np.random.random( 20 ) X_train = x.reshape(- 1 , 1 ) Y_train = y 3...
  • 课程大作业,总结整理成PPT,部分的MATLAB代码可供参考,以实现正负样本数差不多的情况

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,241
精华内容 496
关键字:

多核svm