Can not the computed centroid values to be plotted over the existing plot based on data

matplotlib, numpy, plot, python, scipy

Solution

A minor edit to answer your question about 2d:

You can use the original answer below, just take:

data = np.column_stack([x,y])

If you want to plot the centroids, it is the same as below in the original answer. If you want to color each value by the group selected, you can use `kmeans2`

from scipy.cluster.vq import kmeans2

centroids, ks = kmeans2(data, 3, 10)

To plot, pick `k` colors, then use the `ks` array returned by `kmeans2` to select that color from the three colors:

colors = ['r', 'g', 'b']
plt.scatter(*data.T, c=np.choose(ks, colors))
plt.scatter(*centroids.T, c=colors, marker='v')

original answer:

As @David points out, your `data` is one dimensional, so the centroid for each cluster will also just be one dimensional. The reason your plot looks 2d is because when you run

plt.plot(data)

if `data` is 1d, then what the function actually does is plot:

plt.plot(range(len(data)), data)

To make this clear, see this example:

data = np.array([3,2,3,4,3])
centroids, variances= kmeans(data, 3, 10)
plt.plot(data)

Then the centroids will be one dimensional, so they have no `x` location in that plot, so you could plot them as lines, for example:

for c in centroids:
    plt.axhline(c)

If you want to find the centroids of the x-y pairs where `x = range(len(data))` and `y = data`, then you must pass those pairs to the clustering algorithm, like so:

xydata = np.column_stack([range(len(data)), data])
centroids, variances= kmeans(xydata, 3, 10)

    

But I doubt this is what you want. Probably, you want random `x` and `y` values, so try something like:

data = np.random.rand(100,2)
centroids, variances = kmeans(data, 3, 10)

Problem

EDIT: Ok, if the data are two dimensional as follows: ``` x = [1,1,1,2,2,2,3,3,3,4,4,4,5,5,5] y = [8,7,5,4,3,7,8,3,2,1,9,11,16,18,19] ``` Then, how to calculate the k means (3 values) and make plot? Can not the computed centroid values be plotted over the existing plot based on data here? I want to make the similiar plot as done in the following link http://glowingpython.blogspot.jp/2012/04/k-means-clustering-with-scipy.html However, I could not understand. Any help would be highly appreciated. ``` import numpy as np, matplotlib.pyplot as plt from scipy.cluster.vq import kmeans, vq data = np.array(np.random.rand(100)) plt.plot(data, 'ob') centroids, variances= kmeans(data,3,10) indices, distances= vq(data,centroids) print (centroids) [ 0.82847854 0.49085422 0.18256191] plt.show() ```

Original source