版权声明:<—— 本文为作者呕心沥血打造,若要转载,请注明出处@http://blog.csdn.net/gamer_gyt <——
======================================================================
本系列博客主要参考 Scikit-Learn 官方网站上的每一个算法进行,并进行部分翻译,如有错误,请大家指正
转载请注明出处
======================================================================
K-means算法分析与Python代码实现请参考之前的两篇博客:
接下来我主要演示怎么使用Scikit-Learn完成K-means算法的调用
注明:本例分析是固定输入K值和输入k个初始中心点,这样做具有很大的局限性,容易陷入局部最优,可以利用其他算法(如canopy算法)进行粗聚类估计,产生n个簇,作为k-means的K值,这里不做详细说明
一:K-means聚类算法
1:K-means算法简介
聚类算法,数据挖掘十大算法之一,算法需要接受参数k和k个初始聚类中心,即将数据集进行聚类的数目和k个簇的初始聚类“中心”,结果是同一类簇中的对象相似度极高,不同类簇中的数据相似度极低
2:K-means算法思想和描述
思想: 以空间中k个中心点进行聚类,对最靠近他们的对象归类,通过迭代的方法,逐次更新各聚类中心
描述:
3:集合实例的简单介绍
4:下边看一个使用sklearn.Kmeans的实例(实例来源)
- <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
转载: scikit-learn学习之K-means聚类算法与 Mini Batch K-Means算法的更多相关文章
-
机器学习-scikit learn学习笔记
scikit-learn官网:http://scikit-learn.org/stable/ 通常情况下,一个学习问题会包含一组学习样本数据,计算机通过对样本数据的学习,尝试对未知数据进行预测. 学习 ...
-
【转载】 深度学习总结:用pytorch做dropout和Batch Normalization时需要注意的地方,用tensorflow做dropout和BN时需要注意的地方,
原文地址: https://blog.csdn.net/weixin_40759186/article/details/87547795 ------------------------------- ...
-
探索sklearn | K均值聚类
1 K均值聚类 K均值聚类是一种非监督机器学习算法,只需要输入样本的特征 ,而无需标记. K均值聚类首先需要随机初始化K个聚类中心,然后遍历每一个样本,将样本归类到最近的一个聚类中,一个聚类中样本特征 ...
-
K均值聚类的失效性分析
K均值聚类是一种应用广泛的聚类技术,特别是它不依赖于任何对数据所做的假设,比如说,给定一个数据集合及对应的类数目,就可以运用K均值方法,通过最小化均方误差,来进行聚类分析. 因此,K均值实际上是一个最 ...
-
100天搞定机器学习|day44 k均值聚类数学推导与python实现
[如何正确使用「K均值聚类」? 1.k均值聚类模型 给定样本,每个样本都是m为特征向量,模型目标是将n个样本分到k个不停的类或簇中,每个样本到其所属类的中心的距离最小,每个样本只能属于一个类.用C表示 ...
-
转载: scikit-learn学习之K最近邻算法(KNN)
版权声明:<—— 本文为作者呕心沥血打造,若要转载,请注明出处@http://blog.csdn.net/gamer_gyt <—— 目录(?)[+] ================== ...
-
Scikit Learn: 在python中机器学习
转自:http://my.oschina.net/u/175377/blog/84420#OSC_h2_23 Scikit Learn: 在python中机器学习 Warning 警告:有些没能理解的 ...
-
【转】算法杂货铺——k均值聚类(K-means)
k均值聚类(K-means) 4.1.摘要 在前面的文章中,介绍了三种常见的分类算法.分类作为一种监督学习方法,要求必须事先明确知道各个类别的信息,并且断言所有待分类项都有一个类别与之对应.但是很多时 ...
-
机器学习理论与实战(十)K均值聚类和二分K均值聚类
接下来就要说下无监督机器学习方法,所谓无监督机器学习前面也说过,就是没有标签的情况,对样本数据进行聚类分析.关联性分析等.主要包括K均值聚类(K-means clustering)和关联分析,这两大类 ...
随机推荐
-
Qt中的事件
1. 引自---http://blog.sina.com.cn/s/blog_6e80f1390100pro4.html 信号和事件的区别就在与,事件比信号更加底层,而且如果一个信号对应多个槽的话,信 ...
-
[topcoder]IncrementAndDoubling
http://community.topcoder.com/stat?c=problem_statement&pm=12790&rd=15708 这道题只有两个操作,一是加一,二是数组 ...
-
网络编程---(数据请求+slider)将网络上的大文件下载到本地,并打印其进度
网络编程---将网络上的大文件下载到本地,并打印其进度. 点击"開始传输"button.将网络上的大文件先下载下来,下载完毕后,保存到本地. UI效果图例如以下: watermar ...
-
纯CSS 贴底部的布局(兼容各个浏览器包括IE6)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xht ...
-
【Hdu3555】 Bomb(数位DP)
Description 题意就是找0到N有多少个数中含有49. \(1\leq N \leq2^{63}-1\) Solution 数位DP,与hdu3652类似 \(F[i][state]\)表示位 ...
-
STM32F0使用LL库实现SHT70通讯
在本次项目中,限于空间要求我们选用了STM32F030F4作为控制芯片.这款MCU不但封装紧凑,而且自带的Flash空间也非常有限,所以我们选择了LL库实现.本篇我们将基于LL库采用模拟I2C接口的方 ...
-
如何用ESP8266实现网页配置(web)
准备工作 准备一个深圳四博智联科技有限公司的ESP-F 模组.或者四博智联科技的NODEMCU 当我们拿到ESP-F模块后,可以按照以下接线进行测试: 即 VCC.EN 接 3.3v.GPIO15 G ...
-
Gradle 中 buildConfigField的巧妙应用
当用AndroidStudio来进行Android项目开发时,build.gradle就是这个工具的核心部分,所有的依赖,debug/release设置,混淆等都在这里进行配置. 下面就主要来记录下利 ...
-
Spring Boot 揭秘与实战(二) 数据缓存篇 - EhCache
文章目录 1. EhCache 集成 2. 源代码 本文,讲解 Spring Boot 如何集成 EhCache,实现缓存. 在阅读「Spring Boot 揭秘与实战(二) 数据缓存篇 - 快速入门 ...
-
查看Ubuntu的版本和系统版本
命令行语句:lsb_release -a 命令行语句:uname -a