博客
关于我
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/

    你可能感兴趣的文章
    Openlayers图文版实战,vue项目从0到1做基础配置
    查看>>
    Openlayers高级交互(10/20):绘制矩形,截取对应部分的地图并保存
    查看>>
    Openlayers高级交互(16/20):两个多边形的交集、差集、并集处理
    查看>>
    Openlayers高级交互(17/20):通过坐标显示多边形,计算出最大幅宽
    查看>>
    Openlayers高级交互(19/20): 地图上点击某处,列表中显示对应位置
    查看>>
    openlayers:圆孔相机根据卫星经度、纬度、高度、半径比例推算绘制地面的拍摄的区域
    查看>>
    OpenMCU(一):STM32F407 FreeRTOS移植
    查看>>
    OpenMMLab | S4模型详解:应对长序列建模的有效方法
    查看>>
    OpenMMLab | 【全网首发】Llama 3 微调项目实践与教程(XTuner 版)
    查看>>
    OpenMMLab | 面向多样应用需求,书生·浦语2.5开源超轻量、高性能多种参数版本
    查看>>
    OpenPPL PPQ量化(4):计算图的切分和调度 源码剖析
    查看>>
    OpenPPL PPQ量化(5):执行引擎 源码剖析
    查看>>
    Openresty框架入门详解
    查看>>
    OpenResty(2):OpenResty开发环境搭建
    查看>>
    openshift搭建Istio企业级实战
    查看>>
    Openstack 之 网络设置静态IP地址
    查看>>
    OpenStack 综合服务详解
    查看>>
    OpenStack 网络服务Neutron详解
    查看>>
    Openstack(两控制节点+四计算节点)-1
    查看>>
    Openstack企业级云计算实战第二、三期培训即将开始
    查看>>