0

誰かがこれを解決するのを手伝ってくれますか? この分類がすでに良いかどうかをテストしたいと思います。そこで、データテスト=データトレーニングをやってみます。分類が良好であれば、100% (acc) になります。これは、このサイトから見つけたコードです。

data= [170           66           ;
160            50           ;
170            63           ;
173            61           ;
168            58           ;
184            88           ;
189            94           ;
185            88           ]

labels=[-1;-1;-1;-1;-1;1;1;1];

numInst = size(data,1);
numLabels = max(labels);

 testVal = [1 2 3 4 5 6 7 8];
  trainLabel = labels(testVal,:);
  trainData = data(testVal,:);
  testData=data(testVal,:);
  testLabel=labels(testVal,:);
 numTrain = 8; numTest =8

%# train one-against-all models
model = cell(numLabels,1);
for k=1:numLabels
    model{k} = svmtrain(double(trainLabel==k), trainData, '-c 1 -t 2 -g 0.2 -b 1');
end

%# get probability estimates of test instances using each model
prob = zeros(numTest,numLabels);
for k=1:numLabels
    [~,~,p] = svmpredict(double(testLabel==k), testData, model{k}, '-b 1');
    prob(:,k) = p(:,model{k}.Label==1);    %# probability of class==k
end


%# predict the class with the highest probability
[~,pred] = max(prob,[],2);
acc = sum(pred == testLabel) ./ numel(testLabel)    %# accuracy
C = confusionmat(testLabel, pred)                   %# confusion matrix

これが結果です。

optimization finished, #iter = 16  
nu = 0.645259 obj = -2.799682, 
rho = -0.437644 nSV = 8, nBSV = 1 Total nSV = 8 
Accuracy = 100% (8/8) (classification)

acc =

    0.3750


C =

     0     5
     0     3

なぜ2つの精度があり、その違いがあるのか​​ わかりません。最初のものは 100% で、2 つ目は 0.375 です。私のコードは間違っていますか?37.5% ではなく 100% にする必要があります。このコードを修正するのを手伝ってもらえますか??

4

5 に答える 5

1

それはあなたが使用しているコードですか?あなたの svmtrain 呼び出しは有効ではないと思います。svmtrain(MAT, VECT, ...)whereMATはデータの行列で、VECTは の各行のラベルを持つベクトルである必要がありMATます。残りのパラメーターは文字列と値のペアです。つまり、文字列識別子とそれに対応する値が含まれます。

コード (Linux、R2011a) を実行すると、svmtrain 呼び出しでエラーが発生しました。で実行するとsvmtrain(trainData, double(trainLabel==k))、有効な出力が得られました(その行に対して)。もちろん、svmpredict呼び出しはネイティブのmatlabではなく、LIBSVMからのmatlabバインディングであるため、純粋なmatlabを使用していないようです...

于 2013-03-23T01:30:57.870 に答える
1

C =fusionmat(testLabel, pred)
位置を入れ替えます

C = 混同マット(pred,testLabel)

またはこれを使用します

[ConMat,order] = 混乱マット(pred,testLabel)

混同行列とクラスの順序を示します

于 2013-10-30T01:02:15.550 に答える
0

すべての答えが完全に間違っていると言って申し訳ありません!! コードで行われた主なエラーは次のとおりです。

numLabels = max(labels);

ラベルが正の数の場合は 2 を返すはずですが、(1) を返すため、svmtrain/svmpredict は 2 回ループします。

とにかく、行labels=[-1;-1;-1;-1;-1;1;1;1]; をに変更するlabels=[2;2;2;2;2;1;1;1]; と、正常に動作します;)

于 2015-01-24T18:18:08.983 に答える
0

問題は

[~,~,p] = svmpredict(double(testLabel==k), testData, model{k}, '-b 1');

p予測されたラベルは含まれていませんが、ラベルが正しい確率推定値が含まれています。LIBSVM は svmpredictすでに精度を正しく計算しているため、デバッグ出力で 100% と表示されます。修正は簡単です:

[p,~,~] = svmpredict(double(testLabel==k), testData, model{k}, '-b 1');

LIBSVM の Matlab バインディング README によると:

The function 'svmpredict' has three outputs. The first one,
predictd_label, is a vector of predicted labels. The second output,
accuracy, is a vector including accuracy (for classification), mean
squared error, and squared correlation coefficient (for regression).
The third is a matrix containing decision values or probability
estimates (if '-b 1' is specified). If k is the number of classes
in training data, for decision values, each row includes results of 
predicting k(k-1)/2 binary-class SVMs. For classification, k = 1 is a
special case. Decision value +1 is returned for each testing instance,
instead of an empty vector. For probabilities, each row contains k values
indicating the probability that the testing instance is in each class.
Note that the order of classes here is the same as 'Label' field
in the model structure.
于 2014-06-14T23:40:07.683 に答える