Libsvm自定义核函数【转】

1. 使用libsvm工具箱时,可以指定使用工具箱自带的一些核函数(-t参数),主要有:

-t kernel_type : set type of kernel function (default 2)

  • 0 -- linear: u‘*v
  • 1 -- polynomial: (gamma*u‘*v + coef0)^degree
  • 2 -- radial basis function: exp(-gamma*|u-v|^2)
  • 3 -- sigmoid: tanh(gamma*u‘*v + coef0)

2. 有时我们需要使用自己的核函数,这时候可以用 -t 4参数来实现:

-t kernel_type : set type of kernel function (default 2)
4 -- precomputed kernel (kernel values in training_instance_matrix)

使用-t 4参数时,再有了核函数后,需要给出核矩阵,关于核函数以及核函数构造相关的知识,大家可以看看相关书籍,在此不特别深入说明。

比如线性核函数 是 K(x,x‘) = (x * x‘),设训练集是train_data,设训练集有150个样本 , 测试集是test_data,设测试集有120个样本
则 训练集的核矩阵是 ktrain1 = train_data*train_data‘
测试集的核矩阵是 ktest1 = test_data*train_data‘
想要使用-t 4参数还需要把样本的序列号放在核矩阵前面 ,形成一个新的矩阵,然后使用svmtrain建立支持向量机,再使用svmpredict进行预测即可。形式与使用其他-t参数少有不同,如下:

ktrain1 = train_data*train_data‘;
Ktrain1 = [(1:150)‘,ktrain1];

model_precomputed1 = svmtrain(train_label, Ktrain1, ‘-t 4‘);  % 注意此处的 输入 Ktrain1

ktest1 = test_data*train_data‘;
Ktest1 = [(1:120)‘, ktest1];

[predict_label_P1, accuracy_P1, dec_values_P1] = svmpredict(test_label,Ktest1,model_precomputed1); % 注意此处输入Ktest1</pre>

下面是一个整体的小例子,大家可以看一下:

%% Use_precomputed_kernelForLibsvm_example
% faruto
% last modified by 2011.04.20
%%
tic;
clear;
clc;
close all;
format compact;
%%
load heart_scale.mat;
% Split Data
train_data = heart_scale_inst(1:150,:);
train_label = heart_scale_label(1:150,:);
test_data = heart_scale_inst(151:270,:);
test_label = heart_scale_label(151:270,:);

%% Linear Kernel
model_linear = svmtrain(train_label, train_data, ‘-t 0‘);
[predict_label_L, accuracy_L, dec_values_L] = svmpredict(test_label, test_data, model_linear);

%% Precomputed Kernel One
% 使用的核函数 K(x,x‘) = (x * x‘)
% 核矩阵
ktrain1 = train_data*train_data‘;
Ktrain1 = [(1:150)‘,ktrain1];
model_precomputed1 = svmtrain(train_label, Ktrain1, ‘-t 4‘);
ktest1 = test_data*train_data‘;
Ktest1 = [(1:120)‘, ktest1];
[predict_label_P1, accuracy_P1, dec_values_P1] = svmpredict(test_label, Ktest1, model_precomputed1);

%% Precomputed Kernel Two
% 使用的核函数 K(x,x‘) = ||x|| * ||x‘||
% 核矩阵
ktrain2 = ones(150,150);
for i = 1:150
 for j = 1:150
 ktrain2(i,j) = sum(train_data(i,:).^2)^0.5 * sum(train_data(j,:).^2)^0.5;
 end
end
Ktrain2 = [(1:150)‘,ktrain2];
model_precomputed2 = svmtrain(train_label, Ktrain2, ‘-t 4‘);

ktest2 = ones(120,150);
for i = 1:120
 for j = 1:150
 ktest2(i,j) = sum(test_data(i,:).^2)^0.5 * sum(train_data(j,:).^2)^0.5;
 end
end
Ktest2 = [(1:120)‘, ktest2];
[predict_label_P2, accuracy_P2, dec_values_P2] = svmpredict(test_label, Ktest2, model_precomputed2);
%% Precomputed Kernel Three
% 使用的核函数 K(x,x‘) = (x * x‘) / ||x|| * ||x‘||
% 核矩阵
ktrain3 = ones(150,150);
for i = 1:150
 for j = 1:150
 ktrain3(i,j) = ...
 train_data(i,:)*train_data(j,:)‘/(sum(train_data(i,:).^2)^0.5 * sum(train_data(j,:).^2)^0.5);
 end
end
Ktrain3 = [(1:150)‘,ktrain3];
model_precomputed3 = svmtrain(train_label, Ktrain3, ‘-t 4‘);

ktest3 = ones(120,150);
for i = 1:120
 for j = 1:150
 ktest3(i,j) = ...
 test_data(i,:)*train_data(j,:)‘/(sum(test_data(i,:).^2)^0.5 * sum(train_data(j,:).^2)^0.5);
 end
end
Ktest3 = [(1:120)‘, ktest3];
[predict_label_P3, accuracy_P3, dec_values_P3] = svmpredict(test_label, Ktest3, model_precomputed3);

%% Display the accuracy
accuracyL = accuracy_L(1) % Display the accuracy using linear kernel
accuracyP1 = accuracy_P1(1) % Display the accuracy using precomputed kernel One
accuracyP2 = accuracy_P2(1) % Display the accuracy using precomputed kernel Two
accuracyP3 = accuracy_P3(1) % Display the accuracy using precomputed kernel Three
%%
toc;

运行结果:

Accuracy = 85% (102/120) (classification)
Accuracy = 85% (102/120) (classification)
Accuracy = 67.5% (81/120) (classification)
Accuracy = 84.1667% (101/120) (classification)
accuracyL =
 85
accuracyP1 =
 85
accuracyP2 =
 67.5000
accuracyP3 =
 84.1667
Elapsed time is 1.424549 seconds.
时间: 2024-07-31 00:29:34

Libsvm自定义核函数【转】的相关文章

SVM原理与实践

SVM迅速发展和完善,在解决小样本.非线性及高维模式识别问题中表现出许多特有的优势,并能够推广应用到函数拟合等其他机器学习问题中.从此迅速的发展起来,已经在许多领域(生物信息学,文本和手写识别等)都取得了成功的应用.在地球物理反演当中解决非线性反演也有显著成效,例如(SVM在预测地下水涌水量问题等). SVM中的一大亮点是在传统的最优化问题中提出了对偶理论,主要有最大最小对偶及拉格朗日对偶. SVM的关键在于核函数.低维空间向量集通常难于划分,解决的方法是将它们映射到高维空间.但这个办法带来的困

在kyphosis数据集建立支持向量机分类器

1.  e1701简介 R语言的e1071包提供了对libsvm的接口.库libsvm包括了常用的核,如线性,多项式,RBF,sigmoid等.多分类通过一对一的投票机制(one-against-one voting scheme)而实现.predict()是训练函数,plot()可视化数据,支持向量,决策边界(如果提供的话).参数调整tune(). 用e1071包中svm函数可以得到与libsvm相同的结果.write.svm()更是可以把R训练得到的结果写为标准的Libsvm格式,以供其他环

用scikit-learn学习谱聚类

在谱聚类(spectral clustering)原理总结中,我们对谱聚类的原理做了总结.这里我们就对scikit-learn中谱聚类的使用做一个总结. 1. scikit-learn谱聚类概述 在scikit-learn的类库中,sklearn.cluster.SpectralClustering实现了基于Ncut的谱聚类,没有实现基于RatioCut的切图聚类.同时,对于相似矩阵的建立,也只是实现了基于K邻近法和全连接法的方式,没有基于$\epsilon$-邻近法的相似矩阵.最后一步的聚类方

利用谱聚类算法解决非完全图的聚类

在处理非完全图的聚类时候,很难找到一个有效的聚类算法去做聚类. 对于下图来说,10号点和15号点的位置相隔并不是那么近,如用普通聚类算法对下图做聚类,通常会把10号点和15号点聚在一个类上,所以一般的聚类效果并没有那么好. 而谱聚类,就很能很好的处理这类问题. 下面我们来重点介绍谱聚类 谱聚类(SpectralClustering),就是要把样本合理地分成两份或者K份.从图论的角度来说,谱聚类的问题就相当于一个图的分割问题.即给定一个图G = (V, E),顶点集V表示各个样本,带权的边表示各个

svm-struct使用指南(原版翻译)

svm-struct官方网站:http://www.cs.cornell.edu/people/tj/svm_light/svm_struct.html 个人翻译的svm_struct_learn文件,翻译的有些粗糙,望不要介意!希望对你有帮助! <span style="font-size:18px;">SVM_STRUCT_LEARN Calls the SVM-struct solver MODEL = SVM_STRUCT_LEARN(ARGS, PARM) run

非线性回归支持向量机——MATLAB源码

支持向量机和神经网络都可以用来做非线性回归拟合,但它们的原理是不相同的,支持向量机基于结构风险最小化理论,普遍认为其泛化能力要比神经网络的强.大量仿真证实,支持向量机的泛化能力强于神经网络,而且能避免神经网络的固有缺陷——训练结果不稳定.本源码可以用于线性回归.非线性回归.非线性函数拟合.数据建模.预测.分类等多种应用场合. function [Alpha1,Alpha2,Alpha,Flag,B]=SVMNR(X,Y,Epsilon,C,TKF,Para1,Para2)%%% SVMNR.m%

RBF高斯径向基核函数【转】

XVec表示X向量.||XVec||表示向量长度.r表示两点距离.r^2表示r的平方.k(XVec,YVec) = exp(-1/(2*sigma^2)*(r^2))= exp(-gamma*r^2)...... 公式-1这里, gamma=1/(2*sigma^2)是参数, r=||XVec-YVec||实际上,可看作是计算2个点X与Y的相似性.很多参考书上,把YVec写作XVec',即 k(XVec, XVec'),也是一样的含义:两点相似性.由于Matlab上面XVec'代表XVec的转置

使用libsvm实现文本分类

文本分类,首先它是分类问题,应该对应着分类过程的两个重要的步骤,一个是使用训练数据集训练分类器,另一个就是使用测试数据集来评价分类器的分类精度.然而,作为文本分类,它还具有文本这样的约束,所以对于文本来说,需要额外的处理过程,我们结合使用libsvm从宏观上总结一下,基于libsvm实现文本分类实现的基本过程,如下所示: 选择文本训练数据集和测试数据集:训练集和测试集都是类标签已知的: 训练集文本预处理:这里主要包括分词.去停用词.建立词袋模型(倒排表): 选择文本分类使用的特征向量(词向量):

LIBSVM与LIBLINEAR

原文: http://orangeprince.info/2014/11/23/libsvm-liblinear-2/ http://orangeprince.info/2014/11/22/libsvm-liblinear-1/ LIBSVM与LIBLINEAR(一) 在过去的十几年里,支持向量机(Support Vector Machines)应该算得上是机器学习领域影响力最大的算法了.而在SVM算法的各种实现工具中,由国立台湾大学林智仁老师开发的工具包LIBSVM,又无疑是影响力最大的.2