How to compare matrices with different dimensions?
古いコメントを表示
I wrote a code for classification by using 5 classifiers and at the end I used voting this code is for initia defining of train and test data:
clear all
close all
clc
load liver.mat;
data=Liver;
[n,m]=size(data);
rows=(1:n);
test_count=floor((1/6)*n);
sum_ens=0;sum_result=0;
test_rows=randsample(rows,test_count);
train_rows=setdiff(rows,test_rows);
test=data(test_rows,:);
train=data(train_rows,:);
xtest=test(:,1:m-1);
ytest=test(:,m);
xtrain=train(:,1:m-1);
ytrain=train(:,m);
I put the resault of each classifier in out 1-5 and then aggregate them in output and compared output with test labels :
out1 = majorityvote(tt(1,:));
out2 = majorityvote(tt(2,:));
out3 = majorityvote(tt(3,:));
out4 = majorityvote(tt(4,:) );
out5 = majorityvote(tt(5,:) );
output=[out1,out2,out3,out4,out5];
for i=1:test_count
if(output(i)==1 && ytest(i)==1)
tp_ens=tp_ens+1;
end
if(output(i)==0 && ytest(i)==0)
tn_ens=tn_ens+1;
end
if(output(i)==0 && ytest(i)==1)
fp_ens=fp_ens+1;
end
if(output(i)==1 && ytest(i)==0)
fn_ens=fn_ens+1;
end
end
this codes doesn't have any problems with other datasets in this part but for the liver data (attached) It shows this error:
Index exceeds matrix dimensions.
Error in pimaclassify_new (line 174)
if(output(i)==1 && ytest(i)==1)
Maybe because the number of test_count for specified number of rows of data were obtained 5 so comparing them with test labels was true but for liver data which have different number of rows , this comparing shows error.
Should I change the sizes of outputs of classifiers or the size of test data or test_count?
I'll be grateful to have your opinions about fixing the error.
Thanks
6 件のコメント
dpb
2019 年 6 月 22 日
"Should I change the sizes of outputs of classifiers or the size of test data or test_count?"
How can we possibly know?
I'd only say that naming variables with numeric postfixes and manually catenating those variables into a composite array is simply a wrong way to approach coding your problem. Use cell arrays or named struct fields or some other dynamic way to handle variably-sized input data instead.
Hardcoding values for loops and the like is bound to lead to such mismatches when the precise data formats aren't present for every case; writing generic code to handle such will save you much grief going forward.
phdcomputer Eng
2019 年 6 月 24 日
編集済み: phdcomputer Eng
2019 年 6 月 24 日
Bob Thompson
2019 年 6 月 24 日
What dpb is referring to with the variable size output is to change your definition of output to be something more like this.
output(1) = majorityvote(tt(1,:));
output(2) = majorityvote(tt(2,:));
output(3) = majorityvote(tt(3,:));
output(4) = majorityvote(tt(4,:) );
output(5) = majorityvote(tt(5,:) );
As for the original indexing issue, I'm not entirely sure how to fix you code, but I can describe the problem in greater detail.
You are getting 'index exceeds matrix dimensions' for this command:
if(output(i)==1 && ytest(i)==1)
I can clearly tell that output has five elements, while 'i' is defined from 1:test_count, which is in turn based on the number of rows in you data. I do not know the exact number of rows in ytest, but I can see that it is also based on the size of data.
Therefore, I would assume that output(i) is causing the problem when i>5, and you need to either reexamine how many elements you have in output, or you need to find a different way of calculating the range if i.
Guillaume
2019 年 6 月 24 日
I strongly suspect that
output(1) = majorityvote(tt(1,:));
would result in an error. Since majorityvote, whatever that is, is indexed by a row vector, presumably with more than 1 element (otherwise why the : ?), it is very likely to return more than one element.
Now, depending on the shape of majorityvector and tt, the concatenation of [out1, out2, ...] is going to return a 2D matrix (if majorityvector is a column vector or a matrix), or a row vector (if majorityvector is a row vector).
Assuming the former, then this would problably work:
output = zeros(size(tt, 1), 5);
output(:, 1) = majorityvote(tt(1, :));
output(:, 2) = ...
which is simply the one liner
output = majorityvote(tt); %assuming tt has 5 columns, otherwise tt(1:5, :)
Bob Thompson
2019 年 6 月 24 日
You bring up a good point about the size of the output of majorityvote, I should not have assumed it was a single element. With that said though, why would the result be a single column vector, when the input is a single row vector. It would make sense with the original concatenation of output, but it seems like a confusing way to write the function. Also, do we know that majorityvote(tt) will automatically consider the rows individually, or will it simple take the entire array as a single large input?
Guillaume
2019 年 6 月 24 日
If majorityvote is a vector, since tt(row, :) is a vector (column or row doesn't matter), then majorityvote(tt(row, :)) will be the same shape as majorityvote. A(B) is the shape of A when both A and B are vectors
If majorityvote is not a vector, then majorityvote(tt(row, :)) will be the same shape as tt(row, :) hence a column vector. A(B) is the shape of B when either A or B is not a vector.
An annoying or useful inconsistency depending on your point of view.
A corollary of the above is that output = majorityvote(tt) will be the same size as tt, with output(r, c) equal to majorityvote(tt(r, c))
回答 (0 件)
カテゴリ
ヘルプ センター および File Exchange で Deep Learning Toolbox についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!