关闭

scikit-learn学习之K-means聚类算法与 Mini Batch K-Means算法

标签: scikit-learnK-MeansK均值Mini Batch K-Means
27452人阅读 评论(1) 收藏 举报
分类:
======================================================================

本系列博客主要参考 Scikit-Learn 官方网站上的每一个算法进行,并进行部分翻译,如有错误,请大家指正   

转载请注明出处

======================================================================

K-means算法分析与Python代码实现请参考之前的两篇博客:

                                          《机器学习实战》kMeans算法(K均值聚类算法)    

                                           《机器学习实战》二分-kMeans算法(二分K均值聚类)

接下来我主要演示怎么使用Scikit-Learn完成K-means算法的调用


注明:本例分析是固定输入K值和输入k个初始中心点,这样做具有很大的局限性,容易陷入局部最优,可以利用其他算法(如canopy算法)进行粗聚类估计,产生n个簇,作为k-means的K值,这里不做详细说明

一:K-means聚类算法


1:K-means算法简介

       聚类算法,数据挖掘十大算法之一,算法需要接受参数k和k个初始聚类中心,即将数据集进行聚类的数目和k个簇的初始聚类“中心”,结果是同一类簇中的对象相似度极高,不同类簇中的数据相似度极低


2:K-means算法思想和描述

      思想: 以空间中k个中心点进行聚类,对最靠近他们的对象归类,通过迭代的方法,逐次更新各聚类中心

      描述:

       (1)适当选择C个类的初始中心
       (2)在第K此迭代中,对任意一个样本,求其到C各中心的距离,将该样本归到距离最短的中心所在的类
       (3)利用均值等方法更新该类的中心值
       (4)对于所有的C个聚类中心,如果利用(2)(3)的迭代法更新后,值保持不变,则迭代结束,否则继续迭代

3:集合实例的简单介绍

                                  例如现在有四种药物A,B,C,D,他们分别有两个属性。如下图
                                                     
                                   将他们表示在坐标轴上为:
                                                                  
           第一次迭代,随机选取两个点作为初始中心点,eg c1,c2作为初始中心点,D0中分别为四个点到两个样本点的距离,X,Y为横纵坐标
                                                                        
           A点离第一个点最近,所以group-1行A点置1,剩下的三个点离第二个中心点最近,所以group-2行置1    
 
          此时应该更新样本点,c1不变,c2更新为((2+4+5)/3,(1+3+4)/3)=(11/3,8/3),更新后的数据中心点如下图红点所示
                                                                        
         第二次迭代,以(11/3,8/3)作为样本中心点,分别计算四个点到样本中心点的距离,如下图
                                                                         
         A,B点距离第一个中心点最近,C,D点距离第二个中心点最近,所以group-1行,A,B置1,group-2行C,D置1
                                                                                          
         此时重新更新样本中心点,c1=((1+2)/2,(1+1)/2)=(3/2,1),c2=((4+5)/2,(3+4)/2)=(9/2,7/2),更新后的数据中心点如下图红点所示
                                                                           
         第三次迭代,计算同上,略过,此时数据的样本中心点不再发生变化,所以可以停止迭代,最终聚类情况如下:
                                                               

4:下边看一个使用sklearn.Kmeans的实例(实例来源

实例说明:利用sklearn.datasets.make_blobs产生1500条两维的数据集进行不同情况下的聚类示例,代码如下
<span style="font-size:18px;">#coding:utf-8
'''
Created on 2016/4/25

@author: Gamer Think
'''
import numpy as np      #科学计算包
import matplotlib.pyplot as plt      #python画图包

from sklearn.cluster import KMeans       #导入K-means算法包
from sklearn.datasets import make_blobs

plt.figure(figsize=(12, 12))

'''
make_blobs函数是为聚类产生数据集
产生一个数据集和相应的标签
n_samples:表示数据样本点个数,默认值100
n_features:表示数据的维度,默认值是2
centers:产生数据的中心点,默认值3
cluster_std:数据集的标准差,浮点数或者浮点数序列,默认值1.0
center_box:中心确定之后的数据边界,默认值(-10.0, 10.0)
shuffle :洗乱,默认值是True
random_state:官网解释是随机生成器的种子
更多参数即使请参考:http://scikit-learn.org/dev/modules/generated/sklearn.datasets.make_blobs.html#sklearn.datasets.make_blobs
'''
n_samples = 1500
random_state = 170
X, y = make_blobs(n_samples=n_samples, random_state=random_state)


# Incorrect number of clusters
y_pred = KMeans(n_clusters=2, random_state=random_state).fit_predict(X)

plt.subplot(221)  #在2图里添加子图1
plt.scatter(X[:, 0], X[:, 1], c=y_pred) #scatter绘制散点
plt.title("Incorrect Number of Blobs")   #加标题

# Anisotropicly distributed data
transformation = [[ 0.60834549, -0.63667341], [-0.40887718, 0.85253229]]
X_aniso = np.dot(X, transformation)    #返回的是乘积的形式
y_pred = KMeans(n_clusters=3, random_state=random_state).fit_predict(X_aniso)

plt.subplot(222)#在2图里添加子图2
plt.scatter(X_aniso[:, 0], X_aniso[:, 1], c=y_pred)
plt.title("Anisotropicly Distributed Blobs")

# Different variance
X_varied, y_varied = make_blobs(n_samples=n_samples,
                                cluster_std=[1.0, 2.5, 0.5],
                                random_state=random_state)
y_pred = KMeans(n_clusters=3, random_state=random_state).fit_predict(X_varied)

plt.subplot(223)#在2图里添加子图3
plt.scatter(X_varied[:, 0], X_varied[:, 1], c=y_pred)
plt.title("Unequal Variance")

# Unevenly sized blobs
X_filtered = np.vstack((X[y == 0][:500], X[y == 1][:100], X[y == 2][:10]))
y_pred = KMeans(n_clusters=3, random_state=random_state).fit_predict(X_filtered)

plt.subplot(224)#在2图里添加子图4
plt.scatter(X_filtered[:, 0], X_filtered[:, 1], c=y_pred)
plt.title("Unevenly Sized Blobs")

plt.show() #显示图</span>

结果图示:


二:Mini Batch K-Means算法

scikit-learn官网上对于Mini Batch K-Means算法的说明如下:

Mini Batch K-Means算法是K-Means算法的变种,采用小批量的数据子集减小计算时间,同时仍试图优化目标函数,这里所谓的小批量是指每次训练算法时所随机抽取的数据子集,采用这些随机产生的子集进行训练算法,大大减小了计算时间,与其他算法相比,减少了k-均值的收敛时间,小批量k-均值产生的结果,一般只略差于标准算法。

该算法的迭代步骤有两步:

1:从数据集中随机抽取一些数据形成小批量,把他们分配给最近的质心

2:更新质心

与K均值算法相比,数据的更新是在每一个小的样本集上。对于每一个小批量,通过计算平均值得到更新质心,并把小批量里的数据分配给该质心,随着迭代次数的增加,这些质心的变化是逐渐减小的,直到质心稳定或者达到指定的迭代次数,停止计算

Mini Batch K-Means比K-Means有更快的 收敛速度,但同时也降低了聚类的效果,但是在实际项目中却表现得不明显

这是一张k-means和mini batch k-means的实际效果对比图


下边给出显示上边这副图的代码,也是对K-Means和Mini Batch K-Means算法的一个比较:

<span style="font-size:18px;">#coding:utf8
'''
Created on 2016/4/26

@author: Gamer Think
'''
import time

import numpy as np
import matplotlib.pyplot as plt

from sklearn.cluster import MiniBatchKMeans, KMeans
from sklearn.metrics.pairwise import pairwise_distances_argmin
from sklearn.datasets.samples_generator import make_blobs

##############################################################################
# Generate sample data
np.random.seed(0)

batch_size = 45
centers = [[1, 1], [-1, -1], [1, -1]] #初始化三个中心
n_clusters = len(centers)       #聚类的数目为3
#产生3000组两维的数据,以上边三个点为中心,以(-10,10)为边界,数据集的标准差是0.7
X, labels_true = make_blobs(n_samples=3000, centers=centers, cluster_std=0.7)

##############################################################################
# Compute clustering with Means

k_means = KMeans(init='k-means++', n_clusters=3, n_init=10)
t0 = time.time() #当前时间
k_means.fit(X)
#使用K-Means 对 3000数据集训练算法的时间消耗
t_batch = time.time() - t0

##############################################################################
# Compute clustering with MiniBatchKMeans

mbk = MiniBatchKMeans(init='k-means++', n_clusters=3, batch_size=batch_size,
                      n_init=10, max_no_improvement=10, verbose=0)
t0 = time.time()
mbk.fit(X)
#使用MiniBatchKMeans 对 3000数据集训练算法的时间消耗
t_mini_batch = time.time() - t0

##############################################################################
# Plot result

#创建一个绘图对象, 并设置对象的宽度和高度, 如果不创建直接调用plot, Matplotlib会直接创建一个绘图对象
'''
当绘图对象中有多个轴的时候,可以通过工具栏中的Configure Subplots按钮,
交互式地调节轴之间的间距和轴与边框之间的距离。
如果希望在程序中调节的话,可以调用subplots_adjust函数,
它有left, right, bottom, top, wspace, hspace等几个关键字参数,
这些参数的值都是0到1之间的小数,它们是以绘图区域的宽高为1进行正规化之后的坐标或者长度。
'''
fig = plt.figure(figsize=(8, 3))
fig.subplots_adjust(left=0.02, right=0.98, bottom=0.05, top=0.9)
colors = ['#4EACC5', '#FF9C34', '#4E9A06']

# We want to have the same colors for the same cluster from the
# MiniBatchKMeans and the KMeans algorithm. Let's pair the cluster centers per
# closest one.
k_means_cluster_centers = np.sort(k_means.cluster_centers_, axis=0)
mbk_means_cluster_centers = np.sort(mbk.cluster_centers_, axis=0)
k_means_labels = pairwise_distances_argmin(X, k_means_cluster_centers)
mbk_means_labels = pairwise_distances_argmin(X, mbk_means_cluster_centers)
order = pairwise_distances_argmin(k_means_cluster_centers,
                                  mbk_means_cluster_centers)

# KMeans
ax = fig.add_subplot(1, 3, 1) #add_subplot  图像分给为 一行三列,第一块
for k, col in zip(range(n_clusters), colors):
    my_members = k_means_labels == k
    cluster_center = k_means_cluster_centers[k]
    ax.plot(X[my_members, 0], X[my_members, 1], 'w',
            markerfacecolor=col, marker='.')
    ax.plot(cluster_center[0], cluster_center[1], 'o', markerfacecolor=col,
            markeredgecolor='k', markersize=6)
ax.set_title('KMeans')
ax.set_xticks(())
ax.set_yticks(())
plt.text(-3.5, 1.8,  'train time: %.2fs\ninertia: %f' % (
    t_batch, k_means.inertia_))

# MiniBatchKMeans
ax = fig.add_subplot(1, 3, 2)#add_subplot  图像分给为 一行三列,第二块
for k, col in zip(range(n_clusters), colors):
    my_members = mbk_means_labels == order[k]
    cluster_center = mbk_means_cluster_centers[order[k]]
    ax.plot(X[my_members, 0], X[my_members, 1], 'w',
            markerfacecolor=col, marker='.')
    ax.plot(cluster_center[0], cluster_center[1], 'o', markerfacecolor=col,
            markeredgecolor='k', markersize=6)
ax.set_title('MiniBatchKMeans')
ax.set_xticks(())
ax.set_yticks(())
plt.text(-3.5, 1.8, 'train time: %.2fs\ninertia: %f' %
         (t_mini_batch, mbk.inertia_))

# Initialise the different array to all False
different = (mbk_means_labels == 4)
ax = fig.add_subplot(1, 3, 3)#add_subplot  图像分给为 一行三列,第三块

for k in range(n_clusters):
    different += ((k_means_labels == k) != (mbk_means_labels == order[k]))

identic = np.logical_not(different)
ax.plot(X[identic, 0], X[identic, 1], 'w',
        markerfacecolor='#bbbbbb', marker='.')
ax.plot(X[different, 0], X[different, 1], 'w',
        markerfacecolor='m', marker='.')
ax.set_title('Difference')
ax.set_xticks(())
ax.set_yticks(())

plt.show()</span>



更多内容请参考官方网址:http://scikit-learn.org/dev/modules/clustering.html#clustering

3
0
查看评论

k-means+python︱scikit-learn中的KMeans聚类实现( + MiniBatchKMeans)

之前一直用R,现在开始学python之后就来尝试用Python来实现Kmeans。 之前用R来实现kmeans的博客:笔记︱多种常见聚类模型以及分群质量评估(聚类注意事项、使用技巧) 聚类分析在客户细分中极为重要。有三类比较常见的聚类模型,K-mean聚类、层次(系统)聚类、最大期望EM算...
  • sinat_26917383
  • sinat_26917383
  • 2017-04-19 15:07
  • 20346

scikit-learn学习之K-means聚类算法与 Mini Batch K-Means算法 [转自别的作者,还有其他sklearn翻译]

http://blog.csdn.net/gamer_gyt/article/details/51244850 ====================================================================== 本系列博客主要参考 S...
  • sherri_du
  • sherri_du
  • 2016-08-06 09:36
  • 1540

sklearn K-means MiniBatch-K-Means

K-means: K-means的注意事项,对于不同量纲(扁平数据)及(类别)非凸数据不适用,应当做PCA 预处理。 通过对协方差阵的估计可以看到,make_blobs是用单位协方差阵生成的。 cluster_std为每个cluster的标准差。 下面Anisotropicly Distribu...
  • sinat_30665603
  • sinat_30665603
  • 2016-08-13 21:30
  • 1012

聚类算法总结

最近要在spark上做一个聚类的项目,数据规模和类的数目都比较大。因此总结了一下常见的聚类算法。最终选择mini-batch kmeans,并使用kmeans++来初始化类中心。这样算法的执行速度比较快,而且效果相对靠谱。
  • lzt1983
  • lzt1983
  • 2014-09-12 22:27
  • 8913

深入理解K-Means聚类算法

概述什么是聚类分析聚类分析是在数据中发现数据对象之间的关系,将数据进行分组,组内的相似性越大,组间的差别越大,则聚类效果越好。不同的簇类型聚类旨在发现有用的对象簇,在现实中我们用到很多的簇的类型,使用不同的簇类型划分数据的结果是不同的,如下的几种簇类型。明显分离的可以看到(a)中不同组中任意两点之间...
  • taoyanqi8932
  • taoyanqi8932
  • 2016-12-18 20:50
  • 13721

机器学习之聚类算法k-means

一、目的意义 内容包括: (1)问题描述:k-means聚类算法的研究,此算法主要对二维数据点进行聚类。 二、算法阐述(占20%) ---输入:期望得到的簇的数目k,n个对象的二维数据D。 ---输出:k个簇的集合。   算法步骤: (1)输入k及n个二维数据对象   ...
  • wangyuanshun
  • wangyuanshun
  • 2017-06-03 20:35
  • 681

基本Kmeans算法介绍及其实现

1.基本Kmeans算法[1] 选择K个点作为初始质心 repeat 将每个点指派到最近的质心,形成K个簇 重新计算每个簇的质心 until 簇不发生变化或达到最大迭代次数时间复杂度:O(tKmn),其中,t为迭代次数,K为簇的数目,m为记录数,n为维数 空间复杂度:O((m+K)n),其中...
  • qll125596718
  • qll125596718
  • 2012-11-30 06:26
  • 189348

K-means Algorithm 聚类算法

在监督学习中,有标签信息协助机器学习同类样本之间存在的共性,在预测时只需判定给定样本与哪个类别的训练样本最相似即可。在非监督学习中,不再有标签信息的指导,遇到一维或二维数据的划分问题,人用肉眼就很容易完成,可机器就傻眼了,图(1)描述得很形象。 但处理高维度的数据,人脑也无能为力了,最...
  • GarfieldEr007
  • GarfieldEr007
  • 2016-05-22 17:52
  • 4583

K均值聚类算法(K-Means)

K均值聚类算法(K-Means)标签: Python 机器学习1.K均值算法简介K均值聚类算法首先是聚类算法。 聚类是一种无监督的学习,将相似的对象归到同一个簇中。聚类与分类的最大不同在于分类的目标事先已知,而聚类则不知道。 K均值聚类算法是发现给定数据集k个簇的算法。如下图所示,如果设定的聚类...
  • xuelabizp
  • xuelabizp
  • 2016-07-10 17:37
  • 14796

K-means聚类算法

额…想了很久不知道写什么好。最后还是觉得写K-means聚类算法好了。K-means聚类算法,也就是K均值算法,是基于原型的聚类(prototype-based clustering)中一种非常古老的,广泛使用的聚类算法。粗略来说,K-means算法的大概流程如下:Created with Raph...
  • rex_huang61
  • rex_huang61
  • 2016-04-03 20:24
  • 3025
    微信公众号【数据与算法联盟】

    扫码关注公众号,不定期推送实战文章!

    扫码加我微信,拉你进数据算法大佬群!
    个人资料
    • 访问:1066107次
    • 积分:11758
    • 等级:
    • 排名:第1530名
    • 原创:227篇
    • 转载:22篇
    • 译文:2篇
    • 评论:343条
    个人简介
    姓名:Thinkgamer

    Github:https://github.com/thinkgamer

    主攻:云计算/python/数据分析

    程度:熟悉/熟悉/熟悉

    微信:gyt13342445911

    Email:thinkgamer@163.com

    工作状态:在职ing

    心灵鸡汤:只要努力,你就是下一个大牛...

    hadoop/spark/机器学习群:279807394(大神建的群,蹭个管理员)

    欢迎骚扰........
    博客专栏
    最新评论