簡體   English   中英

將置換后的數據放入LibSVM預先計算的內核中

[英]Putting permuted data into LibSVM precomputed kernel

我現在正在做非常簡單的SVM分類。 我在帶有RBF和DTW的LibSVM中使用了預先計算的內核。

當我計算相似度(內核)矩陣時,一切似乎都工作得很好……直到我對數據進行置換,然后再計算內核矩陣。

SVM當然對於輸入數據的排列是不變的。 在下面的Matlab代碼中,標有'<-!!!!!!!!!!'的行 確定分類精度(未排列:100%-排列:0%至100%,取決於rng的種子)。 但是,為什么排列文件字符串數組(名為fileList)有什么區別呢? 我究竟做錯了什么? 我是否誤解了“置換不變性”的概念,還是我的Matlab代碼有問題?

我的csv文件的格式為:LABEL,val1,val2,...,valN,所有csv文件都存儲在文件夾dirName中。 因此,字符串數組包含條目'10_0.csv 10_1.csv .... 11_7.csv,11_8.csv'(未排列)或排列后的其他順序。

我也嘗試過對樣本序列號的向量進行置換,但這沒什么區別。

function [SimilarityMatrixTrain, SimilarityMatrixTest, trainLabels, testLabels, PermSimilarityMatrixTrain, PermSimilarityMatrixTest, permTrainLabels, permTestLabels] = computeDistanceMatrix(dirName, verificationClass, trainFrac)
fileList = getAllFiles(dirName);
fileList = fileList(1:36);
trainLabels = [];
testLabels = [];
trainFiles = {};
testFiles = {};
permTrainLabels = [];
permTestLabels = [];
permTrainFiles = {};
permTestFiles = {};

n = 0;
sigma = 0.01;

trainFiles = fileList(1:2:end);
testFiles = fileList(2:2:end);

rng(3);
permTrain = randperm(length(trainFiles))
%rng(3); <- !!!!!!!!!!!
permTest = randperm(length(testFiles));

permTrainFiles = trainFiles(permTrain)
permTestFiles = testFiles(permTest);

noTrain = size(trainFiles);
noTest = size(testFiles);

SimilarityMatrixTrain = eye(noTrain);
PermSimilarityMatrixTrain = (noTrain);
SimilarityMatrixTest = eye(noTest);
PermSimilarityMatrixTest = eye(noTest);

% UNPERM
%Train
for i = 1 : noTrain
    x = csvread(trainFiles{i});   
    label = x(1);
    trainLabels = [trainLabels, label];
    for j = 1 : noTrain
        y = csvread(trainFiles{j});            
        dtwDistance = dtwWrapper(x(2:end), y(2:end));
        rbfValue = exp((dtwDistance.^2)./(-2*sigma));
        SimilarityMatrixTrain(i, j) = rbfValue;
        n=n+1
    end
end

SimilarityMatrixTrain = [(1:size(SimilarityMatrixTrain, 1))', SimilarityMatrixTrain];

%Test
for i = 1 : noTest
    x = csvread(testFiles{i});
    label = x(1);
    testLabels = [testLabels, label];
    for j = 1 : noTest
        y = csvread(testFiles{j});            
        dtwDistance = dtwWrapper(x(2:end), y(2:end));
        rbfValue = exp((dtwDistance.^2)./(-2*sigma));
        SimilarityMatrixTest(i, j) = rbfValue;
        n=n+1
    end
end

SimilarityMatrixTest = [(1:size(SimilarityMatrixTest, 1))', SimilarityMatrixTest];

% PERM
%Train
for i = 1 : noTrain
    x = csvread(permTrainFiles{i});        
    label = x(1);
    permTrainLabels = [permTrainLabels, label];
    for j = 1 : noTrain
        y = csvread(permTrainFiles{j});            
        dtwDistance = dtwWrapper(x(2:end), y(2:end));
        rbfValue = exp((dtwDistance.^2)./(-2*sigma));
        PermSimilarityMatrixTrain(i, j) = rbfValue;
        n=n+1
    end
end

PermSimilarityMatrixTrain = [(1:size(PermSimilarityMatrixTrain, 1))', PermSimilarityMatrixTrain];

%Test
for i = 1 : noTest
    x = csvread(permTestFiles{i});
    label = x(1);
    permTestLabels = [permTestLabels, label];
    for j = 1 : noTest
        y = csvread(permTestFiles{j});            
        dtwDistance = dtwWrapper(x(2:end), y(2:end));
        rbfValue = exp((dtwDistance.^2)./(-2*sigma));
        PermSimilarityMatrixTest(i, j) = rbfValue;
        n=n+1
    end
end

PermSimilarityMatrixTest = [(1:size(PermSimilarityMatrixTest, 1))', PermSimilarityMatrixTest];

mdlU = svmtrain(trainLabels', SimilarityMatrixTrain, '-t 4 -c 0.5');
mdlP = svmtrain(permTrainLabels', PermSimilarityMatrixTrain, '-t 4 -c 0.5');

[pclassU, xU, yU] = svmpredict(testLabels', SimilarityMatrixTest, mdlU);
[pclassP, xP, yP] = svmpredict(permTestLabels', PermSimilarityMatrixTest, mdlP);

xU    
xP

end

我將非常感謝您的回答!

問候本傑明

在清理了代碼並讓我的一位同事對其進行瀏覽之后,我們終於找到了該錯誤。 當然,我必須從訓練測試樣本中計算出測試矩陣(讓SVM通過使用訓練向量的alpha值乘積之和來預測測試數據(對於非支持向量,它們為零) 。 希望這可以為您中的任何一個人解決這個問題。 為了更加清楚,請參閱下面的修訂代碼。 但是,例如,在將預計算內核與libsvm一起使用時 ,那里的人也可以看到帶有訓練向量和測試向量的測試矩陣的計算。 如果您有任何其他評論/問題/提示,請隨時發表評論或答案。

function [tacc, testacc, mdl, SimilarityMatrixTrain, SimilarityMatrixTest, trainLabels, testLabels] = computeSimilarityMatrix(dirName)
fileList = getAllFiles(dirName);
fileList = fileList(1:72);
trainLabels = [];
testLabels = [];
trainFiles = {};
testFiles = {};   
n = 0;
sigma = 0.01;

trainFiles = fileList(1:2:end);
testFiles = fileList(2:5:end);

noTrain = size(trainFiles);
noTest = size(testFiles);

permTrain = randperm(noTrain(1));
permTest = randperm(noTest(1));

trainFiles = trainFiles(permTrain);
testFiles = testFiles(permTest);

%Train
for i = 1 : noTrain(1)
    x = csvread(trainFiles{i});
    label = x(1);
    trainlabel = label;
    trainLabels = [trainLabels, label];
    for j = 1 : noTrain(1)
        y = csvread(trainFiles{j});
        dtwDistance = dtwWrapper(x(2:end), y(2:end));
        rbfValue = exp((dtwDistance.^2)./(-2*sigma.^2));
        SimilarityMatrixTrain(i, j) = rbfValue;
    end
end

SimilarityMatrixTrain = [(1:size(SimilarityMatrixTrain, 1))', SimilarityMatrixTrain];

%Test
for i = 1 : noTest(1)
    x = csvread(testFiles{i});
    label = x(1);
    testlabel = label;
    testLabels = [testLabels, label];
    for j = 1 : noTrain(1)
        y = csvread(trainFiles{j});     
        dtwDistance = dtwWrapper(x(2:end), y(2:end));
        rbfValue = exp((dtwDistance.^2)./(-2*sigma.^2));
        SimilarityMatrixTest(i, j) = rbfValue;

    end
end

SimilarityMatrixTest = [(1:size(SimilarityMatrixTest, 1))', SimilarityMatrixTest];

mdlU = svmtrain(trainLabels', SimilarityMatrixTrain, '-t 4 -c 1000 -q');
fprintf('TEST: '); [pclassU, xU, yU] = svmpredict(testLabels', SimilarityMatrixTest, mdlU);
fprintf('TRAIN: ');[pclassT, xT, yT] = svmpredict(trainLabels', SimilarityMatrixTrain, mdlU);

tacc = xT(1);
testacc = xU(1);
mdl = mdlU;

end

問候本傑明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM