K均值聚类算法(K-Means Clustering Algorithm)代码学习

如有侵权,联系作者,马上删除

一.前情提要

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()
  1. import numpy as np: 导入NumPy库并使用别名np。
  2. def kmeans(data, k, max_iters=100)::定义一个名为kmeans的函数,接受三个参数:data(数据集)、k(簇的数量)、max_iters(最大迭代次数,默认为100)。
  3. centers = data[np.random.choice(range(len(data)), size=k, replace=False)]:随机选择k个数据点作为初始聚类中心。
  4. for _ in range(max_iters)::开始进行最大迭代次数内的循环。
  5. clusters = [[] for _ in range(k)]: 创建一个列表,用于存储每个簇的数据点。
  6. for point in data::遍历数据集中的每个数据点。
  7. distances = np.linalg.norm(centers - point, axis=1): 计算当前数据点与各个聚类中心的距离。
  8. cluster_id = np.argmin(distances): 找到距离当前数据点最近的聚类中心的索引,确定该数据点所属的簇。
  9. clusters[cluster_id].append(point): 将当前数据点添加到对应的簇中。
  10. new_centers = []: 创建一个空列表,用于存储新的聚类中心。
  11. for i in range(k)::遍历每个簇。
  12. new_center = np.mean(clusters[i], axis=0): 计算每个簇中数据点的平均值,作为新的聚类中心。
  13. new_centers.append(new_center): 将新的聚类中心添加到列表中。
  14. if np.allclose(centers, new_centers)::检查新的聚类中心是否与上一轮相同,如果相同则结束迭代。
  15. centers = new_centers: 更新聚类中心。
  16. return centers, clusters: 返回最终的聚类中心和簇的结果。
  17. data = np.array([[1, 2], [1.5, 1.8], [5, 8], [8, 8], [1, 0.6], [9, 11]]): 给定的数据集。
  18. k = 2: 指定要分成的簇的数量。
  19. centers, clusters = kmeans(data, k): 调用kmeans函数进行K均值聚类。
  20. 打印输出聚类中心和聚类结果。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值