how to find mode without built-in mode function?

any suggestions how to write a function that finds a vectors mode WITHOUT using the built-in mode function?

Réponses (3)

the cyclist
the cyclist le 9 Juin 2013

1 vote

You could use the hist() function, and use the value that has the highest count.

5 commentaires

How can I precisely read which value has the highest count?
[counts, centers] = hist(YourVector);
[~, maxidx] = max(counts);
mode_value = centers(maxidx);
This gives me non-integer values when all values in my array are integers.
I think this is because by default, hist() chooses the bin centers by an algorithm that does not guarantee they are in the original vector. Try this instead:
[counts, centers] = histcounts(YourVector,[unique(YourVector) Inf]);
[~, maxidx] = max(counts);
mode_value = centers(maxidx);
I realized that that code will not find all the modes, if there are multiple. This code should:
[counts, centers] = histcounts(YourVector,[unique(YourVector) Inf]);
max_value = max(counts);
max_idx = (counts==max_value);
mode_values = centers(max_idx)

Connectez-vous pour commenter.

Walter Roberson
Walter Roberson le 9 Juin 2013

1 vote

unique(), take the third output, put it through accumarray(), find the max()
Roger Stafford
Roger Stafford le 9 Juin 2013
Modifié(e) : Roger Stafford le 9 Juin 2013
If you are not allowed to use the 'mode' function, it sounds as though you must use only more primitive functions. Are you allowed to do the following with v as the given column vector?
u = sort(v);
f = find([true;diff(u)~=0;true]);
[~,ix] = max(diff(f));
m = u(f(ix)); % m is most frequent value occurring in v
(Corrected)

5 commentaires

dana
dana le 9 Juin 2013
thanks. i am indeed not allowed to use the mode function and need to do it in a more primitive way. i am not sure, though, that i completely understand what you did here. could you please explain?
There's nothing magic about it. I'll give an example. Let v be:
v = [9;4;2;4;9;2;4]
Then you get
u = sort(v) = [2;2;4;4;4;9;9]
diff(u) = [0;2;0;0;5;0]
diff(u)~=0 = [F;T;F;F;T;F] Where 'T' & 'F' stand for true & false
[true;diff(u)~=0;true] = [T;F;T;F;F;T;F;T]
f = find([true;diff(u)~=0;true]) = [1;3;6;8]
diff(f) = [2;3;2]
max(diff(f)) is max at second value, hence ix = 2
f(ix) = f(2) = 3
m = u(f(ix)) = u(3) = 4 Therefore the mode value is 4
Does that show you the principles involved?
I am trying this and I am getting the below error. Sorry to bring this up on a 7.5 year comment, it's just relevant to something I am doing right now.
Error using vertcat
Dimensions of arrays being concatenated are not consistent.
Error in Question_1 (line 29)
f = find([true;diff(u)~=0;true]);
That depends on the dimensions of v. If it is a column vector this runs without error.
v = [9;4;2;4;9;2;4];
u = sort(v);
[true;diff(u)~=0;true]
ans = 8x1 logical array
1 0 1 0 0 1 0 1
v = [9;4;2;4;9;2;4];
v = v.';
u = sort(v);
[true;diff(u)~=0;true]
Error using vertcat
Dimensions of arrays being concatenated are not consistent.
Louise Wade
Louise Wade le 7 Jan 2021
Modifié(e) : Louise Wade le 7 Jan 2021
I'll try and transpose my row vector into a column vector and try again. If there are multiple values as the mode, would this cause an issue?
EDIT: It seems to be working for me. Thank you so much for helping. All I needed to do was transpose the array.

Connectez-vous pour commenter.

Catégories

En savoir plus sur Creating, Deleting, and Querying Graphics Objects dans Centre d'aide et File Exchange

Question posée :

le 9 Juin 2013

Commenté :

le 7 Jan 2021

Community Treasure Hunt

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

Start Hunting!

Translated by