K-means聚类算法

1、K-means聚类算法

    聚类算法有很多种,K-Means 是聚类算法中的最常用的一种,算法最大的特点是简单,好理解,运算速度快,但是只能应用于连续型的数据,并且一定要在聚类前需要手工指定要分成几类。 

           1)先输入 k 的值,即我们指定希望通过聚类得到 k 个分组;

           2)从数据集中随机选取 k 个数据点作为初始大佬(质心); 

           3)对集合中每一个小弟,计算与每一个大佬的距离,离哪个大佬距离近,就跟定哪个大佬。

           4)这时每一个大佬手下都聚集了一票小弟,这时候召开选举大会,每一群选出新的大佬(即通过算法选出新的质心);

          5)如果新大佬和老大佬之间的距离小于某一个设置的阈值(表示重新计算的质心的位置变化不大,趋于稳定,或者说收敛),可以认为我们进行的聚类已经达到期望的结果,算法终止。

          6)如果新大佬和老大佬距离变化很大,需要迭代3~5步骤 .

2、k-means 算法缺点

          1)在 K-means 算法中 K 是事先给定的,这个 K 值的选定是非常难以估计的。

          2)在 K-means 算法中,首先需要根据初始聚类中心来确定一个初始划分,然后对初始划分进行优化。这个初始聚类中心的选择对聚类结果有较大的影响,一旦初始值选择的不好,可能无法得到有效的聚类结果,这也成为 K-means算法的一个主要问题。

sklearn中的KMeans

在sklearn中处理kmeans聚类问题,用到的是 sklearn.cluster.KMeans 这个类。
参数:

  • n_clusters:整形,缺省值=8, 生成的聚类数,即产生的质心(centroids)数。
  • max_iter:整形,缺省值=300, 执行一次k-means算法所进行的最大迭代数。
  • n_init:整形,缺省值=10, 用不同的质心初始化值运行算法的次数,最终解是在inertia意义下选出的最优结果。
  • init:有三个可选值:'k-means++', 'random',或者传递一个ndarray向量。此参数指定初始化方法,默认值为'k-means++'。

    1 ‘k-means++’ 用一种特殊的方法选定初始质心从而能加速迭代过程的收敛,参见 k_init 的解释获取更多信息。
    2 ‘random’ 随机从训练数据中选取初始质心。
    3 如果传递的是一个ndarray,则应该形如 (n_clusters, n_features) 并给出初始质心。

  • precompute_distances:三个可选值,‘auto’,True 或者 False。预计算距离,计算速度更快但占用更多内存。

    1 ‘auto’:如果 样本数乘以聚类数大于 12million 的话则不预计算距离。This corresponds to about 100MB overhead per job using double precision.
    2 True:总是预先计算距离。
    3 False:永远不预先计算距离。

  • tol:float形,默认值= 1e-4, 与inertia结合来确定收敛条件。
  • n_jobs:整形数。指定计算所用的进程数。内部原理是同时进行n_init指定次数的计算。

    1 若值为 -1,则用所有的CPU进行运算。若值为1,则不进行并行运算,这样的话方便调试。
    2 若值小于-1,则用到的CPU数为(n_cpus + 1 + n_jobs)。因此如果 n_jobs值为-2,则用到的CPU数为总CPU数减1。

  • random_state:整形或 numpy.RandomState 类型,可选, 用于初始化质心的生成器(generator)。如果值为一个整数,则确定一个seed。此参数默认值为numpy的随机数生成器。
  • verbose:整形,默认值=0
  • Verbosity mode
  • copy_x:布尔型,默认值=True, 当我们precomputing distances时,将数据中心化会得到更准确的结果。

    1 如果把此参数值设为True,则原始数据不会被改变。
    2 如果是False,则会直接在原始数据上做修改并在函数返回值时将其还原。但是在计算过程中由于有对数据均值的加减运算,所以数据返回后,原始数据和计算前可能会有细小差别。

属性:

  • cluster_centers_:向量,[n_clusters, n_features]
  • Coordinates of cluster centers (每个簇中心的坐标??)
  • Labels_:每个点的分类
  • inertia_:float形,每个点到其簇的质心的距离之和。
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.]])

用K-Means压缩图片的代码       

#!/usr/bin/python
# -*- coding: utf-8 -*-
from skimage import io
from sklearn.cluster import KMeans
import numpy as np
image = io .imread("timg.jpg")
io.imshow(image)
io.show()
rows = image.shape[0]
cols = image.shape[1]

image = image.reshape(image.shape[0]*image.shape[1],3)
kmeans = KMeans(n_clusters=128,n_init=10,max_iter=200)
kmeans.fit(image)
clusters = np.asarray(kmeans.cluster_centers_,dtype=np.uint8)
labels = np.asarray(kmeans.labels_,dtype=np.uint8)
labels = labels.reshape(rows,cols)
print(clusters.shape)
np.save("codebook_test.py",clusters)
io.imsave("compressed_test.jpg",labels)
image = io.imread("compressed_test.jpg")
io.imshow(image)
io.show()

                                                                                                                                                                 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值