# K-means++

In data mining, k-means++ is an algorithm for choosing the initial values (or "seeds") for the k-means clustering algorithm. It was proposed in 2007 by David Arthur and Sergei Vassilvitskii, as an approximation algorithm for the NP-hard k-means problem—a way of avoiding the sometimes poor clusterings found by the standard k-means algorithm. It is similar to the first of three seeding methods proposed, in independent work, in 2006 by Rafail Ostrovsky, Yuval Rabani, Leonard Schulman and Chaitanya Swamy. (The distribution of the first seed is different.)

## Background

The k-means problem is to find cluster centers that minimize the intra-class variance, i.e. the sum of squared distances from each data point being clustered to its cluster center (the center that is closest to it). Although finding an exact solution to the k-means problem for arbitrary input is NP-hard, the standard approach to finding an approximate solution (often called Lloyd's algorithm or the k-means algorithm) is used widely and frequently finds reasonable solutions quickly.
However, the k-means algorithm has at least two major theoretic shortcomings:
* First, it has been shown that the worst case running time of the algorithm is super-polynomial in the input size.
* Second, the approximation found can be arbitrarily bad with respect to the objective function compared to the optimal clustering.
The k-means++ algorithm addresses the second of these obstacles by specifying a procedure to initialize the cluster centers before proceeding with the standard k-means optimization iterations. With the k-means++ initialization, the algorithm is guaranteed to find a solution that is O(log k) competitive to the optimal k-means solution.

### Example of a suboptimal clustering

To illustrate the potential of the k-means algorithm to perform arbitrarily poorly with respect to the objective function of minimizing the sum of squared distances of cluster points to the centroid of their assigned clusters, consider the example of four points in $\mathbb {R} ^{2}$ that form an axis-aligned rectangle whose width is greater than its height.
If $k=2$ and the two initial cluster centers lie at the midpoints of the top and bottom line segments of the rectangle formed by the four data points, the k-means algorithm converges immediately, without moving these cluster centers. Consequently, the two bottom data points are clustered together and the two data points forming the top of the rectangle are clustered together—a suboptimal clustering because the width of the rectangle is greater than its height.
Consider now extending the rectangle in a horizontal direction to any desired width. The standard k-means algorithm will continue to cluster the points suboptimally, and by increasing the horizontal distance between the two data points in each cluster, we can make the algorithm perform arbitrarily poorly with respect to the k-means objective function.

## Improved initialization algorithm

The intuition behind this approach is that spreading out the k initial cluster centers is a good thing: the first cluster center is chosen uniformly at random from the data points that are being clustered, after which each subsequent cluster center is chosen from the remaining data points with probability proportional to its squared distance from the point's closest existing cluster center.
The exact algorithm is as follows:
* Choose one center uniformly at random among the data points.
* For each data point x not chosen yet, compute D(x), the distance between x and the nearest center that has already been chosen.
* Choose one new data point at random as a new center, using a weighted probability distribution where a point x is chosen with probability proportional to D(x)$^2$.
* Repeat Steps 2 and 3 until k centers have been chosen.
* Now that the initial centers have been chosen, proceed using standard k-means clustering.
This seeding method yields considerable improvement in the final error of k-means. Although the initial selection in the algorithm takes extra time, the k-means part itself converges very quickly after this seeding and thus the algorithm actually lowers the computation time. The authors tested their method with real and synthetic datasets and obtained typically 2-fold improvements in speed, and for certain datasets, close to 1000-fold improvements in error. In these simulations the new method almost always performed at least as well as vanilla k-means in both speed and error.
Additionally, the authors calculate an approximation ratio for their algorithm. The k-means++ algorithm guarantees an approximation ratio O(log k) in expectation (over the randomness of the algorithm), where $k$ is the number of clusters used. This is in contrast to vanilla k-means, which can generate clusterings arbitrarily worse than the optimum. A generalization of the performance of k-means++ with respect to any arbitrary distance is provided in .

## Applications

The k-means++ approach has been applied since its initial proposal. In a review by Shindler, which includes many types of clustering algorithms, the method is said to successfully overcome some of the problems associated with other ways of defining initial cluster-centres for k-means clustering. Lee et al. report an application of k-means++ to create geographical cluster of photographs based on the latitude and longitude information attached to the photos. An application to financial diversification is reported by Howard and Johansen. Other support for the method and ongoing discussion is also available online. Since the k-means++ initialization needs k passes over the data, it does not scale very well to large data sets. Bahman Bahmani et al. have proposed a scalable variant of k-means++ called k-means|| which provides the same theoretical guarantees and yet is highly scalable.

## Software

* Accord.NET contains C# implementations for k-means, k-means++ and k-modes.
* ALGLIB contains parallelized C++ and C# implementations for k-means and k-means++.
* Apache Commons Math contains k-means++
* ELKI data-mining framework contains multiple k-means variations, including k-means++ for seeding.
* MATLAB has a K-Means implementation that uses k-means++ as default for seeding.
* OpenCV contains C++ and Python K-means implementation (with optional k-means seed initialization).
* Orange includes k-means++ UI widget and API support
* R includes k-means, and the "flexclust" package can do k-means++
* scikit-learn has a K-Means implementation that uses k-means++ by default.
* Weka contains k-means (with optional k-means++) and x-means clustering.