小杰机器学习(eight)——K均值聚类
1. K均值聚类理论讲解

K均值聚类是一种常用的无监督学习算法,用于将数据集划分为K个不同的类别。其步骤如下:
- 随机选择原始数据的K个数据点作为初始质心(聚类中心)。
- 将每个数据点划分到距离最近的质心所对应的簇中,即计算每个数据点到每个质心的距离,选择距离最近的质心作为该数据点所属的簇。
- 重新计算每个簇的质心,即将该簇中所有数据点的坐标取平均值,得到新的质心。
- 重复第2步和第3步,直到簇内的数据点相似度达到一定程度,或者达到预设的最大迭代次数。
在K均值聚类算法中,相似度的计算通常采用欧氏距离或曼哈顿距离等距离度量方法。
同时,K均值聚类算法还有一些限制条件,例如质心的数量K需要事先确定,且算法对初始质心的选择比较敏感,不同的初始质心可能会导致不同的结果。
K均值聚类的目标是最小化簇内数据点与其所属聚类中心点的距离之和(即簇内误差平方和)。该算法通过迭代的方式不断优化聚类中心点的位置,使得簇内的数据点更加紧密地聚集在一起,而不同簇之间的距离更大。
1.2 数据输入
本实验中提供了一些散点分布如下图所示:

蓝色点的坐标分别为:[1.9, 1.2],[1.5, 2.1],[1.9, 0.5],[1.5, 0.9],[0.9, 1.2],[1.1, 1.7],[1.4, 1.1]。
红色点的坐标分别为:[-1.9, 1.2],[-1.5, 2.1],[-1.9, 0.5],[-1.5, 0.9],[-0.9, 1.2],[-1.1, 1.7],[-1.4, 1.1]。
绿色点的坐标分别为:[1.9, -1.2],[1.5, -2.1],[1.9, -0.5],[1.5, -0.9],[0.9, -1.2],[1.1, -1.7],[1.4, -1.1]。
黄色点的坐标分别为:[-1.9, -1.2],[-1.5, -2.1],[-1.9, -0.5],[-1.5, -0.9],[-0.9, -1.2],[-1.1, -1.7],[-1.4, -1.1]。
1.3 设置聚类数目
根据K均值聚类算法的实现步骤,第一步需要随机选择K个数据点作为初始质心(聚类中心)。在“设置聚类数目”组件中可以设置K的值。

在开始时,随机选择k个数据点作为初始的聚类中心,或者从数据集中随机生成k个点作为初始中心。
1.4 开始迭代
该过程需要不断的计算聚类中心与各个点的距离,然后不断更新聚类中心,因此需要进行迭代。这里通过“开始迭代”组件设置迭代次数,与之前实验不同的是,本实验的迭代次数很小。

1.6 数据点与聚类中心距离
使用L2距离,即欧氏距离进行距离判别。
对于每个数据点,计算其与每个聚类中心的距离。将每个数据点分配给与其距离最近的聚类中心,形成k个簇(聚类),每个簇包含被分配到该聚类中心的数据点。
欧式距离和曼哈顿距离
欧氏距离是表征两点之间的直线距离,其在二维空间的计算公式为:

曼哈顿距离表示的是两点之间连线对各个坐标轴投影的长度总和,其示意图如下:

其中,红线、蓝线、黄线都是曼哈顿距离,绿线是欧氏距离。
曼哈顿距离计算公式为:
![]()
1.7 更新聚类中心
对于每个簇,计算该簇内所有数据点在每个维度上的均值,得到新的聚类中心。新的聚类中心是该簇内所有数据点的平均位置,用于代表该簇的中心。
1.8 绘制聚类结果
一直更新聚类中心,把更新过程中聚类中心的点以及离它最近的点的连线绘制到图像上。

代码实现
from sklearn.cluster import KMeans
import numpy as np
import matplotlib.pyplot as plt
# 1.创建示例数据
class1_points = np.array([[1.9, 1.2],
[1.5, 2.1],
[1.9, 0.5],
[1.5, 0.9],
[0.9, 1.2],
[1.1, 1.7],
[1.4, 1.1]])
class2_points = np.array([[-1.9, 1.2],
[-1.5, 2.1],
[-1.9, 0.5],
[-1.5, 0.9],
[-0.9, 1.2],
[-1.1, 1.7],
[-1.4, 1.1]])
class3_points = np.array([[1.9, -1.2],
[1.5, -2.1],
[1.9, -0.5],
[1.5, -0.9],
[0.9, -1.2],
[1.1, -1.7],
[1.4, -1.1]])
class4_points = np.array([[-1.9, -1.2],
[-1.5, -2.1],
[-1.9, -0.5],
[-1.5, -0.9],
[-0.9, -1.2],
[-1.1, -1.7],
[-1.4, -1.1]])
# 合并四类数据点
data = np.concatenate((class1_points, class2_points, class3_points, class4_points),axis=0)
# 2.设置聚类簇数
k=3
#3.模型构建
km=KMeans(n_clusters=k,max_iter=30)
#4.模型训练
km.fit(data)#把数据传入
#获取簇心
centeroids=km.cluster_centers_
y_kmean=km.predict(data)
print(y_kmean)
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 6))
#展示一下原始数据未聚类的内容
ax1.scatter(data[:,0],data[:,1],s=50)
# ax1.yticks(())
ax1.plot()
#显示一下归类后的效果
for i in range(k):
cluster_points = data[y_kmean == i]
centroid = centeroids[i]
for cluster_point in cluster_points:
ax2.plot([cluster_point[0], centroid[0]], [cluster_point[1], centroid[1]], 'k--')
ax2.scatter(data[:, 0], data[:, 1], c=y_kmean, s=50)
#展示一下簇心
ax2.scatter(centeroids[:,0],centeroids[:,1],c='black',s=100,alpha=0.5)
# ax2.yticks(())
plt.show()更多推荐


所有评论(0)