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

    你可能感兴趣的文章
    oracle--用户,权限,角色的管理
    查看>>
    Oracle10g EM乱码之快速解决
    查看>>
    Oracle11G基本操作
    查看>>
    Oracle11g服务详细介绍及哪些服务是必须开启的?
    查看>>
    Oracle11g静默安装dbca,netca报错处理--直接跟换操作系统
    查看>>
    oracle12安装软件后安装数据库,然后需要自己配置监听
    查看>>
    Oracle——08PL/SQL简介,基本程序结构和语句
    查看>>
    oracle下的OVER(PARTITION BY)函数介绍
    查看>>
    Oracle中DATE数据相减问题
    查看>>
    Oracle中merge into的使用
    查看>>
    oracle中sql的case语句运用--根据不同条件去排序!
    查看>>
    oracle中关于日期问题的汇总!
    查看>>
    Oracle中常用的语句
    查看>>
    oracle典型安装失败,安装oracle 10失败
    查看>>
    oracle系统 介绍,ORACLE数据库管理系统介绍
    查看>>
    oracle零碎要点---ip地址问题,服务问题,系统默认密码问题
    查看>>
    org.apache.poi.hssf.util.Region
    查看>>
    org/hibernate/validator/internal/engine
    查看>>
    orm总结
    查看>>
    paddle的两阶段基础算法基础
    查看>>