Code covered by the BSD License

### Highlights from K-medoids

3.88889
3.9 | 9 ratings Rate this file 85 Downloads (last 30 days) File Size: 32.4 KB File ID: #28898 Version: 1.3

# K-medoids

by

### Mo Chen (view profile)

30 Sep 2010 (Updated )

K-medoids clustering algorithm

File Information
Description

Efficient implementation of K-medoids clustering methods. http://en.wikipedia.org/wiki/K-medoids

It is usually more robust than kmeans algorithm.

try
label=kmedoids(x,3);

Input data are assumed COLUMN vectors!
You can only visualize 2d data!

Acknowledgements

This file inspired Parallel Coordinate Plots Gui Toolbox.

MATLAB release MATLAB 8.2 (R2013b)
26 Jun 2015 Mark Ebden

### Mark Ebden (view profile)

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;
end

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

### Eelke Spaak (view profile)

Even though the code is lightning fast, the solution is not the proper one, hence this code is useless. See http://i.imgur.com/VNY73l7.png 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

### Yuanjun Xiong (view profile)

05 Apr 2014 kalarmago

### kalarmago (view profile)

05 Apr 2014 kalarmago

### kalarmago (view profile)

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

### Nejc Ilc (view profile)

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.

swaheed.iu@gmail.com

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)

Comment only
18 Mar 2012 Dinusha Rathnayaka

### Dinusha Rathnayaka (view profile)

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

Comment only
18 Mar 2012 Dinusha Rathnayaka

### Dinusha Rathnayaka (view profile)

SIMPLY NOT working.
label=kmedoids(x,3);

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