我现在正在混淆使用Matlab实现带有交叉验证的SVM.stackoverflow上有很多帖子提到了有关SVM及其交叉验证的信息; 然而,即使使用最简单的"fisheriris"数据集也没有完整的例子.
我总结了这些帖子的问题如下:
一个.二进制和多类SVM:由matlab中的支持向量机回答, 但没有交叉验证的例子.
湾 使用SVM进行交叉验证: 在MATLAB中进行10倍SVM分类的 示例,但没有多类SVM的示例.
C.一对一和一对一的SVM:1-against-1可以在matlab中的支持向量机上找到 1-against-all可以在libsvm Multi-Class SVM中的多类分类中找到 (一对一) 没有交叉验证的例子
d.libSVM和Matlab内置SVM(统计工具箱)使用libSVM的部分完整示例可以 在一对一SVM中使用10倍交叉验证(使用LibSVM)
即 参数优化 使用libsvm进行交叉验证后重新训练
但是,对于一个人来说,学习并最终为他们的真正问题部署SVM的事情真的很复杂,只要查看这些以前的帖子就会出现问题和错误.至少我是愚蠢的解决拼图问题.
为什么我们不一起为具有以下功能的SVM构建易于理解的代码?
A.只需使用'fisheriris'数据.
B.可以用于二元和多类问题(fisheriris可以选择二进制).
C.实施交叉验证.
D.实施一对一和一对一.
E.两个版本分别使用libSVM和Matlab内置SVM.由于svmtrain与两个包的名称相同,我建议在使用之前将其更改为libsvmtrain和MEX.然后我们也可以比较这两种方法.
F.目前,由于训练/测试数据分离,结果并不总是可重复的.我们能解决这个问题吗
F.(可选)添加参数优化.
G.(可选)添加ROC分析.
我的开始是一些代码,如:
#% libSVM version_1
clc; clear all;
load fisheriris
[~,~,labels] = unique(species); % Labels: 1/2/3
data = zscore(meas); % Scale features
numInst = size(data,1);
numLabels = max(labels);
%# Split training/testing
idx = randperm(numInst);
numTrain = 100;
numTest …Run Code Online (Sandbox Code Playgroud) 我知道交叉验证用于选择好的参数.找到它们之后,我需要在不使用-v选项的情况下重新训练整个数据.
但我面临的问题是,在使用-v选项训练后,我获得了交叉验证的准确性(例如85%).没有模型,我看不到C和gamma的值.在那种情况下,我如何重新训练?
顺便说一句,我应用10倍交叉验证.例如
optimization finished, #iter = 138
nu = 0.612233
obj = -90.291046, rho = -0.367013
nSV = 165, nBSV = 128
Total nSV = 165
Cross Validation Accuracy = 98.1273%
Run Code Online (Sandbox Code Playgroud)
需要一些帮助..
为了获得最佳的C和gamma,我使用LIBSVM FAQ中提供的代码
bestcv = 0;
for log2c = -6:10,
for log2g = -6:3,
cmd = ['-v 5 -c ', num2str(2^log2c), ' -g ', num2str(2^log2g)];
cv = svmtrain(TrainLabel,TrainVec, cmd);
if (cv >= bestcv),
bestcv = cv; bestc = 2^log2c; bestg = 2^log2g;
end
fprintf('(best c=%g, g=%g, rate=%g)\n',bestc, bestg, …Run Code Online (Sandbox Code Playgroud) 我知道LIBSVM在多类SVM方面只允许一对一分类.但是,我想稍微调整它以执行一对一的分类.我试图在下面进行一对一的比赛.这是正确的方法吗?
代码:
TrainLabel;TrainVec;TestVec;TestLaBel;
u=unique(TrainLabel);
N=length(u);
if(N>2)
itr=1;
classes=0;
while((classes~=1)&&(itr<=length(u)))
c1=(TrainLabel==u(itr));
newClass=c1;
model = svmtrain(TrainLabel, TrainVec, '-c 1 -g 0.00154');
[predict_label, accuracy, dec_values] = svmpredict(TestLabel, TestVec, model);
itr=itr+1;
end
itr=itr-1;
end
Run Code Online (Sandbox Code Playgroud)
我可能犯了一些错误.我想听听一些反馈.谢谢.
第二部分:正如葡萄藤所说:我需要做汇总(或投票作为简化解决方案)来得出最终答案.我不知道该怎么做.我需要一些帮助; 我看到了python文件,但仍然不太确定.我需要一些帮助.
你能举一个在matlab中使用支持向量机(SVM)对4个类进行分类的例子:
atribute_1 atribute_2 atribute_3 atribute_4 class
1 2 3 4 0
1 2 3 5 0
0 2 6 4 1
0 3 3 8 1
7 2 6 4 2
9 1 7 10 3
Run Code Online (Sandbox Code Playgroud) matlab artificial-intelligence classification machine-learning svm
如何在MATLAB下开始使用libsvm?
我已下载了该库,并将其解压缩C:\Program Files\MATLAB\R2012a\toolbox\,但后来我不知道如何在MATLAB中使用它.
我正在使用libsvm并且我做了一个非常简单的实验,训练10k向量并且仅用22进行测试.我使用带参数成本的线性内核C=1.我的问题是多类.所以Libsvm将使用一对一的方法对我的数据进行分类.Libsvm使用SMO来查找分离超平面.
我的一个朋友做了同样的实验,但使用的SVM分类器来自统计工具箱.他还使用了来自R 的e1071软件包.再次,使用的内核是线性内核,参数成本C等于1,并且使用一对一方法对MATLAB中的数据进行分类(一对一方法由我的朋友编写)和e1071 R包.MATLAB统计工具箱和R的e1071都默认使用SMO方法查找分离超平面.
我也尝试了最新的LIBLINEAR库.同样,使用相同的配置.
以下是使用的代码:
./svm-scale -s train.range train.libsvm > train.scale
./svm-scale -r train.range test.libsvm > test.scale
./svm-train -t 0 -c 1 train.scale train.model
./svm-predict test.scale train.model test.predict
Run Code Online (Sandbox Code Playgroud)
./svm-scale -s train.range train.libsvm > train.scale
./svm-scale -r train.range test.libsvm > test.scale
./train train.scale train.model
./predict test.scale train.model test.predict
Run Code Online (Sandbox Code Playgroud)
rm(list = ls())
cat("\014")
library(e1071)
cat("Training model\n")
Traindata = read.csv("train.csv", header=FALSE)
SVM_model = …Run Code Online (Sandbox Code Playgroud) 我写了这段代码,想获得分类的概率。
from sklearn import svm
X = [[0, 0], [10, 10],[20,30],[30,30],[40, 30], [80,60], [80,50]]
y = [0, 1, 2, 3, 4, 5, 6]
clf = svm.SVC()
clf.probability=True
clf.fit(X, y)
prob = clf.predict_proba([[10, 10]])
print prob
Run Code Online (Sandbox Code Playgroud)
我得到了这个输出:
[[0.15376986 0.07691205 0.15388546 0.15389275 0.15386348 0.15383004 0.15384636]]
Run Code Online (Sandbox Code Playgroud)
这很奇怪,因为概率应该是
[0 1 0 0 0 0 0 0]
Run Code Online (Sandbox Code Playgroud)
(注意必须预测类别的样本与第二个样本相同)同样,该类别获得的概率最低。
我正在尝试使用libsvm,并按照示例在软件附带的heart_scale数据上训练svm.我想使用我自己预先计算的chi2内核.培训数据的分类率降至24%.我确信我正确地计算了内核,但我想我一定是做错了.代码如下.你能看到任何错误吗?非常感谢帮助.
%read in the data:
[heart_scale_label, heart_scale_inst] = libsvmread('heart_scale');
train_data = heart_scale_inst(1:150,:);
train_label = heart_scale_label(1:150,:);
%read somewhere that the kernel should not be sparse
ttrain = full(train_data)';
ttest = full(test_data)';
precKernel = chi2_custom(ttrain', ttrain');
model_precomputed = svmtrain2(train_label, [(1:150)', precKernel], '-t 4');
Run Code Online (Sandbox Code Playgroud)
这是内核预先计算的方式:
function res=chi2_custom(x,y)
a=size(x);
b=size(y);
res = zeros(a(1,1), b(1,1));
for i=1:a(1,1)
for j=1:b(1,1)
resHelper = chi2_ireneHelper(x(i,:), y(j,:));
res(i,j) = resHelper;
end
end
function resHelper = chi2_ireneHelper(x,y)
a=(x-y).^2;
b=(x+y);
resHelper = sum(a./(b + eps));
Run Code Online (Sandbox Code Playgroud)
使用不同的svm实现(vlfeat),我获得了训练数据的分类率(是的,我在训练数据上测试,只是为了看看发生了什么)大约90%.所以我很确定libsvm结果是错误的.
我想知道libsvm是如何工作的.我在这个链接中尝试了这个代码[1]:在一对一SVM中使用10次交叉验证(使用LibSVM).它正在工作(我没有在matlab中添加路径libsvm库)但是在我添加了libsvm库之后.它不起作用.我不知道如何解决它.有一个错误:
Error using svmtrain (line 233)
Y must be a vector or a character array.
Error in libsvmtrain_ova (line 11)
models{k} = svmtrain(double(y==labels(k)), X, strcat(opts,' -b 1 -q'));
Error in libsvmcrossval_ova (line 10)
mdl = libsvmtrain_ova(y(trainIdx), X(trainIdx,:), opts);
Error in main (line 9)
acc = libsvmcrossval_ova(labels, data, opts, nfold);
Run Code Online (Sandbox Code Playgroud)
有没有人帮我如何解决?谢谢
我正在尝试使用 LIBSVM 实现一对一多类分类。
\n此链接很有用http://www.csie.ntu.edu.tw/~cjlin/libsvmtools/ovr_multiclass/ \n但我在函数 \'ovrpredict()\' 中收到错误。
\n函数如下:
\nfunction [pred, ac, decv] = ovrpredict(y, x, model)\n\nlabelSet = model.labelSet;\nlabelSetSize = length(labelSet);\nmodels = model.models;\ndecv= zeros(size(y, 1), labelSetSize);\n\nfor i=1:labelSetSize\n [l,a,d] = svmpredict(double(y == labelSet(i)), x, models{i});\n decv(:, i) = d * (2 * models{i}.Label(1) - 1); % ERROR IN THIS LINE\nend\n[tmp,pred] = max(decv, [], 2);\npred = labelSet(pred);\nac = sum(y==pred) / size(x, 1);\nRun Code Online (Sandbox Code Playgroud)\n我收到的错误消息是Reference to non-existent field \'Label\'。
任何建议都会非常有帮助。
\n用于调用函数的代码:\\
\n[trainY …Run Code Online (Sandbox Code Playgroud)