一、目标
给定一段数值,请你将这段数组分成两个聚类并以两种颜色进行区分
data = [[1,2],[2,5],[3,4],[2,3],[4,5],[5,7],[10,13],[11,10],[12,11],[13,15],[14,13],[17,10]
实现结果:
二、项目概述
- 在实现这个简单的例子前我们需要知道sklearn是什么。
- 通过对这个例子的实现,让我们更好的学习和理解机器学习。
2.1 sklearn是什么
scikit-learn(简称sklearn)是Python的一个开源机器学习模块,它建立在Numpy和Scipy模块之上,能够为用户提供各种机器学习算法接口,包括分类、回归、聚类系列算法,主要算法有SVM,逻辑回归、朴素贝叶斯、Kmeans、DBSCAN等。
2.2本项目使用的算法:KMeans
sklearn提供了多种聚类函数供用户使用,KMeans是聚类中最为常用的算法之一,他属于基于距离划分的聚类方法。KMeans的基本用法如下:
from sklearn.cluster import KMeans
model = KMeans() #输入参数建立模型
model.fit(Data) #将数据集Data提供给模型进行聚类
三、项目实现
3.1 python上安装sklearn
在命令行输入:pip install sklearn
3.2 代码实现:
from sklearn.cluster import KMeans
import numpy as np
import matplotlib.pyplot as plt
#数据
dataSet = np.array([[1,2],[2,5],[3,4],[2,3],[4,5],[5,7],[10,13],[11,10],[12,11],[13,15],[14,13],[17,10]])
km = KMeans(n_clusters=2)
km.fit(dataSet)
plt.figure(facecolor = 'w')
plt.axis([0,16,0,16])
mark = ['or','ob']
for i in range(dataSet.shape[0]):
plt.plot(dataSet[i, 0],dataSet[i, 1], mark[km.labels_[i]])
plt.show()
3.3 11-12行代码解释:
for i in range(dataSet.shape[0]):
plt.plot(dataSet[i, 0],dataSet[i, 1], mark[km.labels_[i]])
-
dataSet:是一个12x2的数组,即它有12行(每行代表一个数据点)和2列(每列代表一个维度)
-
dataSet.shape[0]返回的是数组的第一个维度的大小,即数据点的数量(行数),在这个例子中是 12。 -
dataSet[i, 0]是用来访问 NumPy 数组中特定元素的方式。在这个具体的上下文中:
dataSet是一个 12x2 的 NumPy 数组,其中包含了 12 个二维数据点。i是当前的索引或位置,它在 for 循环中从 0 遍历到 11(因为有 12 个数据点)。[i, 0]是用来访问第i个数据点的第一个维度(通常是 x 坐标)。
因此,dataSet[i, 0] 表示的是第 i 个数据点的 x 坐标值。同样地,dataSet[i, 1] 表示的是第 i 个数据点的 y 坐标值。
mark[km.labels_[i]]用于选择用于绘图的标记类型,基于由 KMeans 算法分配的聚类标签。
让我们分解这个表达式:
mark是一个 Python 列表,它包含两种类型的标记:['or', 'ob']。这里的 'or' 表示红色圆圈,'ob' 表示蓝色圆圈。这些标记将在绘图时用来表示不同的聚类。km是一个 KMeans 实例,它已经被用来拟合(fit)数据集。km.labels_是一个数组,包含了每个数据点根据 KMeans 算法被分配的聚类标签。在这个例子中,因为指定了n_clusters=2(两个聚类),所以km.labels_中的元素将是 0 或 1。i是当前的索引,在遍历数据点时从 0 到dataSet.shape[0] - 1。
综上所述,km.labels_[i] 获取第 i 个数据点的聚类标签(0 或 1),然后 mark[km.labels_[i]] 使用这个标签来从 mark 列表中选择相应的标记(红色圆圈或蓝色圆圈)。