Press "Enter" to skip to content

机器学习库sklearn的K-Means聚类算法的使用方法

本站内容均来自兴趣收集,如不慎侵害的您的相关权益,请留言告知,我们将尽快删除.谢谢.

1,本Notebook背景介绍

 

之前我们已经发布过一篇有关K-means算法实验的Notebook:《 Jupyter Notebook使用Python做K-Means聚类分析 》,在那篇Notebook里,我们从K-Means的基础原理和实现方法开始讨论,实际上K-Means作为一个常用的算法,在众多机器学习程序库中都有现成的函数可以调用。今天这篇notebook主要演示怎样调用sklearn的K-Means函数。

 

我们先简单回顾一下上一篇notebook的内容,罗列如下:

 

1.什幺是K-means聚类算法

 

2.K-means聚类算法应用场景

 

3.K-means聚类算法步骤

 

4.K-means不适合的数据集

 

5.准备测试数据

 

6.基于python原生代码做K-Means聚类分析实验

 

7.使用matplotlib进行可视化输出

 

面对这幺多内容,有同学反馈给我说,他只想使用K-Means做一些社会科学计算,不想费脑筋搞明白K-Means是怎幺实现的。

 

好吧,调用机器学习库中的函数是最合适的,只要按照要求准备好样本数据,调用一个函数就把问题解决了。那幺,我们今天就另发布一个使用机器学习库sklearn的k-means聚类算法的Notebook。

 

1.1 sklearn库简介

 

转载知乎文章《 sklearn库主要模块功能简介 》的介绍如下:

 

sklearn,全称scikit-learn,是python中的机器学习库,建立在numpy、scipy、matplotlib等数据科学包的基础之上,涵盖了机器学习中的样例数据、数据预处理、模型验证、特征选择、分类、回归、聚类、降维等几乎所有环节,功能十分强大,目前sklearn版本是0.23。与深度学习库存在pytorch、TensorFlow等多种框架可选不同,sklearn是python中传统机器学习的首选库,不存在其他竞争者。

1.2 基本原理

 

K-means是无监督学习的代表。主要目的是聚类,聚类的依据就是样本之间的距离。比如要分为K类。步骤是:

 

1. 随机选取K个点。

 

2. 计算每个点到K个质心的距离,分成K个簇。

 

3. 计算K个簇样本的平均值作新的质心

 

4. 循环2、3

 

5. 位置不变,距离完成

 

2, 第三方库

 

本notebook使用了sklearn库做k-means算法实验。

 

如果未安装,请先使用下面的命令安装sklearnm库,再运行实验本notebook:

 

pip install -i https:// pypi.tuna.tsinghua.edu.cn /simple sklearn #国内安装使用清华的源,速度快

3,本notebook所做的测试

 

基于测试数据和sklearn官网的例子,在Jupyter Notebook中使用Python做K-Means算法实验。

 

4,引入sklearn库

 

导入sklearn下的K-means模块。sklearn,全称scikit-learn,是python中的机器学习库,建立在numpy、scipy、matplotlib等数据科学包的基础之上,涵盖了机器学习中的样例数据、数据预处理、模型验证、特征选择、分类、回归、聚类、降维等几乎所有环节,功能十分强大,目前sklearn版本是0.23。

 

# coding:utf-8    
from sklearn.cluster import KMeans

 

5,引入matplotlib库

 

matplotlib是一款命令式、较底层、可定制性强、图表资源丰富、简单易用、出版质量级别的python 2D绘图库。

 

matplotlib算是python绘图的元老级库,类似编程语言里的C语言。很多其它的python绘图库是基于matplotlib开发的,比如seaborn、ggplot、plotnine、holoviews、basemap等。

 

matplotlib可用于python脚本、python shell、jupyter notebook、web等。

 

最适合来运行matplotlib绘图的工具是jupyter notebook,本Notebook也是基于该工具做可视化实验:交互式操作,在浏览器上运行代码,能直接显示运行结果和图表,

 

import matplotlib.pyplot as plt

 

6,生成模拟数据

 

参看官网网页Generated Datasets,sklearn提供了一些方法,可以生成测试用数据集,生成过程中可以控制多个参数,便于验证算法。参看《 sklearn中的make_blobs()函数详解 》。

 

下面我们生成一个测试用数据集,含有500个样本,每个样本2个特征。那幺函数返回的结果数据有:

 

X:是一个数组,存储生成的样本,格式是[n_samples, n_features],详见下面的测试用数据集的查看结果

 

y:是一个数组,里面是整数,表示每个样本所属的类别,格式是[n_samples]

 

下面我们生成一个含有2个特征的样本数据,两个特征便于在平面上显示出来,两个特征对应画图坐标轴x和y

 

from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt
X, y = make_blobs(n_samples=500, # 500个样本
                 n_features=2, # 每个样本2个特征
                 centers=4, # 4个中心
                 random_state=1 #控制随机性
                 )

 

查看一下X和y两个数组的格式

 

X

 

输出结果:

 

array([[-6.92324165e+00, -1.06695320e+01],

 

[-8.63062033e+00, -7.13940564e+00],

 

[-9.63048069e+00, -2.72044935e+00],

 

…….

 

[-8.96014913e+00, -8.06349899e+00],

 

[-7.66603898e+00, -7.59715459e+00],

 

[-6.46534407e+00, -2.85544633e+00]])

 

y

 

输出结果:

 

array([2, 2, 1, 0, 3, 0, 3, 3, 1, 3, 2, 2, 3, 0, 3, 2, 1, 2, 0, 3, 1, 1,

 

3, 0, 3, 3, 0, 0, 1, 3, 2, 0, 3, 2, 3, 2, 1, 1, 2, 1, 3, 1, 0, 3,

 

3, 2, 1, 3, 0, 0, 0, 1, 1, 3, 2, 1, 1, 1, 1, 3, 0, 0, 1, 3, 0, 3,

 

……

 

1, 0, 0, 2, 1, 3, 0, 3, 3, 2, 2, 3, 2, 1, 1, 2, 1, 2, 1, 0, 2, 0,

 

1, 3, 0, 1, 3, 0, 2, 3, 0, 0, 1, 3, 1, 3, 2, 0, 2, 3, 0, 2, 2, 2,

 

1, 0, 3, 2, 3, 3, 1, 1, 2, 3, 3, 3, 3, 3, 3, 2, 3, 1, 2, 3, 0, 3,

 

0, 3, 1, 3, 0, 0, 0, 1, 3, 1, 2, 1, 0, 3, 2, 0, 2, 0, 2, 3, 0, 0,

 

2, 1, 3, 2, 1, 1, 1, 2, 3, 0, 1, 3, 2, 2, 2, 3])

 

7,使用matplotlib画图

 

对于上面已生成的模拟数据,使用matplotlib.pyplot画出图像

 

color = ['red', 'pink','orange','gray']
fig, axi1=plt.subplots(1)
for i in range(4):
    axi1.scatter(X[y==i, 0], X[y==i,1],
               marker='o',
               s=8,
               c=color[i]
               )
plt.show()

8,K-means聚类之一:k=3

 

使用sklearn的KMeans模块进行聚类分析,可以设置要聚几类。

 

此处k设置为3

 

from sklearn.cluster import KMeans
n_clusters=3
cluster = KMeans(n_clusters=n_clusters,random_state=0).fit(X)

 

9,查看聚类后的质心

 

k=3的情况下,会有3个质心

 

centroid=cluster.cluster_centers_
centroid

 

输出结果:

 

array([[-8.09286791, -3.50997357],

 

[-1.54234022, 4.43517599],

 

[-7.0877462 , -8.08923534]])

 

10,使用matplotlib画图

 

使用matplotlib.pyplot画出聚类后的图像

 

y_pred = cluster.labels_#获取训练后对象的每个样本的标签    
centtrod = cluster.cluster_centers_
color=['red','pink','orange','gray']
fig, axi1=plt.subplots(1)
for i in range(n_clusters):
    axi1.scatter(X[y_pred==i, 0], X[y_pred==i, 1],
               marker='o',
               s=8,
               c=color[i])
axi1.scatter(centroid[:,0],centroid[:,1],marker='x',s=100,c='black')

11,K-means聚类之一:k=4

 

使用sklearn的KMeans模块进行聚类分析

 

此处k设置为4

 

n_clusters=4
cluster2 = KMeans(n_clusters=n_clusters,random_state=0).fit(X)

 

12,查看聚类后的质心

 

k=4的情况下,会有4个质心

 

centroid=cluster2.cluster_centers_
centroid

 

输出结果:

 

array([[-10.00969056, -3.84944007],

 

[ -1.54234022, 4.43517599],

 

[ -6.08459039, -3.17305983],

 

[ -7.09306648, -8.10994454]])

 

13,使用matplotlib画图

 

使用matplotlib.pyplot画出聚类后的图像

 

y_pred = cluster2.labels_#获取训练后对象的每个样本的标签    
centtrod = cluster2.cluster_centers_
color=['red','pink','orange','gray']
fig, axi1=plt.subplots(1)
for i in range(n_clusters):
    axi1.scatter(X[y_pred==i, 0], X[y_pred==i, 1],
               marker='o',
               s=8,
               c=color[i])
axi1.scatter(centroid[:,0],centroid[:,1],marker='x',s=100,c='black')

14,总结

 

本文使用生成的样本数据集,如果是真实的样本数据,那幺设法存成上述格式的X数组,然后交给Kmeans模型的fit()函数计算即可。我们将在后续的notebook讲解怎样利用Kmeans模型针对真实数据做计算。

Be First to Comment

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注