Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python k-means算法_Python_Algorithm_Cluster Analysis_K Means - Fatal编程技术网

Python k-means算法

Python k-means算法,python,algorithm,cluster-analysis,k-means,Python,Algorithm,Cluster Analysis,K Means,我正在寻找k-means算法的Python实现,并提供示例来集群和缓存我的坐标数据库。从中,您可以使用scipy >>> 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

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

从中,您可以使用scipy

>>> 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.]])
或者,您可以为OpenCV使用Python包装器


或者您可以,以及它们的实现。

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

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

首先,你确定你想要k-means吗?提供了一些不同聚类算法的优秀图形摘要。我建议,除了图形之外,还要特别关注每个方法所需的参数,并决定是否可以提供所需的参数(例如,k-means需要集群的数量,但在开始集群之前,您可能不知道这一点)

以下是一些资源:

旧答案:

实现工作得很好,它们包括一个实现

还有一个,它进行聚集聚类;它的优点是,您不需要提前决定集群的数量。

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

现在,我建议改用。用法示例:

>>> 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

对于连续数据,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)
来自未来进口部的

从随机导入随机
#初始化意味着将数据转换为随机值
#在代码中使用真实数据
平均值=[random()表示范围(10)内的i]
数据=[random()表示范围内的i(1000)]
param=0.01#数字越大,平均值变化越快
#必须介于0和1之间
对于数据中的x:
最近的_k=0;
最小误差=9999;#这应该是正无穷大
对于枚举中的k(指):
错误=abs(x-k[1])
如果误差<最小误差:
最小误差=误差
最近的_k=k[0]
表示[最近的_k]=表示[最近的_k]*(1-参数)+x*(参数)

当所有的数据都通过时,你可以直接打印出来,但实时观察数据的变化更有趣。我在20ms比特的声音频率封套上使用了它,在与它交谈一两分钟后,它对短“a”元音、长“o”元音和“s”辅音的分类是一致的。威德

(几年后)下面的这个kmeans.py非常简单,速度也相当快;它使用scipy.spatial.distance中的20多个度量中的任意一个。

Python的Pycluster和pyplot可用于k-means聚类和二维数据的可视化。最近的一篇博客文章给出了在股票数据上使用PyCluster进行聚类的示例。

SciKit Learn是在Python中应用k-means聚类的最简单方法。拟合簇很简单,如下所示:
kmeans=kmeans(n_集群=2,随机状态=0)。拟合(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的文档提供,如上链接)

scipy cluster kmeans函数似乎也不接受距离方法,而是始终使用欧几里德函数。使用PyCluster的另一个原因?只需点击上面提到的错误。。。我在你的例子中看到了集群分组,但是你能得到集群“中心”吗?@monkup,
numpy.vstack([points[labels==I].mean(0)表示范围内的I(labels.max()+1)]
来获得集群的中心。你可以通过使用关键字参数minit='points'来消除kmeans2中的错误。我对图像做了类似的实现。可以使用二维数组而不是RGB值。这是一个很棒的在线学习kmeans算法!但在代码的最后一行有一个bug。应删除此行上的一个选项卡:means[最近的_k]=means[最近的_k]*(1-param)+x*(param)为什么k-means首选scipy而不是sklean?最近使用了这两种方法后,我发现我更喜欢sklearn的实现