Code covered by the BSD License  

Download apps, toolboxes, and other File Exchange content using Add-On Explorer in MATLAB.

» Watch video

Highlights from

3.9 | 9 ratings Rate this file 30 Downloads (last 30 days) File Size: 2.38 KB File ID: #28898 Version: 1.3
image thumbnail



Mo Chen (view profile)


30 Sep 2010 (Updated )

Very fast matlab implementation of kmedoids clustering algorithm

| Watch this File

File Information

This is a fully vectorized version kmedoids clustering methods ( It is usually more robust than kmeans algorithm. Please try following code for a demo:
close all; clear;
d = 2;
k = 3;
n = 500;
[X,label] = kmeansRnd(d,k,n);
y = kmedoids(X,k);
Input data are assumed COLUMN vectors!
You can only visualize 2d data!
This function is now a part of the PRML toolbox (


Pattern Recognition And Machine Learning Toolbox inspired this file.

This file inspired Parallel Coordinate Plots Gui Toolbox.

MATLAB release MATLAB 9.0 (R2016a)
MATLAB Search Path
Tags for This File   Please login to tag files.
Please login to add a comment or rating.
Comments and Ratings (17)
26 Jun 2015 Mark Ebden

Thanks for this code, but for some datasets it's hypersensitive to rounding errors: occasionally the slightly nonzero entries along D's diagonal lead to results that are surprisingly far from correct (eg the chance that given medoids are chosen increases or decreases). I can email code to demonstrate if needed.

The problem is fixed by adding a for-loop after D is defined:

for i=1:n,
D(i,i) = 0;

To confirm that this yields 'correct' results, I perturbed one of the problematic datasets by a tiny amount and compared medoids before-and-after.

Hope that helps.

19 May 2014 Eelke Spaak

Even though the code is lightning fast, the solution is not the proper one, hence this code is useless. See for example output of k = 6 for a naive (and very slow) implementation of the algorithm, and this submission. Obviously the naive is correct, this submission is incorrect.

Nonetheless thanks for the effort! It would be great if you could produce correct code that is still as fast.

02 May 2014 Yuanjun Xiong  
05 Apr 2014 kalarmago  
05 Apr 2014 kalarmago

I tested calling to kmedoids() function, it always returns
label = 2 1
energy = 0
index = 2 1
I believe it does not work. Thanks anyway.

Comment only
03 Apr 2014 SU Li

SU Li (view profile)

Nice code. Very helpful. However, if the number of input data is large, then the D matrix is too large (n^2) which may make memory overflow.

Comment only
03 Apr 2014 Joao Henriques

Joao Henriques (view profile)

Simple and elegant code, thanks!

23 Dec 2013 Tong

Tong (view profile)

If I want to use the cosine distance between two vectors, What shold I do?

26 Nov 2013 MUSA

MUSA (view profile)

08 Oct 2013 kannan

kannan (view profile)

if i want to apply kmedoids agorithm for X data in function [label, energy, index] = kmedoids(X,k) 3599*11 size data then it is not working properly can anybody of you give idea for this?

Comment only
27 Aug 2013 Nejc Ilc

Very compact and efficient coding. Nice job!
However, there is an error when k=1. I suggest to add the third parameter (dimension) to the calls of function min:
(Line 8): [~, label] = min(D(randsample(n,k),:),[],1);
(Line 11): [~, label] = [~, index] = min(D*sparse(1:n,label,1,n,k,n),[],1);

13 Dec 2012 Tu

Tu (view profile)

Not working for my data as well.
My data was of the dimension 17-by-71.
wanted to find 4 or 6 clusters.
and spread did not work.

Comment only
24 May 2012 Graeme

Graeme (view profile)

Undefined function 'randsample' for input arguments of type 'double'.

Error in kmedoids (line 8)
[~, label] = min(D(randsample(n,k),:));

Comment only
09 Apr 2012 huang

huang (view profile)

20 Mar 2012 Mo Chen

Mo Chen (view profile)

better post your error message

Comment only
18 Mar 2012 Dinusha Rathnayaka

Dear Sir Pls help!!! My Matlab version is Matlab7.6.0..Is this the reason?
Pls reply when you free!!!

Comment only
18 Mar 2012 Dinusha Rathnayaka

SIMPLY NOT working.
load data;

Comment only
04 Feb 2012 1.1

significantly simplify the code

15 Feb 2012 1.2

correct description

17 Oct 2013 1.3

fix bug for k=1

07 Mar 2016 1.3

improved numerical stability, remove empty clusters

Contact us