探索sklearn | K均值聚类

1 K均值聚类

K均值聚类是一种非监督机器学习算法,只需要输入样本的特征 ,而无需标记。

K均值聚类首先需要随机初始化K个聚类中心,然后遍历每一个样本,将样本归类到最近的一个聚类中,一个聚类中样本特征值的均值作为这个聚类新的聚类中心,聚类中心的改变,又会改变样本的类别,如此循环往复,直至每一个样本的类别稳定后,也就是聚类中心不再改变是,完成。

我还是以我们熟悉地鸢尾花数据集来举例子

 

2 对样本进行聚类

sklearn对于所有的机器学习算法有一个一致的接口,一般需要以下几个步骤来进行学习

  1. 初始化分类器,根据不同的算法,需要给出不同的参数,一般所有的参数都有一个默认值。对于K均值聚类,我们需要给定类别的个数n_cluster,通过先验的知识,我们知道鸢尾花数据集里共有三种不同类型的鸢尾花,于是是3;K均值聚类,是一个循环更新聚类中心以及样本类别的算法,需要设定循环的次数;最后K均值聚类的结果还与初始聚类中心有关,n_init设为10意味着进行10次随机初始化,选择效果最好的一种来作为模型
  2. 对于非监督机器学习,输入的数据是样本的特征,clf.fit(X)就可以把数据输入到分类器里
  3. 用分类器对未知数据进行分类,需要使用的是分类器的predict方法
from sklearn.cluster import KMeans

clf = KMeans(n_clusters=3, max_iter=300, n_init=10)
clf.fit(X)
ypred = clf.predict(X)

 我们还可以一步完成,将数据输入到分类器,同时对输入数据进行分类的工作

ypred = clf.fit_predict(X)

 3 分析聚类的结果

一样我们可以把结果画在三维的散点图里

但是完全看不出和原本正确的分类有什么区别,差异很大的山鸢尾花毫无疑问地全部分类正确

计算正确率可能是一个不错的选择,

>>y
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  #原数据集山鸢尾花的标签是0
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
       2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
       2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])
>>ypred
array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  #分类器给出山鸢尾花的标签是1
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
       2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
       2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 2, 2,
       0, 0, 0, 0, 2, 0, 2, 0, 2, 0, 0, 2, 2, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0,
       2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 2])

 查看正确的标签和分类器给出的标签,却发现他们并非使用的是同一个标签,那么想简单地通过sum(y==ypred)计算正确率是不可能的了

posted on 2015-02-04 16:20  meelo  阅读(7214)  评论(1编辑  收藏  举报