how to create pairwise label matrix ?

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 Kommentare

Guillaume
Guillaume am 26 Jul. 2018
if any two are neighbors so the label is one. if any two are not neighbors so the label is -1 and use label 0 otherwise
Hum, as far as I can tell some things are either neighbours (1) or not (-1), there is no third option. So what would 0 denote?
As for answering your question, it's completely unclear what the definition of a neighbour is. Similarly, you're talking about 1, 3 being of the same class. We have no idea what 1, 3 mean, nor what same class mean.
Can you give an example of input(s) and desired output(s)?
Sarah A
Sarah A am 26 Jul. 2018
Thank you for your comment. I edited my question, can you read it again and give me your feedback.
Guillaume
Guillaume am 26 Jul. 2018
yes, it's a lot clearer now. The only thing missing is how do you know the sample class?
Sarah A
Sarah A am 31 Jul. 2018
this input information which means I previously know these samples classes.

Melden Sie sich an, um zu kommentieren.

 Akzeptierte Antwort

dpb
dpb am 26 Jul. 2018
Bearbeitet: dpb am 26 Jul. 2018

1 Stimme

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 Kommentare

Sarah A
Sarah A am 31 Jul. 2018
can you explain your solution for me please, I totally new in Matlab.
dpb
dpb am 31 Jul. 2018
Bearbeitet: dpb am 31 Jul. 2018
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.

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (1)

Guillaume
Guillaume am 26 Jul. 2018

1 Stimme

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 Kommentare

dpb
dpb am 26 Jul. 2018
" class it's too useful a function..."
Very good point; being a dinosaur I don't write OO code so didn't even think of it... :)
Guillaume
Guillaume am 31 Jul. 2018
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
dpb am 31 Jul. 2018
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...

Melden Sie sich an, um zu kommentieren.

Kategorien

Mehr zu Descriptive Statistics finden Sie in Hilfe-Center und File Exchange

Gefragt:

am 26 Jul. 2018

Bearbeitet:

dpb
am 31 Jul. 2018

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by