如有侵权,联系作者,马上删除
一.前情提要
1.本文以代码为主,笔记是注释
2.理论建议阅读
【10分钟算法】K均值聚类算法-带例子/K-Means Clustering Algorithm_哔哩哔哩_bilibili
3.本文是快速上手,所以文章可能略显仓促,后面会有补正详细笔记
二.代码①(粗略笔记)
①理解:
#先随机取所有点中的某两个点,将其定义为簇心,再计算每个点到簇心的距离,将距离近的点归为一类,
#将两类的点x,y值求平均值,得新的簇心,再计算每个点到簇心的新距离,将距离近的点归为一类,
#关联点没有变化,所以之后的结果不会改变,停止计算.
#②基本步骤:
#先输入K值:用于分成几类
#一般使用欧氏距离计算(类似于数学上求两点的距离的公式)
#一引入numpy数据库
import numpy as np
#二随机选择k个初始聚类中心
def kmeans(data, k, max_iters=100):
# data:表示输入的数据点集合,应该是一个二维数组或矩阵,每一行代表一个数据点,每一列代表一个特征。
# k:表示要划分的聚类数量。
# max_iters:表示最大迭代次数,默认为100。
# 作用是从给定的数据集 data 中随机选择 k 个不重复的数据点作为初始聚类中心
centers = data[np.random.choice(range(len(data)), size=k, replace=False)]
#np.random.choice():从给定的序列中进行随机选择
#range(len(data)):要选择的序列,即数据点的索引序列
#size=k:选择的数量,即选择 k 个数据点作为聚类中心
#replace=False:不允许重复选择,确保每个聚类中心都是唯一的。也就是说,当一个数据点被选为聚类中心后,它不会再次被选中
#分配数据点到最近的聚类中心
for _ in range(max_iters):
#创建一个空列表 clusters,用于存储每个聚类包含的数据点。列表的长度为聚类数量 k,每个元素都是一个空列表,表示一个聚类。
clusters = [[] for _ in range(k)]
#对于数据集中的每个数据点 point,计算它与所有聚类中心之间的欧氏距离
for point in data:
distances = np.linalg.norm(centers - point, axis=1)
cluster_id = np.argmin(distances)
clusters[cluster_id].append(point)
#np.linalg.norm() 函数用于计算欧氏距离
#centers - point 是在计算每个数据点与所有聚类中心之间的距离
#axis=1在进行向量减法时沿着第二个轴(即列)进行计算
# (注:通常情况下,聚类算法中的距离计算是基于特征维度的,因此使用 axis=1 是更常见和合理的选择)
#np.argmin() 函数找到距离最短的聚类中心的索引 cluster_id,即将当前数据点分配到的聚类
#clusters[cluster_id].append(point)将当前数据点 point 添加到对应的聚类中心
#三更新聚类中心
new_centers = []
for i in range(k):
new_center = np.mean(clusters[i], axis=0)
new_centers.append(new_center)
#np.mean函数被用来计算每个聚类中心所包含的所有数据点的平均值
#clusters是一个长度为k的列表,其中的每个元素是一个数组,表示当前属于第i个聚类的所有数据点
#axis=0表示在每列上计算平均值
#new_centers.append(new_center),最后,将新的聚类中心添加到新的聚类中心列表中
# 判断是否收敛
if np.allclose(centers, new_centers):
break
#np.allclose() 函数被用来比较当前的聚类中心 centers 和新计算得到的聚类中心 new_centers 是否非常接近(即是否收敛)
#如果当前聚类中心和新的聚类中心非常接近,则表示聚类已经收敛,不再发生变化,因此可以退出迭代
centers = new_centers
#最后,函数返回最终的聚类中心 centers 和聚类结果 clusters
return centers, clusters
# 示例用法
data = np.array([[1, 2], [1.5, 1.8], [5, 8], [8, 8], [1, 0.6], [9, 11]])
k = 2
centers, clusters = kmeans(data, k)
print("聚类中心:")
for center in centers:
print(center)
print("\n聚类结果:")
for i, cluster in enumerate(clusters):
print(f"Cluster {i}:")
for point in cluster:
print(point)
print()
②(顺序详细笔记)
import numpy as np
def kmeans(data, k, max_iters=100):
centers = data[np.random.choice(range(len(data)), size=k, replace=False)]
for _ in range(max_iters):
clusters = [[] for _ in range(k)]
for point in data:
distances = np.linalg.norm(centers - point, axis=1)
cluster_id = np.argmin(distances)
clusters[cluster_id].append(point)
new_centers = []
for i in range(k):
new_center = np.mean(clusters[i], axis=0)
new_centers.append(new_center)
if np.allclose(centers, new_centers):
break
centers = new_centers
return centers, clusters
data = np.array([[1, 2], [1.5, 1.8], [5, 8], [8, 8], [1, 0.6], [9, 11]])
k = 2
centers, clusters = kmeans(data, k)
print("聚类中心:")
for center in centers:
print(center)
print("\n聚类结果:")
for i, cluster in enumerate(clusters):
print(f"Cluster {i}:")
for point in cluster:
print(point)
print()
-
import numpy as np
: 导入NumPy库并使用别名np。 -
def kmeans(data, k, max_iters=100):
:定义一个名为kmeans的函数,接受三个参数:data(数据集)、k(簇的数量)、max_iters(最大迭代次数,默认为100)。 -
centers = data[np.random.choice(range(len(data)), size=k, replace=False)]
:随机选择k个数据点作为初始聚类中心。 -
for _ in range(max_iters):
:开始进行最大迭代次数内的循环。 -
clusters = [[] for _ in range(k)]
: 创建一个列表,用于存储每个簇的数据点。 -
for point in data:
:遍历数据集中的每个数据点。 -
distances = np.linalg.norm(centers - point, axis=1)
: 计算当前数据点与各个聚类中心的距离。 -
cluster_id = np.argmin(distances)
: 找到距离当前数据点最近的聚类中心的索引,确定该数据点所属的簇。 -
clusters[cluster_id].append(point)
: 将当前数据点添加到对应的簇中。 -
new_centers = []
: 创建一个空列表,用于存储新的聚类中心。 -
for i in range(k):
:遍历每个簇。 -
new_center = np.mean(clusters[i], axis=0)
: 计算每个簇中数据点的平均值,作为新的聚类中心。 -
new_centers.append(new_center)
: 将新的聚类中心添加到列表中。 -
if np.allclose(centers, new_centers):
:检查新的聚类中心是否与上一轮相同,如果相同则结束迭代。 -
centers = new_centers
: 更新聚类中心。 -
return centers, clusters
: 返回最终的聚类中心和簇的结果。 -
data = np.array([[1, 2], [1.5, 1.8], [5, 8], [8, 8], [1, 0.6], [9, 11]])
: 给定的数据集。 -
k = 2
: 指定要分成的簇的数量。 -
centers, clusters = kmeans(data, k)
: 调用kmeans函数进行K均值聚类。 -
打印输出聚类中心和聚类结果。