Take the 2-minute tour ×
Mathematica Stack Exchange is a question and answer site for users of Mathematica. It's 100% free, no registration required.

I want to find the mode (i.e. most frequent element) of a list of values. I saw some example with distributions but I'm working with lists that contain numbers. Suppose that I have a lits like:

data=RandomVariate[BetaDistribution[6, 17], 1000]

enter image description here

I realized that one way is using SmoothKernelDistribution of the given list and finding its maximum by using this code:

ArgMax[PDF[SmoothKernelDistribution[data],x],x]

The point is that the above code returns a value which may not be in observed data list.

Any idea on finding mode of the above list?

share|improve this question
    
Have You read this, have You tried to search anything in documentation? –  Kuba Jul 15 '13 at 5:58
3  
Commonest[data] –  rm -rf Jul 15 '13 at 6:06
    
@rm-rf I'm not sure if it is good approach for continuous distribution. –  Kuba Jul 15 '13 at 6:09
2  
@Kuba He has a list of values, of which he wants the mode, and that is given by Commonest. Of course, whether a mode is a meaningful metric here is a different issue, which is left to the OP. –  rm -rf Jul 15 '13 at 6:16
    
@rm-rf I've tried Cmmonest but it returned a list of values. I want to have one value. –  Amin Jul 15 '13 at 15:00
show 6 more comments

closed as off-topic by Mr.Wizard Jul 15 '13 at 11:01

This question appears to be off-topic. The users who voted to close gave this specific reason:

  • "This question arises due to a simple mistake such as a trivial syntax error, incorrect capitalization, spelling mistake, or other typographical error and is unlikely to help any future visitors, or else it is easily found in the documentation." – Mr.Wizard
If this question can be reworded to fit the rules in the help center, please edit the question.

1 Answer

up vote 3 down vote accepted

Surely Commonest is the fastest and easiest way. But say you didn't know about Commonest, you could do it yourself... here's a list of values.

list = {1, 2, 3, 3, 4, 3, 2, 3, 4, 5, 6, 7, 8, 9};

The mode is the value that occurs the most times. So we can use Tally to find out how many times each occurs:

Tally[list]

{{1, 1}, {2, 2}, {3, 4}, {4, 2}, {5, 1}, {6, 1}, {7, 1}, {8, 1}, {9, 1}}

which shows that 2 occurs twice, 3 occurs 4 times etc. To find the one that occurs the most, sort the list by the second element and then pick the last one:

Last[Sort[Tally[list], #1[[2]] < #2[[2]] &]]

{3,4}

So now you see the 3 is the most common element. Gathering all these together:

 First[Last[Sort[Tally[list], #1[[2]] < #2[[2]] &]]]

 3

For the case of a continuous distribution, as shown by a histogram, one can use

histData = HistogramList[data]

which provides a list of the binned values and their frequency. The bin in which the largest number occur is a good candidate. This can be found by finding the index of the maximum element and then locating the edges of that histogram bin.

indMax = Ordering[histData[[2]]][[-1]];
histData[[1]][[indMax ;; indMax + 1]]

or the distribution above, this gives the range {13/50, 7/25}, which is the histogram bin that has the largest number of entries.

share|improve this answer
    
Notice that this method is not very useful for his sample. –  Kuba Jul 15 '13 at 10:00
    
@bill s , thank you for your response.I tried your code but it returned a value which its Count was 1. –  Amin Jul 15 '13 at 15:07
    
Amin -- this is no doubt because each value only occurs once in a continuous distribution. See if the HistogramList method helps. –  bill s Jul 15 '13 at 21:21
    
@bills, the idea of HistogramList it's what I'm looking for as the mean of the interval of bin containing largest number of entries returns the estimate of my interest.Thanks. –  Amin Jul 18 '13 at 2:07
add comment

Not the answer you're looking for? Browse other questions tagged or ask your own question.