我正在寻找k-means算法的Python实现与示例,以集群和缓存我的坐标数据库。
发布于 2009-10-09 22:10:57
更新:(在这个原始答案11年后,可能是时候进行更新了。)
首先,你确定你想要k-means吗?This page对一些不同的聚类算法进行了很好的图形化总结。我建议除了图形之外,特别要查看每个方法所需的参数,并决定是否可以提供所需的参数(例如,k-means需要聚类的数量,但在开始聚类之前,您可能不知道)。
以下是一些资源:
的老答案:
Scipy's clustering实现运行良好,其中包括一个k-means实现。
还有scipy-cluster,它执行聚集集群;它的优点是您不需要提前决定集群的数量。
发布于 2010-02-09 04:03:44
SciPy的kmeans2()有一些数值问题:在0.6.0版本中,还有一些reported错误消息,比如“矩阵不是正定的--乔勒斯基分解无法计算”,而我在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发布于 2010-04-09 13:21:50
对于连续数据,k-means算法非常简单。
你需要一个均值列表,对于每个数据点,找到它最接近的平均值,并对它的新数据点进行平均。您的均值将表示输入数据中最近显着的点群集。
我不断地进行平均,因此不需要使用旧数据来获得新的平均值。给定旧的平均值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)当所有数据都通过时,您可以只打印该均值,但实时观察它的变化要有趣得多。我在20毫秒的频率包络上使用它,在与它交谈一到两分钟后,它对短'a‘元音,长'o’元音和's‘辅音有一致的分类。怪异!
https://stackoverflow.com/questions/1545606
复制相似问题