python 实现k-means clustering均值聚类算法

k-means clustering均值聚类算法介绍

K-means 聚类算法是一种非常流行的聚类算法,它属于无监督学习范畴。该算法的目标是将 n 个数据点分成 k 个簇,使得每个簇内的数据点尽可能相似,而不同簇之间的数据点尽可能不同。K-means 聚类算法通过迭代的方式实现,具体步骤如下:

初始化:首先,随机选择 k 个数据点作为初始的簇中心(质心)。

分配:然后,对于数据集中的每一个点,计算它与每个簇中心的距离(通常使用欧氏距离),并将该点分配到距离最近的簇中。

更新:接下来,更新每个簇的簇中心。新的簇中心是该簇中所有点的均值(即计算簇中所有点的坐标的平均值)。

迭代:重复步骤 2 和步骤 3,直到满足某个停止条件(例如,簇中心不再发生变化,或者达到预设的迭代次数)。

输出结果:最终,算法输出 k 个簇,每个簇由一组数据点和簇中心表示。

优缺点

优点:

算法简单,易于实现。
计算速度快,特别是对于大数据集。
当簇的密度大致相同时,效果较好。

缺点:

需要事先指定簇的数量 k,这是一个主观的选择。
对初始簇中心的选择敏感,不同的初始簇中心可能导致不同的聚类结果。
对于非球形或大小差异很大的簇,效果可能不佳。
可能会受到噪声和异常值的影响。

应用场景

K-means 聚类算法广泛应用于各种领域,包括但不限于:

市场营销:用于客户细分,识别不同的客户群体。
图像处理:用于图像分割,将图像划分为不同的区域。
文本挖掘:用于文档聚类,将相似的文档组织在一起。
生物信息学:用于基因表达数据的分析,识别具有相似表达模式的基因。

注意事项

在使用 K-means 聚类算法之前,最好对数据进行预处理,包括归一化或标准化,以消除不同特征之间的量纲差异。
可以尝试使用不同的初始簇中心选择策略(如 K-means++),以减少对初始选择的敏感性。
可以通过评估聚类效果(如轮廓系数、Calinski-Harabasz 指数等)来选择最佳的簇数量 k。

k-means clustering均值聚类算法python实现样例

以下是一个示例的Python代码实现k-means聚类算法:

import numpy as np

def kmeans(data, k, max_iter=100):
    # 随机选择k个数据点作为初始聚类中心
    centroids = data[np.random.choice(range(len(data)), k, replace=False)]
    
    for _ in range(max_iter):
        # 分配每个数据点到最近的聚类中心
        labels = np.argmin(np.linalg.norm(data[:, np.newaxis] - centroids, axis=-1), axis=-1)
        
        # 更新聚类中心为每个聚类的均值
        new_centroids = np.array([data[labels == i].mean(axis=0) for i in range(k)])
        
        # 如果新的聚类中心与旧的聚类中心相同,停止迭代
        if np.all(centroids == new_centroids):
            break
            
        centroids = new_centroids
    
    return labels, centroids

# 测试代码
data = np.array([[1, 2], [1.5, 1.8], [5, 8], [8, 8], [1, 0.6], [9, 11]])
k = 2
labels, centroids = kmeans(data, k)
print("聚类标签:", labels)
print("聚类中心:", centroids)

在上述代码中,data是一个二维数组,每行表示一个数据点。k表示要聚类的簇数。max_iter表示最大迭代次数,默认为100次。

kmeans函数首先随机选择k个数据点作为初始聚类中心。然后进行迭代,每次迭代分为两步:

  1. 分配每个数据点到最近的聚类中心,使用np.argmin函数找到距离每个数据点最近的聚类中心的索引。
  2. 更新聚类中心为每个聚类的均值,使用data[labels == i].mean(axis=0)计算每个聚类的均值。

迭代终止的条件是新的聚类中心与旧的聚类中心相同。最后返回每个数据点的聚类标签和最终的聚类中心。

测试时,我们使用一个简单的数据集data,并设定k为2进行聚类。输出结果会显示每个数据点的聚类标签和最终的聚类中心。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

luthane

您的鼓励将是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值