首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python k-means算法

Python k-means算法
EN

Stack Overflow用户
提问于 2009-10-09 19:16:13
回答 8查看 89.4K关注 0票数 48

我正在寻找k-means算法的Python实现与示例,以集群和缓存我的坐标数据库。

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2009-10-09 22:10:57

更新:(在这个原始答案11年后,可能是时候进行更新了。)

首先,你确定你想要k-means吗?This page对一些不同的聚类算法进行了很好的图形化总结。我建议除了图形之外,特别要查看每个方法所需的参数,并决定是否可以提供所需的参数(例如,k-means需要聚类的数量,但在开始聚类之前,您可能不知道)。

以下是一些资源:

的老答案:

Scipy's clustering实现运行良好,其中包括一个k-means实现。

还有scipy-cluster,它执行聚集集群;它的优点是您不需要提前决定集群的数量。

票数 56
EN

Stack Overflow用户

发布于 2010-02-09 04:03:44

SciPy的kmeans2()有一些数值问题:在0.6.0版本中,还有一些reported错误消息,比如“矩阵不是正定的--乔勒斯基分解无法计算”,而我在0.7.1版本中也遇到了同样的问题。

目前,我建议使用PyCluster。示例用法:

代码语言:javascript
复制
>>> 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
票数 29
EN

Stack Overflow用户

发布于 2010-04-09 13:21:50

对于连续数据,k-means算法非常简单。

你需要一个均值列表,对于每个数据点,找到它最接近的平均值,并对它的新数据点进行平均。您的均值将表示输入数据中最近显着的点群集。

我不断地进行平均,因此不需要使用旧数据来获得新的平均值。给定旧的平均值k、下一个数据点x和一个常量n (即要保留其平均值的过去数据点的数量),新平均值为

代码语言:javascript
复制
k*(1-(1/n)) + n*(1/n)

以下是Python的完整代码

代码语言:javascript
复制
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‘辅音有一致的分类。怪异!

票数 21
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1545606

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档