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

2021-10-28 10:17| 发布者: Fuller| 查看: 4306| 评论: 5

摘要: 之前我们已经发布过一篇有关K-means算法实验的Notebook:《Jupyter Notebook使用Python做K-Means聚类分析》,在那篇Notebook里,我们从K-Means的基础原理和实现方法开始讨论,实际上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进行可视化输出

看了上一篇Notebook后,有同学反馈给我说,他只想使用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模型针对真实数据做计算。

15,下载本notebook

下载源代码请进入:使用机器学习库sklearn的K-Means算法进行聚类


鲜花

握手

雷人

路过

鸡蛋
发表评论

最新评论

评论 gz51837844 2021-11-25 15:43
针对词聚类的notebook已经发布了:《在Jupyter Notebook中使用word2vec和k-means进行词聚类》,文章地址是:https://www.gooseeker.com/doc/article-719-1.html
15964002091: 这个能做吗
评论 gz51837844 2021-11-6 17:55
这个在做,还没有完成
15964002091: 这个能做吗
评论 15964002091 2021-11-6 17:06
这个能做吗
gz51837844: 要对文本做k-means聚类,一般步骤是:1.分词 2.生成矩阵,比如TF-IDF矩阵 3.做k-means聚类 下周我们会做测试,看看能不能出一个包含上述3个步骤的连贯notebook ...
评论 gz51837844 2021-10-31 12:49
要对文本做k-means聚类,一般步骤是:1.分词 2.生成矩阵,比如TF-IDF矩阵 3.做k-means聚类
下周我们会做测试,看看能不能出一个包含上述3个步骤的连贯notebook
15964002091: 这个能对关键词聚类吗
评论 15964002091 2021-10-31 11:20
这个能对关键词聚类吗

查看全部评论(5)

GMT+8, 2024-11-22 00:51