博客
关于我
python机器学习之手写K-means算法
阅读量:228 次
发布时间:2019-03-01

本文共 2308 字,大约阅读时间需要 7 分钟。

K-means聚类算法实现

1. K-means算法原理

K-means是一种经典的无监督学习算法,广泛应用于数据聚类任务。其核心思想如下:

  • 初始化中心点:从数据集中随机选取K个点作为初始聚类中心。
  • 计算距离并归类:计算数据点到各个中心点的欧氏距离,将每个点归类到距离最近的中心点所在的类别中。
  • 更新中心点:计算每个类别的平均值,作为新的聚类中心。
  • 迭代优化:重复上述过程,直到中心点的变动很小或不再变化。
  • 2. 算法实现步骤

    2.1 函数定义

    import numpy as npimport pandas as pdfrom matplotlib import pyplot as pltdef distance(a, b):    """计算两点之间的欧式距离"""    return np.sqrt((a[0] - b[0])**2 + (a[1] - b[1])**2)def init_centers(k):    """初始化K个2维聚类中心点"""    return np.random.random(k*2).reshape(k, 2)def assign_cluster(point, centers):    """确定点所属的聚类"""    kclass = 0    min_distance = np.inf    for i, center in enumerate(centers):        d = distance(point, center)        if d < min_distance:            min_distance = d            kclass = i    return kclassdef update_centers(points, kclasses):    """更新聚类中心点"""    k = max(kclasses) + 1    new_centers = np.zeros((k, 2))    point_df = pd.DataFrame(points, columns=["x", "y"])    kclasses_df = pd.DataFrame(kclasses, columns=["kclass"])    points_with_class = point_df.join(kclasses_df)    for i in range(k):        mask = points_with_class["kclass"] == i        subset = points_with_class[mask]        new_centers[i] = subset[["x", "y"]].mean(axis=0)    return new_centersdef kmeans(points, k):    """执行K-means算法"""    centers = init_centers(k)    kclasses = np.zeros(len(points))        for _ in range(200):        new_centers = update_centers(points, kclasses)        if np.array_equal(kclasses, new_centers Classes):            break        centers = new_centers        kclasses = assign_cluster(points, centers)        return centers, kclasses

    2.2 算法流程

  • 初始化:调用init_centers(k)函数,随机生成K个初始中心点。
  • 归类:调用assign_cluster(point, centers)函数,计算每个点到各中心点的距离,确定其所属聚类。
  • 更新中心点:调用update_centers(points, kclasses)函数,计算每个聚类的平均值,作为新的聚类中心。
  • 迭代优化:在200次循环内,重复归类和更新中心点,直到聚类结果稳定。
  • 3. 测试结果

    # 示例数据c = np.array([    [1, 2],    [1, 1],    [2, 2],    [5, 5],    [-0.10, -2.10],    [-0.8, -1.8],    [-2.9, -0.9],    [-3.1, -2.2],    [2, 6],    [7, 10]])# 运行K-means算法a, b = kmeans(c, 2)# 绘制结果c_df = pd.DataFrame(c)plt.plot(c_df[0], c_df[1], 'or')plt.plot(a[0], a[1], 'xb')plt.show()

    4. 代码说明

    • distance函数:计算两个点之间的欧式距离。
    • init_centers函数:生成K个随机的初始中心点。
    • assign_cluster函数:确定数据点所属的聚类,基于最小欧氏距离。
    • update_centers函数:计算每个聚类的平均值,更新聚类中心。
    • kmeans函数:实现K-means算法的主函数,包含初始化、迭代优化等逻辑。

    通过上述实现,可以清晰地看到K-means算法的工作原理和实际应用,适用于各种二维数据的聚类任务。

    转载地址:http://hjpv.baihongyu.com/

    你可能感兴趣的文章
    Netty框架的服务端开发中创建EventLoopGroup对象时线程数量源码解析
    查看>>
    Netty源码—2.Reactor线程模型一
    查看>>
    Netty源码—3.Reactor线程模型三
    查看>>
    Netty源码—4.客户端接入流程一
    查看>>
    Netty源码—4.客户端接入流程二
    查看>>
    Netty源码—5.Pipeline和Handler一
    查看>>
    Netty源码—5.Pipeline和Handler二
    查看>>
    Netty源码—6.ByteBuf原理一
    查看>>
    Netty源码—6.ByteBuf原理二
    查看>>
    Netty源码—7.ByteBuf原理三
    查看>>
    Netty源码—7.ByteBuf原理四
    查看>>
    Netty源码—8.编解码原理一
    查看>>
    Netty源码—8.编解码原理二
    查看>>
    Netty源码解读
    查看>>
    Netty的Socket编程详解-搭建服务端与客户端并进行数据传输
    查看>>
    Netty相关
    查看>>
    Netty遇到TCP发送缓冲区满了 写半包操作该如何处理
    查看>>
    Netty:ChannelPipeline和ChannelHandler为什么会鬼混在一起?
    查看>>
    Netty:原理架构解析
    查看>>
    Network Dissection:Quantifying Interpretability of Deep Visual Representations(深层视觉表征的量化解释)
    查看>>