how to create pairwise label matrix ?
1 回表示 (過去 30 日間)
古いコメントを表示
Hello,
I aim to create a label matrix that works as the following:
suppose I have the samples (1,2,3,4) as vectors and I want to say if any two are neighbors so the label is (1). if any two are not neighbors so the label is (-1). Note that neighbors means these two samples are of the same class. for example, the samples 1 and 3 belong to the same class and the samples 2 and 4 belong to the same class. Now, since the samples 1 and 3 of the same class so the label is (1). The samples 2 and 4 of the same class so the label is (1). The samples 1 and 4 is not of the same class so the label is (-1). The samples 3 and 2 is not of the same class so the label is (-1). In the matrix if the pair like (1,1) or (2,2).. so put zero. finally, the matrix should be:
[0 -1 1;-1 0 -1;1 -1 0 ]
So, any ideas to do that please.
Regards,
4 件のコメント
Guillaume
2018 年 7 月 26 日
yes, it's a lot clearer now. The only thing missing is how do you know the sample class?
採用された回答
dpb
2018 年 7 月 26 日
編集済み: dpb
2018 年 7 月 26 日
One possible solution--
>> class=categorical({'A','B','A','B'});
>> nk=nchoosek(1:4,2);
>> arrayfun(@(ix1,ix2) isequal(class(ix1),class(ix2)),nk(:,1),nk(:,2))
ans =
6×1 logical array
0
1
0
0
1
0
>>
Or, for your scaling,
>> ~arrayfun(@(ix1,ix2) isequal(class(ix1),class(ix2)),nk(:,1),nk(:,2))*2-1
ans =
1
-1
1
1
-1
1
>>
You can fill in the square array if desired, of course.
2 件のコメント
dpb
2018 年 7 月 31 日
編集済み: dpb
2018 年 7 月 31 日
nk is the list (by row) of four things taken two at a time so arrayfun just passes each pair to the anonymous function that is the functional form of the equality expression class(i)==class(j).
arrayfun is the one-line equivalent of writing an explicit for loop over the range of the indices 1:numel() of the variables in the argument list.
NB: I stuck with previous variable names; @G's correct in that 'class' isn't good to alias as general practice.
その他の回答 (1 件)
Guillaume
2018 年 7 月 26 日
Going with dpb's example (with slightly better variable names, don't use class it's too useful a function to shadow!), to generate the label matrix:
varclass = categorical({'A','B','A','B'});
labelmatrix = 2 * (varclass == varclass') - 1;
labelmatrix(logical(eye(numel(varclass)))) = 0
3 件のコメント
Guillaume
2018 年 7 月 31 日
class hasn't got much to do with OOP actually. Too often do we ask the OP, "what is class(thevariable_that_generate_the_error) ?". Case in point, here, it would be useful to know what the 'sample class' actually is.
dpb
2018 年 7 月 31 日
Well, there's that use of class, too... :)
Had been in a conversation over on comp.lang.fortran comparing/contrasting newer features in it to C++ and had those kinds of classes on the brain at the time...
参考
カテゴリ
Help Center および File Exchange で Logical についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!