Python K-均值算法

我正在寻找带有示例的k-means算法的Python实现来聚类和缓存我的坐标数据库。

8个解决方案

54 votes

Scipy的集群实施效果很好,其中包括k-means实施。

还有scipy-cluster,它可以进行聚集聚类。 它的优点是您无需提前决定群集的数量。

tom10 answered 2020-06-23T11:05:11Z
28 votes

SciPy的kmeans2()有一些数字问题:其他报告了错误消息,例如0.6.0版中的“矩阵不是正定的-无法计算Cholesky分解”,而我在0.7.1版中遇到了同样的问题。

就目前而言,我建议改为使用PyCluster。 用法示例:

>>> import numpy
>>> import Pycluster
>>> points = numpy.vstack([numpy.random.multivariate_normal(mean,
0.03 * numpy.diag([1,1]),
20)
for mean in [(1, 1), (2, 4), (3, 2)]])
>>> labels, error, nfound = Pycluster.kcluster(points, 3)
>>> labels # Cluster number for each point
array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], dtype=int32)
>>> error # The within-cluster sum of distances for the solution
1.7721661785401261
>>> nfound # Number of times this solution was found
1
Vebjorn Ljosa answered 2020-06-23T11:05:36Z
20 votes

对于连续数据,k均值非常简单。

您需要一个均值列表,并且对于每个数据点,找到均值最接近的均值并将其平均化为新数据点。 您的均值将代表输入数据中最近的显着点集。

我连续进行平均,因此不需要旧数据即可获得新平均值。 给定旧的平均值k,下一个数据点x和一个常数n(它是要保留平均值的过去数据点的数量),新的平均值为

k*(1-(1/n)) + n*(1/n)

这是Python中的完整代码

from __future__ import division
from random import random
# init means and data to random values
# use real data in your code
means = [random() for i in range(10)]
data = [random() for i in range(1000)]
param = 0.01 # bigger numbers make the means change faster
# must be between 0 and 1
for x in data:
closest_k = 0;
smallest_error = 9999; # this should really be positive infinity
for k in enumerate(means):
error = abs(x-k[1])
if error < smallest_error:
smallest_error = error
closest_k = k[0]
means[closest_k] = means[closest_k]*(1-param) + x*(param)

您可以在所有数据通过后立即打印平均值,但是观看实时变化会更有趣。 我在20ms的声音频率包络上使用了此语言,并与之交谈了一两分钟后,它对于短的“ a”元音,长的“ o”元音和“ s”辅音具有统一的类别。 奇怪!

Nathan answered 2020-06-23T11:06:15Z
5 votes

从Wikipedia,您可以使用scipy,K-means聚类矢量量化

或者,您可以将Python包装器用于OpenCV,即ctypes-opencv。

或者,您可以使用OpenCV的新Python接口及其kmeans实现。

Jacob answered 2020-06-23T11:06:44Z
5 votes

(多年以后)可以使用scikits-learn-k-means来指定您自己的距离功能,该kmeans.py既简单又合理。 它使用scipy.spatial.distance中的20多种指标之一。

denis answered 2020-06-23T11:07:04Z
0 votes

您还可以使用GDAL,它具有许多处理空间数据的功能。

George Silva answered 2020-06-23T11:07:24Z
0 votes

SciKit Learn的KMeans()是在Python中应用k均值聚类的最简单方法。 拟合集群很简单:kmeans = KMeans(n_clusters=2, random_state=0).fit(X)。

此代码段显示了如何存储质心坐标并预测坐标数组的聚类。

>>> from sklearn.cluster import KMeans
>>> import numpy as np
>>> X = np.array([[1, 2], [1, 4], [1, 0],
... [4, 2], [4, 4], [4, 0]])
>>> kmeans = KMeans(n_clusters=2, random_state=0).fit(X)
>>> kmeans.labels_
array([0, 0, 0, 1, 1, 1], dtype=int32)
>>> kmeans.predict([[0, 0], [4, 4]])
array([0, 1], dtype=int32)
>>> kmeans.cluster_centers_
array([[ 1., 2.],
[ 4., 2.]])

(由SciKit Learn的文档提供,以上链接)

gsilv answered 2020-06-23T11:07:53Z
-1 votes

Python的Pycluster和pyplot可用于k-means聚类和2D数据的可视化。 最近的博客文章使用Python和PyCluster进行股票价格/数量分析,给出了一个使用PyCluster对股票数据进行聚类的示例。

Guest answered 2020-06-23T11:08:13Z