I'm working on k-means in MATLAB. Here are my codes:
load cobat.txt
k=input('Enter the number of cluster: ');
if k<8
[cidx ctrs]=kmeans(cobat, k, 'dist', 'sqEuclidean');
Z = [cobat cidx]
else
h=msgbox('Must be less than eight');
end
"cobat" is the file of mine and here it looks:
65 80 55
45 75 78
36 67 66
65 78 88
79 80 72
77 85 65
76 77 79
65 67 88
85 76 88
56 76 65
My problem is everytime I run the code, it always shows different result, different cluster. How can I keep the clustering result always the same?

 Akzeptierte Antwort

Walter Roberson
Walter Roberson am 5 Mai 2013

1 Stimme

%generate some initial cluster centers according to some deterministic algorithm
%in this case, I construct a space-diagonal equally spaced, but choose your
%own algorithm
minc = min(cobat, 1);
maxc = max(cobat, 1);
nsamp = size(cobat,1);
initialcenters = repmat(minc, nsamp, 1) + bsxfun(@times, (0:nsamp-1).', (maxc - minc) ./ (nsamp-1));
%Once you have constructed the initial centers, cluster using those centers
[cidx ctrs] = kmeans(cobat, k, 'dist', 'sqEuclidean', 'start', initialcenters);

6 Kommentare

Alvi Syahrin
Alvi Syahrin am 5 Mai 2013
Bearbeitet: Walter Roberson am 5 Mai 2013
Thank you for the answer.
I still get confused of this line:
initialcenters = repmat(minc, nsamp, 1) + bsxfun(@times, (0:nsamp-1).', (maxc - minc) ./ (nsamp-1));
Do you mean; I have to construct how to initial the central of the cluster in matlab? But it (k-means) picks randomly, no method. Then do you have any idea?
Walter Roberson
Walter Roberson am 5 Mai 2013
kmeans does not pick randomly if you pass the argument 'start' and a data matrix of initial cluster centroids.
That particular line constructs evenly-spaced points between the minimum and maximum values of each column -- similar to using linspace() but working on all the columns at once. The details are not really important: I just chose those centroids to have a bunch of centroids that were deterministically distributed around the entire space of values.
Alvi Syahrin
Alvi Syahrin am 5 Mai 2013
Ok. It's been fixed now, by changing some scripts. Thank you for the idea.
Excuse me! what are the parameters that kmean used to cluster image pixels? an intensity and position of the pixel or something else.
Thanks
initialcenters = repmat(minc, nsamp, 1) + bsxfun(@times, (0:nsamp-1).', (maxc - minc) ./ (nsamp-1));
please, matlab out an error on this line : "Error using +
Matrix dimensions must agree."
what can i do ??
%generate some initial cluster centers according to some deterministic algorithm
%in this case, I construct a space-diagonal equally spaced, but choose your
%own algorithm
minc = min(cobat, [], 1);
maxc = max(cobat, [], 1);
nsamp = size(cobat,1);
initialcenters = repmat(minc, nsamp, 1) + bsxfun(@times, (0:nsamp-1).', (maxc - minc) ./ (nsamp-1));
%Once you have constructed the initial centers, cluster using those centers
[cidx ctrs] = kmeans(cobat, k, 'dist', 'sqEuclidean', 'start', initialcenters);

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (2)

the cyclist
the cyclist am 4 Mai 2013

7 Stimmen

K-means clustering uses randomness as part of the algorithm Try setting the seed of the random number generator before you start. If you have a relatively new version of MATLAB, you can do this with the rng() command. Put
rng(1)
at the beginning of your code.

2 Kommentare

Alvi Syahrin
Alvi Syahrin am 4 Mai 2013
Thank you for the answer. I have MATLAB 7.11.0(R2010b), and when I tried that command, it's not working, getting an error for undefined function. Do you have any idea to solve this?
Type
>> doc randstream
to see how to do it in your version.

Melden Sie sich an, um zu kommentieren.

Pallavi Saha
Pallavi Saha am 14 Sep. 2017

0 Stimmen

I am facing the same issue inconsistency in the output of fcm. Can anyone help me

3 Kommentare

Walter Roberson
Walter Roberson am 14 Sep. 2017
K-means select cluster positions randomly unless you pass it specific start positions.
To stop the output from being random, you can either pass specific start positions for the clusters, or you can use rng() to set the random seed to a constant so that the same sequence of random values will be created each time.
Hi,
I have a question about rng(). If we use rng() command, K-means algortihm stil repeats until the results are getting convergenced to the best. Is that right?
Thank you
Yes.
rng(SomeParticularNumericSeed)
just ensures that it will always use the same random number sequence provided that no other random numbers are asked for between the rng() call and the kmeans call.

Melden Sie sich an, um zu kommentieren.

Community Treasure Hunt

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

Start Hunting!

Translated by