sklearn基本用法----K-means

K-means(K-均值)

1.定义
       k-means算法源于信号处理中的一种向量量化方法,现在则更多地作为一种聚类分析方法流行于数据挖掘领域。
       k-means聚类的目的是:把 n个点(可以是样本的一次观察或一个实例)划分到k个聚类中,使得每个点都属于离他最近的均值(此即聚类中心)对应的聚类,以之作为聚类的标准。用这k个聚类的均值来代表相应各类样本时所得的总体误差最小。这个问题将归结为一个把数据空间划分为Voronoi cells的问题。
       这个问题在计算上是困难的(NP困难),不过存在高效的启发式算法。一般情况下,都使用效率比较高的启发式算法,它们能够快速收敛于一个局部最优解。这些算法通常类似于通过迭代优化方法处理高斯混合分布的最大期望算法(EM算法)。而且,它们都使用聚类中心来为数据建模;然而k-means聚类倾向于在可比较的空间范围内寻找聚类,期望-最大化技术却允许聚类有不同的形状。
       k-means算法的基础是最小误差平方和准则,采用误差平方和准则函数作为聚类准则函数。
       k-means聚类与k-nn(k-近邻)之间没有任何关系(后者是另一流行的机器学习技术),k-nn将在下一次博客中介绍。
2.历史
       虽然其思想能够追溯到1957年的Hugo Steinhaus ,术语“k-均值”于1967年才被James MacQueen 首次使用。标准算法则是在1957年被Stuart Lloyd作为一种脉冲码调制的技术所提出,但直到1982年才被贝尔实验室公开出版 。在1965年,E.W.Forgy发表了本质上相同的方法,所以这一算法有时被称为Lloyd-Forgy方法。更高效的版本则被Hartigan and Wong提出(1975/1979)A more efficient version was proposed and published in Fortran by Hartigan and Wong in 1975/1979。
3.算法过程
(1)从N个数据对象中随机选取K个对象作为初始聚类中心。
(2)对剩余的每个数据对象按照最小距离原则把它分配到最近的中心对象的类。
(3)重新计算已经得到的各个类的均值(中心对象),让它作为新的聚类中心。
(4)迭代2~3步直至新的中心对象与原中心对象相等或小于指定阈值,算法结束
(5)得到k个聚类。
4.算法优缺点
(1)优点:
      ①算法简单,快速;
      ②对大数据集有较高的效率且可收缩。
      ③时间复杂度近于线性,适合挖掘大规模数据集。
(2)缺点:
      ①在 K-means 算法中 K 是事先给定的,这个 K 值的选定是非常难以估计的。很多时候,事先并不知道给定的数据集应该分成多少个类别才最合适。
      ②在 K-means 算法中,首先需要根据初始聚类中心来确定一个初始划分,然后对初始划分进行优化。这个初始聚类中心的选择对聚类结果有较大的影响,一旦初始值选择的不好,可能无法得到有效的聚类结果,这也成为 K-means算法的一个主要问题。对于该问题的解决,许多算法采用遗传算法(GA)。
      ③ 从 K-means 算法框架可以看出,该算法需要不断地进行样本分类调整,不断地计算调整后的新的聚类中心,因此当数据量非常大时,算法的时间开销是非常大的。所以需要对算法的时间复杂度进行分析、改进,提高算法应用范围。
5.应用
       k-均值聚类(尤其是使用如Lloyd’s算法的启发式方法的聚类)即使是在巨大的数据集上也非常容易部署实施。正因为如此,它在很多领域都得到的成功的应用,如市场划分、机器视觉、 地质统计学、天文学和农业等。它经常作为其他算法的预处理步骤,比如要找到一个初始设置。

from sklearn import cluster,datasets
import numpy as np 

iris = datasets.load_iris()
X = iris.data
y = iris.target
km = cluster.KMeans(n_clusters = 3)
km.fit(X)
k_y = km.predict(X)
#根据实际情况设置映射
k2y = np.array([1,0,2])
print(k2y[k_y])
print((k2y[k_y] == y).astype(int).mean())

用pickle模块的方法保存训练后的模型,方便下次直接使用。

import pickle
with open('cc_kmean.pkl','wb') as f:
    pickle.dump(km,f)
with open('cc_kmean.pkl','rb') as f:
    cc_km = pickle.load(f)
print(cc_km.predict(X))
print((k2y[cc_km.predict(X)] == y).astype(int).mean())

辣么多好吃哒,然额我并不是一个吃货!!!
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值